All Ingo Payments APIs use HMAC-SHA512 request signing. This is not an API-key-in-header pattern — every request must be signed using a shared secret that never leaves your server. TheDocumentation Index
Fetch the complete documentation index at: https://developers.ingopayments.com/llms.txt
Use this file to discover all available pages before exploring further.
Authorization header carries
the result of that signing process.
Your HMAC credentials are provisioned by your Ingo integration manager
at onboarding. You will receive a username and a secret. The
secret is used locally to sign requests and is never transmitted.
Credentials
| Credential | Description |
|---|---|
username | Identifies your integration in the Authorization header |
secret | Used locally to sign each request. Never transmitted. |
participant_id | Numeric identifier included in the request body |
Authorization header format
Every request must include anAuthorization header in this exact format:
| Parameter | Value |
|---|---|
username | Your Ingo-issued username |
algorithm | Always hmac-sha512 |
headers | Space-separated list of signed header names (see below) |
signature | Base64-encoded HMAC-SHA512 signature (see below) |
Building the signature — step by step
Assemble required headers
Every request must include these headers. Generate them before signing:
X-Date — Current timestamp in GMT/RFC 1123 format. Ingo allows
a clock skew of ±300 seconds. Requests outside this window are rejected
to prevent replay attacks. Use X-Date rather than Date to avoid
conflicts with HTTP libraries.Content-sha512 — Base64-encoded SHA-512 hash of the raw request
body. Ingo uses this to verify body integrity — if the hashes don’t
match, the request is rejected. Use RAW (not hex) output from your
hashing library before Base64 encoding.Content-Length — Byte length of the request body.Content-Type — Always application/json.Build the header string
The header string is a space-separated, lowercase list of the header
names you are signing, in the order they appear in the signature string.
Always begin with This exact string becomes the
request-line.headers parameter value in your
Authorization header.Build the signature string
The signature string is constructed by concatenating the values of each
item in the header string, separated by newline characters For each header — append Concatenated signature string:
\n. No
trailing newline.For request-line — append the HTTP request line:lowercased-header-name: value:Hash and encode the signature string
Sign the signature string using HMAC-SHA512 with your secret key.
Base64-encode the result.The resulting value is your
signature parameter:Full request example
Environments
| Environment | Base URL |
|---|---|
| Sandbox | https://payapi-sandbox.ingo.money |
| Production | https://payapi.ingo.money |
Common errors
| Error | Cause | Fix |
|---|---|---|
401 Unauthorized | Invalid signature | Verify secret, signature string construction, and RAW (not hex) HMAC output |
401 Clock skew | X-Date outside ±300s window | Sync your server clock with NTP |
400 Body hash mismatch | Content-sha512 doesn’t match body | Recompute hash from the exact body bytes being sent |
400 Missing header | Required header absent | Ensure X-Date, Content-sha512, Content-Length, and Content-Type are all present |
Implementation notes
- The
secretis never included in the request — only used locally to generate the signature - Include
participant_idin the request body, not in the headers - Additional headers beyond the required set may be included and signed — add them to the header string in the order they appear
- The header string order in your
Authorizationheader must exactly match the order used to build your signature string