BETA
Skip to content

Providers & signature formats

A source's provider field tells Krafter how to verify incoming signatures and where to read the event type from. Four providers are built in: stripe, github, shopify, and generic.

If a third-party isn't on this list, use generic — it covers any provider that signs HMAC-SHA256(body) and puts the result in a single header.

Stripe

json
{ "name": "Stripe", "provider": "stripe", "signing_secret": "whsec_..." }
ItemValue
Signature headerStripe-Signature
Formatt=<unix>,v1=<hex> (timestamp-prefixed HMAC-SHA256)
Signed payload<timestamp>.<raw_body>
Event type read fromJSON body, path type
Stripe Dashboard fieldEndpoint URL = https://app.krafter.dev/in/<slug>
Stripe secret to copyThe whsec_… shown after creating the endpoint

GitHub

json
{ "name": "GitHub", "provider": "github", "signing_secret": "<random>" }
ItemValue
Signature headerX-Hub-Signature-256
Formatsha256=<hex> HMAC-SHA256 of the raw body
Event type read fromheader X-GitHub-Event
GitHub settingPayload URL = https://app.krafter.dev/in/<slug>, Content type = application/json, Secret = same value as signing_secret

Shopify

json
{ "name": "Shopify", "provider": "shopify", "signing_secret": "<shop secret>" }
ItemValue
Signature headerX-Shopify-Hmac-Sha256
FormatBase64 of HMAC-SHA256(body)
Event type read fromheader X-Shopify-Topic
Shopify settingWebhook URL = https://app.krafter.dev/in/<slug>, Format = JSON

Generic

json
{
  "name": "Custom provider",
  "provider": "generic",
  "signing_secret": "<your secret>",
  "signing_algorithm": "sha256",
  "signing_header": "X-Webhook-Signature",
  "event_type_source": "body",
  "event_type_path": "event.name"
}
FieldPurpose
signing_algorithmCurrently sha256
signing_headerHeader name carrying the signature (raw hex of the HMAC, no prefix)
event_type_sourcebody or header — where Krafter reads the event type from
event_type_pathDot-path into the JSON body (when body) or header name (when header)

What "no signing secret" means

If you create a source without a signing_secret, every incoming POST is accepted and stored, but the resulting event has signature_valid: false. Such events are persisted but not fanned out to destinations — they are visible only in the dashboard / events API for inspection. This lets you wire up a provider in observe-only mode before turning on forwarding.

Built by Krafter Studio