Skip to main content
For repeat customers — monthly service, net-terms accounts, subscriptions — you don’t want every invoice to wait on someone clicking a link. A charge authorization is your customer’s permission to charge a payment method they’ve put on file. Once it’s active, you can pay their invoices directly from the API.
In the API, an invoice is a payment link — the endpoints and field names below say paymentLink. Same thing; this guide says “invoice” because that’s what your customer sees.
Before you start: You need a customer (see the Quickstart) and a webhook subscription to hear when authorizations are granted. Amounts are in cents throughout.
1

Ask the customer to authorize you

Request authorization with POST /customer/{customerId}/requestChargeAuthorization. With sendEmail: true, Nickel emails the customer a secure form where they enter their card or bank details; with false, you get the form’s url back to deliver however you like:
curl -X POST https://rest.staging.nickel.com/customer/cmr9zja1s0000sf028pvdtpsh/requestChargeAuthorization \
  -H "Authorization: Bearer $NICKEL_SANDBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sendEmail": false,
    "paymentMethodTypes": ["ACH", "CREDIT_CARD"],
    "transactionLimitCents": 500000,
    "expirationDate": "2027-07-01"
  }'
{
  "id": "cmra1chkb001usf02i34fnbbt",
  "active": false,
  "url": "https://nickel.staging.nickelpayments.com/customer/cmr9zja1s0000sf028pvdtpsh?requestId=EYTtDSxk",
  "transactionLimitInCents": 500000,
  "expiresAt": 1814400000000,
  "paymentMethod": null,
  "customerId": "cmr9zja1s0000sf028pvdtpsh"
}
The authorization starts active: false with no payment method — it activates when your customer completes the form. transactionLimitCents caps any single charge, and expirationDate (YYYY-MM-DD) sets an end date.
Watch the field names: you send transactionLimitCents, but responses return transactionLimitInCents — and expiresAt comes back as epoch milliseconds.
2

Already have a signed ACH form? Skip the wait

If the customer already signed an ACH debit authorization (a common part of net-terms paperwork), create the authorization directly — upload the signed PDF via POST /file with type=ACH_DEBIT_AUTHORIZATION_PDF, then attach it with their bank details:
curl -X POST https://rest.staging.nickel.com/customer/cmr9zja1s0000sf028pvdtpsh/uploadACHDebitAuthorizationPdf \
  -H "Authorization: Bearer $NICKEL_SANDBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "routingNumber": "101050001",
    "accountNumber": "987654321",
    "accountType": "checking",
    "fileId": "cmra1a8zi001osf02tcmt858v",
    "memo": "Monthly service autopay",
    "transactionLimitCents": 500000
  }'
{
  "id": "cmra1c0mb001ssf02t4sz8k2q",
  "active": true,
  "transactionLimitInCents": 500000,
  "expiresAt": null,
  "paymentMethod": {
    "type": "ACH",
    "achDetails": {
      "bankName": "First Bank of the United States",
      "routingNumber": "101050001",
      "accountNumberLastFour": "4321"
    },
    ...
  },
  "customerId": "cmr9zja1s0000sf028pvdtpsh"
}
No waiting — the authorization is active: true immediately, because the customer already consented on paper. Keep the signed PDF honest: it’s your proof of authorization for ACH rules.
3

Wait for the green light

When the customer completes the hosted form (or you upload a signed PDF), your webhook receives charge_authorization.authorized — here’s a real delivery:
{
  "id": "b637dc72-aed7-419e-9d9c-eb3fb0a70583",
  "created_at": "2026-07-07T02:33:55.253Z",
  "associated_object_type": "charge_authorization",
  "associated_object_id": "cmra1c0mb001ssf02t4sz8k2q",
  "category": "charge_authorization.authorized",
  "type": "event"
}
Confirm with GET /chargeAuthorization/{chargeAuthorizationId} — you’re looking for active: true and a populated paymentMethod.
4

Charge invoices

Create invoices as usual (POST /paymentLink), then pay them with POST /chargeAuthorization/pay. The request is a batch — one entry per authorization, each charging one or more invoices via the paymentLinks array:
curl -X POST https://rest.staging.nickel.com/chargeAuthorization/pay \
  -H "Authorization: Bearer $NICKEL_SANDBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "payments": [
      {
        "chargeAuthorizationId": "cmra1c0mb001ssf02t4sz8k2q",
        "paymentLinks": [{"paymentLinkId": "cmra1chnp001ysf02cumv23r7"}]
      }
    ],
    "idempotencyKey": "autopay-2026-07-06-run1"
  }'
{
  "paymentLinks": [
    {
      "id": "cmra1chnp001ysf02cumv23r7",
      "name": "INV-124",
      "status": "ACTIVE",
      "requestedAmountCents": 45000,
      "completedAmountCents": 0,
      "paymentId": "cmra1cu1h0020sf02v55com2p",
      ...
    }
  ],
  "errors": []
}
Always send an idempotencyKey (any string unique to this batch, like autopay-2026-07-06-run1). If your request times out and you retry with the same key, Nickel won’t charge the same invoices twice.
Per invoice you can add amountCents (omit it to charge the invoice’s remaining balance) and withdrawalDate (YYYY-MM-DD, today or later) to schedule the charge instead of processing immediately.Notice the response above: the ACH charge was created (paymentId is set) but the invoice still shows status: "ACTIVE" and completedAmountCents: 0 — bank debits take days to settle. Card charges settle synchronously and complete the invoice right away.
5

Handle the aftermath

The batch partially succeeds: invoices that couldn’t be charged (authorization expired, over the transaction limit, already paid) come back in errors[] with a paymentLinkId and a human-readable error, while the rest go through. Check it on every call.From here it’s the standard payment lifecycle — payment.made fires (for ACH that means initiated; the payment is PENDING until funds arrive), and you track it exactly as in Send an Invoice and Get Paid.One more event matters to autopay: charge_authorization.deleted fires if the customer (or you) revokes the authorization. Stop charging when you receive it — a quick GET to confirm active before each batch is cheap insurance.

Where to go next

Receive webhooks

The receiver that hears charge_authorization.authorized.

Refund or void a payment

When an autopay charge shouldn’t have happened.