Skip to main content

v4 Signature

v4 doesn't join individual fields together — you only need two things:

AttributeDescription
payloadThe Base64-encoded compact JSON string received in the webhook, payment callback, or checkout callback
access_secretYour access secret from Command Center. Available on your server

Base64-decode payload to get the compact JSON string exactly as Nimbbl sent it, and hash that string directly — you don't pull out or rearrange any fields first. The result is lowercase hex — compare case-insensitively, or lowercase both sides, if your language's HMAC output defaults to uppercase. For the reusable HMAC-SHA256 function in Java, C#, PHP, and Python, see Validating Payment Response with Signature.

For the full payload shapes across every event category, see Webhook Payloads.

This works the same way as the v4 payment and checkout callbacks. The only difference is the field name — the webhook puts the signature in a field called signature, not nimbbl_signature.

decoded_payload = base64_decode(payload); // exact compact JSON string, no re-serialization

generated_signature = hmac_sha256(decoded_payload, <your_access_secret>);

if (generated_signature == signature) {
payload is authentic
}

The same rule, with the signature in that same signature field (not nimbbl_signature), applies to payment link webhook events too (payment_link_created, payment_link_sent, and the rest of that event set) — see Payment Link Webhooks. This is a separate mechanism from the Payment Link Enquiry API's payment_link_signature field, which is null on a v4 sub-merchant, with no v4 version of its own.

Doesn't Apply to Transaction Enquiry

v4 doesn't apply to the Transaction Enquiry API. If your sub-merchant is configured on payment_callback_version v4, that endpoint returns null for both nimbbl_signature and signature_version — there is nothing to validate on that surface. See the v4 Signature Behavior section on the general Transaction Enquiry guide for the full explanation.