Getting started
What do I need before my first call?
An API key issued by Endl, carrying the permissions for the endpoints you intend to call. There is no sign-up endpoint and no login step — keys are issued to your partner account by Endl.Is there a sandbox?
Yes.
Every Try it button in this documentation sends to sandbox, so you can
exercise an endpoint from the page you are reading.
Which API do I need?
One key authenticates all three.
How do I get production access?
Your production base URL and credentials are issued by Endl at onboarding. Point your client at that host and use the credentials issued with it — the request and response shapes are identical to sandbox.Authentication
Do I need an API secret?
No. Authentication is a single header,API-KEY. The API-SECRET header was
removed and is no longer part of any endpoint.
My key is valid, so why am I getting a 400?
Almost always a missing permission. Endpoints are gated by quotes,
recipients, accounts, webhooks, events and onboarding, and a key
without the required one is rejected as a validation failure rather than an
authorisation failure.
What is the difference between 401 and 503?
401 means your credentials were rejected — the header is missing, the key is
unknown, or the partner is inactive. These are deliberately indistinguishable,
and retrying will never succeed.
503 DIRECTORY_UNAVAILABLE means Endl could not reach the credential store. Your
key may be perfectly valid, so retry with backoff.
Can I call the API from a browser or a mobile app?
No. The key authenticates your partner account, not an end user, so it belongs server-side only. Never ship it in client code or commit it to source control.What do I do if a key leaks?
Ask Endl to issue a replacement credential.Requests and responses
What shape are responses?
Two shapes, which is the one inconsistency worth holding in mind:
Onboarding keeps two exceptions:
429 returns the older envelope and 503
returns the errors[] form. Parse defensively — check for errors first, then
fall back to the flat fields.
Should I trust the HTTP status or the body?
Both. On the Partner and Webhooks APIs a response is only successful whenstatus is SUCCESS and errors is empty. See
Errors and the response envelope.
Why am I never getting a 429?
The Partner and Webhooks APIs never return 429. Rate limits surface as
400 VALIDATION_ERROR instead, so do not build retry logic around a 429
response. The Onboarding API is the exception — it does return 429.
How should I handle money values?
As decimal strings, never floats —"1500.00". Parse them with a decimal type.
Binary floats lose cents at scale.
How does pagination work?
Opaque, forward-only cursors. Call with noafter, read data.nextCursor, and
call again with after=<nextCursor> and the same filters until the cursor is
null. limit defaults to 25 and caps at 100.
Which failures are safe to retry?
Why did I get a 404 for a resource I know exists?
Identity is derived from your API key, and you only ever see your own resources.
Another partner’s resource returns 404, never 403, so the API never reveals
that it exists.
Onboarding
What is the difference between KYC and KYB?
KYC verifies an individual; KYB verifies a business and its beneficial owners. Step-by-step walkthroughs: Individual (KYC) and Business (KYB).What file types and sizes are accepted for documents?
JPEG, PNG or PDF, at most 2 MB per file. Content is sniffed rather than trusted from the extension. A larger file returns413.
What do the customer statuses mean?
How do I know when verification finishes?
Subscribe to thekyc.completed and kyc.rejected
webhook events, or poll
Get customer.
Why did creating a customer return 403?
Three different causes share that code — the message field distinguishes them:
- Your key lacks the
onboardingpermission - The customer belongs to another partner
- The country is restricted,
which reads
Onboarding is not permitted for this country
A create timed out with 503. Can I retry it?
Yes, with the same body. Endl reconciles rather than creating a duplicate.
Payouts
What is the sequence of calls?
- Ask which fields the destination currency requires, then add the recipient
- Generate a quote
- Create a pre-transaction to lock the quote in and receive deposit instructions
- Submit, then poll
Get transaction or subscribe to
payout.completed
Why was my recipient rejected as invalid?
Required fields vary by destination currency and rail and are not guessable — a GBP domestic payout needs different fields from a SEPA or SWIFT one. Call Get recipient required fields first and collect exactly what it returns.Which currencies, countries and rails are supported?
These catalogues change, so they are served by the API rather than listed here:
Cache the results rather than re-fetching them on every request.
Webhooks
Should I use PUSH or PULL?
SQS and SSE are reserved but not yet available — requesting either returns
422.
How do I verify a delivery came from Endl?
HMAC-SHA512 overtimestamp + "." + body, compared against
X-WEBHOOK-SIGNATURE. Three things to get right: it is SHA-512, the hex is
lowercase, and you must hash the raw received bytes — parsing and
re-serializing the JSON changes those bytes and breaks the signature. Worked
Python and Node examples are on
Verifying signatures.
I lost my signing secret. Can I retrieve it?
No. It is returned once, when the subscription is created. The only way to get a working secret again is to rotate it.What happens if my endpoint is down?
Endl retries, and every attempt is recorded. A delivery ends asDELIVERED,
FAILED, EXPIRED or CANCELLED; only FAILED and EXPIRED can be
retried. Inspect what happened with
List deliveries, which includes the response your
endpoint returned.
Why is my subscription SUSPENDED?
Endl suspends a subscription after repeated delivery failures. You cannot set
that status yourself. PAUSED, which you control, holds events rather than
dropping them — they drain when you resume.
How many subscriptions can I have?
Five active per partner by default.target is limited to 512 characters.
Will you send event types I do not recognise?
Yes. Endl manages the catalogue and adds types over time, so handle an unrecognisedeventType gracefully rather than rejecting it — otherwise a new
event type becomes an outage in your receiver. Subscribing with a glob such as
payout.* picks up related types automatically.
Are PULL feed responses signed?
No. You are reading from Endl over an authenticated connection, so there is nothing to verify. Signatures exist because PUSH arrives unsolicited.Why does a delivery use an idempotency key?
Retries mean your endpoint can legitimately receive the same event more than once. UseX-WEBHOOK-EVENT-ID to deduplicate.