Versioned paths
All client endpoints begin with/v1.
Dates and times
Date parameters useYYYY-MM-DD. Transaction endpoints accept from and to independently, and each supplied bound is inclusive.
Money
Monetary values are integer cents in USD. For example,amount_cents: 12500 represents 12,500 USD cents. Treat a nullable amount as unknown, not zero.
Organization scoping
Your API key defines an organization allowlist. Each access token minted from it carries that same scope. Endpoints that acceptorganization_id support two modes:
- Omit it to query every organization in the token’s allowlist.
- Include it to query one organization. An ID outside the allowlist returns
403.
API permissions
Your API key also carries explicit API permissions. Read and write are independent. A write scope does not imply the matching read scope, and a read scope does not imply the matching write scope. The public client portal requires at least one API permission when you create a key. API permissions are fixed at key creation. You cannot edit them later. To change them, create a replacement key with the permissions you need, update your integration to use it, confirm traffic succeeds, and then revoke the old key. Legacy or manual zero-permission keys are different. If one still has a valid organization allowlist, it can exchange for an access token, but resource endpoints reject it with403 insufficient_scope.
Rate limits
The API applies two distributed limits:
Rate-limited responses include:
RateLimit-Limit: sustained requests allowed per minuteRateLimit-Remaining: capacity remaining in the current bucketRateLimit-Reset: seconds until the bucket has room for another request
Retry-After and returns:
bucket is api or token, so you can distinguish account-data traffic from token-exchange traffic.
Back off using Retry-After
Do not guess a fixed delay. Read the server-provided value:
RateLimit-Remaining so you can pace requests before a 429.
Error shape
Application errors use a JSONdetail.error_code envelope:
If you receive
403 insufficient_scope, mint a token from a replacement API key with the required scopes. If you receive 403 organization_out_of_scope, use an organization already in the key’s allowlist or create a replacement key with the correct organizations.
List responses and pagination
List endpoints returnitems and a page object:
next_cursor into the next request:
The API does not support offset pagination.
Write requests
- Send JSON bodies with
Content-Type: application/json. PATCHis partial. Omitted fields keep their current values.- Payment-method deletion and autopay cancellation are soft and idempotent.
- Cancelled autopay schedules cannot be reactivated.
Card capture requests
POST /v1/payment-methods/cards uses Idempotency-Key to make create-card retries safe. Reuse the same key only for the same request body. A completed replay returns the stored 201 response. A conflicting body or in-flight retry returns 409.
For card capture, you can omit both billing-address fields to use the selected borrower’s current billing address. You can also send billing_address_id for a saved address or billing_address for a transient one. Send at most one of the two fields.