Skip to main content
Use this flow when your organization takes a payment itself (cash at the counter, a check, a money order, or a card run on your own terminal) and you need it applied to the borrower’s account. Monterey does not move any money. You tell us what you collected, and we post it to the account.
These endpoints record payments you already collected. To charge a borrower’s stored payment method, use the payment-method endpoints instead.

Before you call

  • An API key that can mint an access token
  • The external_payments:write scope to record and reverse payments
  • The external_payments:read scope to read them back
  • curl and jq

Choose the payment method

Send check_number only for the check-type methods, and card_brand only for card. Any other combination returns 422.

Record a payment

Every request needs an Idempotency-Key. Use a new key for each payment you record, and reuse the same key only when you retry that same request.
The endpoint reference lists every request field and its limits. Two behaviors it can’t show:
  • Send an external_reference (your receipt or POS number) on every payment. It lets you find the payment again and blocks an accidental duplicate. See Use external_reference as a second guard below.
  • Payments always post as of the servicing system’s current business day, so the request has no effective date field. The effective_date in the response tells you which day was used.
A successful response looks like this:

Read the result

A key without external_payments:write gets 403 insufficient_scope on every write.

Retry safely

Retrying with the same Idempotency-Key and the same body returns the original response. It never records the payment a second time, even after the original succeeded.
  • The same key with a different body returns 409 idempotency_conflict.
  • A retry while we still can’t confirm the outcome of the original returns 409 idempotency_in_progress. Keep polling GET /v1/payments/{payment_id}, or contact Monterey. Don’t switch to a new key: a new key is a new payment.

Use external_reference as a second guard

Each external_reference identifies at most one payment per organization. If you send a reference that one of your payments already holds, Monterey returns 409 duplicate_external_reference with that payment’s payment_id and records nothing:
This protects you even if a retry goes out under a new Idempotency-Key. A payment that definitely failed (422 omega_rejected, or 503) doesn’t hold its reference, so you can correct the request and retry under the same reference.

Reverse a payment

You can reverse only payments your organization recorded through this API. Payments from any other source return 404.
Set is_nsf to true when the reversal is for non-sufficient funds. reason is required, up to 200 characters. Reversal requests follow the same Idempotency-Key rules as posting.

Find a payment by your reference

If you lost the payment_id (for example, your system stopped before saving our response), look the payment up by the external_reference you sent:
The response is a page of your organization’s payments with that reference, newest first, paginated with cursor and limit. At most one of them holds the reference: the payment that posted, is pending, or was reversed. Any others are earlier attempts that definitely failed. To reverse the payment, take its payment_id and call the reversal endpoint. Reading payments needs the external_payments:read scope. A tampered or expired cursor returns 400 invalid_cursor.

List your recorded payments

GET /v1/accounts/{account_id}/payments returns only the payments your organization recorded through this API, newest first, paginated with cursor and limit. To see every transaction on the account, including payments from other sources, use the transactions endpoints.