High Wire Payments

Make your first payment

Charge a test card on staging, read the payment back, and refund it, in three calls.

You need staging credentials (see Authentication) and a test card number. Staging processes test cards only; High Wire gives you the numbers for your account at onboarding. The examples use a common test number. Use test cards only, and never paste real card data into a shell, a log or a ticket.

1. Charge the card

The simplest flow is auth-and-capture: authorize and capture the funds in one call. Send an Idempotency-Key so a retry can never charge twice.

curl -X POST https://api-payments-staging.highwirepayments.com/v1/payments/auth-and-capture \
  -u "YOUR_API_KEY:YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0193c2e9-4f9a-7c2f-9c83-1b2b3c4d5e6f" \
  -d '{
    "amount": 7200,
    "cardNumber": "5555555555554444",
    "cardExpiration": "1133",
    "cardCvv": "456",
    "cardholderName": "Jordan Example",
    "cardholderEmail": "jordan@example.com",
    "cardholderPhone": "+14155550101",
    "cardholderBillingAddress": "100 Example Street",
    "cardholderBillingZipcode": "94105",
    "cardholderBillingCity": "Springfield",
    "cardholderBillingState": "CA"
  }'

201 Created:

{
  "paymentId": "01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b",
  "status": "CAPTURED",
  "amount": 7200,
  "cardNumber": "555555xxxxxxxx4444",
  "cardExpiration": "1133",
  "cardholderName": "Jordan Example"
}

Store paymentId. status: "CAPTURED" means the money moved. A 400 with status: "DECLINED" and a declinedReason is a decline; a 400 with fieldErrors is a validation error. Both are explained in Errors and conventions.

2. Read the payment back

curl https://api-payments-staging.highwirepayments.com/v1/payments/01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b \
  -u "YOUR_API_KEY:YOUR_SECRET"

200 OK (abridged):

{
  "id": "01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b",
  "object": "payment",
  "status": "CAPTURED",
  "currency": "usd",
  "amount": 7200,
  "paymentMethodType": "CARD",
  "paymentMethodDetails": { "brand": "mastercard", "bin": "555555", "last4": "4444", "expirationMonth": 11, "expirationYear": 2033 },
  "transactions": [
    { "id": "0192a6b3-2c1d-7e4f-8a9b-3c4d5e6f7a8b", "object": "transaction", "type": "AUTH_AND_CAPTURE", "status": "SUCCEEDED", "amount": 7200, "createdAt": "2026-10-19T14:05:00.000Z", "updatedAt": "2026-10-19T14:05:01.000Z" }
  ],
  "amounts": { "requested": 7200, "authorized": 7200, "captured": 7200, "voided": null, "refunded": null },
  "createdAt": "2026-10-19T14:05:00.000Z",
  "authorizedAt": "2026-10-19T14:05:01.000Z",
  "capturedAt": "2026-10-19T14:05:01.000Z",
  "voidedAt": null,
  "updatedAt": "2026-10-19T14:05:01.000Z"
}

This read is the source of truth for a payment's state. See Payment lifecycle for every field and status.

3. Refund it

curl -X POST https://api-payments-staging.highwirepayments.com/v1/payments/01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b/refund \
  -u "YOUR_API_KEY:YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0193c30a-1f2e-7b6c-8d9a-0e1f2a3b4c5d" \
  -d '{ "amount": 500, "reason": "customer request" }'

201 Created:

{
  "refundId": "01928e55-3c4d-7c8e-8b1a-fedcba987654",
  "paymentId": "01928e3e-7b6c-7c8e-9b3a-5b9f8b9b9b9b",
  "status": "SUCCEEDED",
  "amount": 500,
  "remainingRefundableAmount": 6700,
  "cardNumber": "555555xxxxxxxx4444"
}

Omit amount to refund the remaining balance in full. Reading the payment again now shows status: "PARTIALLY_REFUNDED" and the refund at the top of transactions.

Where to go next

On this page