Airtable · event: notification ping ·
content type: application/json
This is a representative sample — fake IDs, real structure. To see a payload with your data, point the provider at a capture URL (button below).
One click creates a free capture bin with this exact payload already in it — pretty-printed, headers inspectable, replayable to your own endpoint:
Then paste the bin's URL into Airtable's webhook settings to capture a real delivery. No signup.
content-type: application/json x-airtable-content-mac: hmac-sha256=940df7ad3c6d6f2223dae742c495805a02fd3cc6b6153ed81f492384335996c3
{
"base": {
"id": "app3KtKzLJhSkQizy"
},
"webhook": {
"id": "achw8VQuvvHLKJez7"
},
"timestamp": "2026-08-30T09:41:27.123Z"
}
notificationUrl only says
"something changed in base app… for webhook ach…". You then
call the list webhook payloads API (a separate, authenticated request) to
fetch the actual changes. Handlers that try to parse record data out of the ping body
find three fields and nothing else.X-Airtable-Content-MAC = hmac-sha256= + hex HMAC-SHA256 of
the raw ping body, keyed with the base64-decoded
macSecretBase64 from the create-webhook response (here
Jc4Kc0PqbtnU0ILH+eGCSC8UZ9mQ7G0N4Ck1cnDoR+g=). Two classic bugs: keying
the HMAC with the base64 string without decoding it first, and dropping the
hmac-sha256= prefix. Try it in the
signature debugger (Airtable provider), or set
scheme "Airtable ping" + that secret on a capture bin for live ✓/✗ badges. The secret
is returned exactly once at creation — there is no API to retrieve it
later.cursor you advance
tells Airtable what you've consumed.Reproduce this delivery against any endpoint (your handler, a bin, staging):
$ curl -X POST https://your-endpoint.example/hook \
-H 'content-type: application/json' \
-H 'x-airtable-content-mac: hmac-sha256=940df7ad3c6d6f2223dae742c495805a02fd3cc6b6153ed81f492384335996c3' \
-d '{
"base": {
"id": "app3KtKzLJhSkQizy"
},
"webhook": {
"id": "achw8VQuvvHLKJez7"
},
"timestamp": "2026-08-30T09:41:27.123Z"
}'