Skip to content

docs/ Quickstart

Send your first webhook in five minutes.

Install an SDK, create an endpoint, send a signed event and verify it on the other side. Everything here works with a free test key.

Updated
Oct 8, 2026
API version
2026-09-01
Time
about 5 min

Language

Step 01

Install an SDK

Forge has official SDKs for eight languages; this guide uses Node.js, Python and Go, or plain curl. Pick a language once with the tabs: every example on this page switches with it, and we remember your choice for next time.

# Nothing to install. Any curl from the last five years works.
curl --version

Other languages and tools are on the SDKs page.

Step 02

Authenticate

Create a key on the sign-up page and export it. Test keys start with fk_test_ and live keys with fk_live_; the two never see each other’s data.

Terminal
export FORGE_KEY="fk_test_4eC39HqLyjWDarjtT1zdp7dc"
curl https://api.forge.example/v1/ping \
  -H "Authorization: Bearer $FORGE_KEY"

Step 03

Create an endpoint

An endpoint is a URL that receives events, usually owned by one of your customers. Subscribe it to event types with wildcards. Each endpoint gets its own signing secret, returned once.

curl https://api.forge.example/v1/endpoints \
  -H "Authorization: Bearer $FORGE_KEY" \
  -d '{
    "tenant": "acme-co",
    "url": "https://hooks.acme.example/forge",
    "filter_types": ["invoice.*"]
  }'
Response · 201 Created
{
  "id": "ep_7Hc2Qm",
  "object": "endpoint",
  "tenant": "acme-co",
  "url": "https://hooks.acme.example/forge",
  "filter_types": ["invoice.*"],
  "secret": "whsec_MfKQ9r8GkjVsXmNn2pRq",
  "status": "enabled"
}

Step 04

Send an event

Send each event once, with the tenant it belongs to. Forge answers 202 as soon as the event is stored in three zones, then delivers it to every matching endpoint. Pass an idempotency key so a retry on your side can never send it twice.

curl https://api.forge.example/v1/events \
  -H "Authorization: Bearer $FORGE_KEY" \
  -H "Idempotency-Key: ord_8812-paid" \
  -d '{
    "type": "invoice.paid",
    "tenant": "acme-co",
    "data": { "invoice_id": "in_8812", "amount": 4900 }
  }'

Step 05

Verify signatures

On the receiving side, check every request before trusting it. The signature covers the message id, timestamp and the raw body, so verify before your framework parses JSON. Requests older than five minutes are rejected to stop replays.

# Manual check with openssl: sign "{id}.{timestamp}.{body}" with the endpoint secret
signed="$FORGE_ID.$FORGE_TIMESTAMP.$BODY"
echo -n "$signed" | openssl dgst -sha256 -hmac "$SECRET" -binary | base64
# Compare with the value after "v1," in the forge-signature header

Step 06

Test locally

The Forge CLI opens a tunnel to your machine and forwards test events to a local port, so you can develop without deploying. Trigger sample events from a second terminal.

Terminal 1
brew install forgehq/tap/forge
forge login
forge listen --forward localhost:3000/webhooks
Terminal 2
forge trigger invoice.paid --tenant acme-co

Next steps