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.
Product-specific requirements
The signing process is identical across all products. The table below summarizes any additional requirements per product.Banking Platform — API key
The Banking Platform requires an additional API key on every request alongside the HMAC signature. Both layers are enforced — a valid API key alone will not work without a valid signature. Pass the API key as a request header (preferred):Credentials
Credential scope
Your HMAC credential is authorized for a specific set ofparticipant_id values. A signed request is accepted only if the credential presented is authorized for the participant_id in that request — a valid signature for a participant you are not authorized for is rejected with HTTP 401.
If your integration transacts for more than one participant, confirm with your Ingo integration manager that every credential-to-participant pair you use is provisioned before you go live.
Authorization header format
Every request must include anAuthorization header in this exact format:
Building the signature — step by step
1
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.2
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.3
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:4
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:5
Assemble the Authorization header
Combine all parameters into the
Authorization header:Full request example
Environments
Use sandbox credentials for all development and testing. Production credentials are issued after sandbox certification is complete.
Common errors
HTTP
401 and Ingo status code 401 are not the same failure. Everything in the table above is HTTP-level: the request was rejected before it reached transaction processing, and the response carries no Ingo status code. A 401 in the response.status field of an HTTP 200 reply means the opposite — your request authenticated successfully and was then rejected for its contents. See Status Codes.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