### Node.js: Set up and run the Hookdeck inbound quickstart Source: https://hookdeck.com/docs/use-cases/asynchronous-apis/quickstart.md Sets up and runs the Node.js inbound quickstart. The first block clones the TypeScript starter and installs dependencies; the second starts the dev server; the third shows the expected output, including the server URL http://localhost:3030. ```bash npx degit hookdeck/quickstarts/typescript/inbound hookdeck-inbound cd hookdeck-inbound npm i ``` ```bash npm run dev ``` ```bash > inbound@1.0.0 dev > nodemon index.ts [nodemon] 3.0.1 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: ts,json [nodemon] starting `ts-node index.ts` 🪝 Server running at http://localhost:3030 ``` -------------------------------- ### Install the Go SDK (go get) Source: https://hookdeck.com/docs/outpost/quickstarts/hookdeck-outpost-go.md Install the Outpost Go SDK using `go get github.com/hookdeck/outpost/sdks/outpost-go`. ```sh go get github.com/hookdeck/outpost/sdks/outpost-go ``` -------------------------------- ### Python: Set up and run the Hookdeck inbound quickstart Source: https://hookdeck.com/docs/use-cases/asynchronous-apis/quickstart.md Sets up and runs the Python (Flask) inbound quickstart. The first block clones the repository and enters the python/inbound directory; the second creates and activates a virtualenv and installs dependencies; the third runs the app; the fourth shows the expected Flask development server output, including the URL http://127.0.0.1:5000 and a warning that it is a development server. ```bash git clone https://github.com/hookdeck/quickstarts.git cd quickstarts/python/inbound ``` ```bash virtualenv venv source venv/bin/activate pip install -r requirements.txt ``` ```bash python app.py ``` ```bash python app.py * Serving Flask app 'app' * Debug mode: on INFO:werkzeug:WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 INFO:werkzeug:Press CTRL+C to quit INFO:werkzeug: * Restarting with stat WARNING:werkzeug: * Debugger is active! INFO:werkzeug: * Debugger PIN: 530-477-256 ``` -------------------------------- ### Install Outpost API SDKs (TypeScript, Python, Go) Source: https://hookdeck.com/docs/outpost/api.md Install the official Outpost API SDK for TypeScript, Python, or Go. Each command targets the package for the corresponding language: npm for TypeScript, pip for Python, and go get for Go. ```bash npm install @hookdeck/outpost-sdk ``` ```bash pip install outpost-sdk ``` ```bash go get github.com/hookdeck/outpost/sdks/outpost-go ``` -------------------------------- ### hookdeck ci example with listen output Source: https://hookdeck.com/docs/cli.md Authenticates with the HOOKDECK_API_KEY environment variable and then starts forwarding events. The output shows the CLI configuration confirmation and the live event forwarding dashboard with a successful event. ```bash $ hookdeck ci --api-key $HOOKDECK_API_KEY Done! The Hookdeck CLI is configured in project MyProject $ hookdeck listen 3000 shopify orders ●── HOOKDECK CLI ──● Listening on 1 source • 1 connection • [i] Collapse Shopify Source │ Requests to → https://hkdk.events/src_DAFWyyZXFdZrKTOpuHnOH └─ Forwards to → http://localhost:3000/webhooks/shopify/orders (Orders Service) 💡 View dashboard to inspect, retry & bookmark events: https://dashboard.hookdeck.com/events/cli?team_id=... Events • [↑↓] Navigate ────────────────────────────────────────────────────────── > 2025-10-12 14:42:55 [200] POST http://localhost:3000/webhooks/shopify/orders (34ms) → https://dashboard.hookdeck.com/events/evt_... ─────────────────────────────────────────────────────────────────────────────── > ✓ Last event succeeded with status 200 | [r] Retry • [o] Open in dashboard • [d] Show data ``` -------------------------------- ### Install Hookdeck CLI on Windows with Scoop Source: https://hookdeck.com/docs/cli.md Install the Hookdeck CLI on Windows using Scoop. First adds the Hookdeck bucket, then installs the hookdeck package. ```bash $ scoop bucket add hookdeck https://github.com/hookdeck/scoop-hookdeck-cli.git $ scoop install hookdeck ``` -------------------------------- ### Install Outpost via Helm Source: https://hookdeck.com/docs/outpost/self-hosting/quickstarts/kubernetes.md Installs Outpost via Helm using the chart and configuration file. ```sh helm install outpost ../../deployments/kubernetes/charts/outpost -f outpost.yaml ``` -------------------------------- ### Go: Set up and run the Hookdeck inbound quickstart Source: https://hookdeck.com/docs/use-cases/asynchronous-apis/quickstart.md Sets up and runs the Go (Gin) inbound quickstart. The first block clones the repository and enters the go/inbound directory; the second runs the app; the third shows the expected Gin debug output, including the server URL http://localhost:3030 and warnings about debug mode and trusting all proxies. ```bash git clone https://github.com/hookdeck/quickstarts.git cd quickstarts/go/inbound ``` ```bash go run . ``` ```bash go run . [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] POST /*path --> main.main.func1 (3 handlers) 🪝 Server running at http://localhost:3030[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details. [GIN-debug] Listening and serving HTTP on :3030 ``` -------------------------------- ### Install dependencies with setup-dependencies.sh Source: https://hookdeck.com/docs/outpost/self-hosting/quickstarts/kubernetes.md Installs Redis, PostgreSQL, and RabbitMQ dependencies using the provided setup script. ```sh cd outpost/examples/kubernetes ./setup-dependencies.sh ``` -------------------------------- ### Run Outpost Go quickstart: main.go and go run . Source: https://hookdeck.com/docs/outpost/quickstarts/hookdeck-outpost-go.md The Go program configures the Outpost client with an API key, upserts a tenant, creates a webhook destination for a topic, publishes one event, and prints the destination and event ids. It requires the OUTPOST_API_KEY and OUTPOST_TEST_WEBHOOK_URL environment variables; the topic must match a configured dashboard topic. Publish is asynchronous and returns an event id without guaranteeing delivery. ```go package main import ( "context" "fmt" "log" "os" outpostgo "github.com/hookdeck/outpost/sdks/outpost-go" "github.com/hookdeck/outpost/sdks/outpost-go/models/components" ) func main() { ctx := context.Background() // // --- 1. Authenticated client (API key from Settings → Secrets) --- // apiKey := os.Getenv("OUTPOST_API_KEY") if apiKey == "" { log.Fatal("Set OUTPOST_API_KEY") } opts := []outpostgo.SDKOption{outpostgo.WithSecurity(apiKey)} if base := os.Getenv("OUTPOST_API_BASE_URL"); base != "" { opts = append(opts, outpostgo.WithServerURL(base)) } s := outpostgo.New(opts...) // // --- 2. Tenant id, topic name, and webhook URL (from env) --- // // tenantID = one of your customers in Outpost. // topic = must match a topic configured in the dashboard. // tenantID := "customer_acme_001" topic := "user.created" webhookURL := os.Getenv("OUTPOST_TEST_WEBHOOK_URL") if webhookURL == "" { log.Fatal("Set OUTPOST_TEST_WEBHOOK_URL (e.g. a Hookdeck Console Source URL)") } // // --- 3. Create or update the tenant --- // if _, err := s.Tenants.Upsert(ctx, tenantID, nil); err != nil { log.Fatal(err) } // // --- 4. Webhook destination: events on `topic` are POSTed to this URL --- // destBody := components.CreateDestinationCreateWebhook( components.DestinationCreateWebhook{ Topics: components.CreateTopicsArrayOfStr([]string{topic}), Config: components.WebhookConfig{URL: webhookURL}, }, ) createRes, err := s.Destinations.Create(ctx, tenantID, destBody) if err != nil { log.Fatal(err) } if createRes != nil && createRes.GetDestinationWebhook() != nil { fmt.Println("Destination id:", createRes.GetDestinationWebhook().GetID()) } // // --- 5. Publish one event --- // pubRes, err := s.Publish(ctx, components.PublishRequest{ TenantID: outpostgo.String(tenantID), Topic: outpostgo.String(topic), EligibleForRetry: outpostgo.Bool(true), Metadata: map[string]string{"source": "quickstart"}, Data: map[string]any{"user_id": "user_123"}, }) if err != nil { log.Fatal(err) } if pubRes != nil && pubRes.GetPublishResponse() != nil { fmt.Println("Published event id:", pubRes.GetPublishResponse().GetID()) } } ``` ```sh go run . ``` -------------------------------- ### GET Destinations response Source: https://hookdeck.com/docs/guides/how-to-protect-server-from-crashing-caused-webhook-spikes.md Example response from the GET Destinations request. Shows two Destinations with their IDs, URLs, and rate limit fields (rate_limit and rate_limit_period). ```json { "pagination": { "order_by": "created_at", "dir": "desc", "limit": 100 }, "count": 2, "models": [ { "id": "des_TuDSSsdjKFueq8FZpcLIhOT3", "team_id": "tm_1O1QDAFf4fNlCd2jYZoLyNSU", "url": "https://mock.hookdeck.com/soldout", "disabled_at": null, "updated_at": "2021-08-04T23:22:16.695Z", "created_at": "2021-08-04T23:22:16.694Z", "rate_limit": null, "rate_limit_period": "second", "path": "/soldout", "path_forwarding_disabled": false, "name": "sold-out" }, { "id": "des_uym0ICG4Dehk8ERurcGHzI8O", "team_id": "tm_1O1QDAFf4fNlCd2jYZoLyNSU", "url": "https://mock.hookdeck.com/ordercreate", "disabled_at": null, "updated_at": "2021-11-10T02:08:00.739Z", "created_at": "2021-08-04T23:21:31.823Z", "rate_limit": null, "rate_limit_period": "second", "path": "/ordercreate", "path_forwarding_disabled": false, "name": "order-create" } ] } ``` -------------------------------- ### Create and run the Outpost quickstart script (outpost_quickstart.py) Source: https://hookdeck.com/docs/outpost/quickstarts/hookdeck-outpost-python.md Save as outpost_quickstart.py. Creates an authenticated client, upserts a tenant, creates a webhook destination subscribed to the topic, publishes one test event, and prints the event id. Requires OUTPOST_API_KEY and OUTPOST_TEST_WEBHOOK_URL environment variables; publish is asynchronous (HTTP 202) and returns an event id without guaranteeing delivery. ```python import os from outpost_sdk import Outpost # # --- 1. Authenticated client (API key from Settings → Secrets) --- # api_key = os.environ.get("OUTPOST_API_KEY") if not api_key: raise SystemExit("Set OUTPOST_API_KEY") base_url = os.environ.get("OUTPOST_API_BASE_URL") client = Outpost(api_key=api_key, server_url=base_url) # # --- 2. Tenant id, topic name, and webhook URL (from env) --- # # tenant_id = one of your customers in Outpost. # topic = must match a topic configured in the dashboard. # tenant_id = "customer_acme_001" topic = "user.created" webhook_url = os.environ.get("OUTPOST_TEST_WEBHOOK_URL") if not webhook_url: raise SystemExit( "Set OUTPOST_TEST_WEBHOOK_URL (e.g. a Hookdeck Console Source URL)" ) # # --- 3. Create or update the tenant --- # client.tenants.upsert(tenant_id=tenant_id) # # --- 4. Webhook destination: events on `topic` are POSTed to this URL --- # client.destinations.create( tenant_id=tenant_id, body={ "type": "webhook", "topics": [topic], "config": {"url": webhook_url}, }, ) # # --- 5. Publish one event --- # published = client.publish( request={ "tenant_id": tenant_id, "topic": topic, "eligible_for_retry": True, "metadata": {"source": "quickstart"}, "data": {"user_id": "user_123"}, } ) print("Published event id:", published.id) ``` -------------------------------- ### GET /2026-09-01/issue-triggers response example Source: https://hookdeck.com/docs/issue-triggers.md Example JSON response from the API endpoint for listing issue triggers. Shows pagination metadata and a backpressure trigger with a delay of 600000ms and all destinations. ```json { "pagination": { "order_by": "created_at", "dir": "desc", "limit": 100 }, "count": 1, "models": [ { "id": "it_O9Um6FAQMQvxiP", "team_id": "tm_lbhzBKgFOUnB", "name": null, "type": "backpressure", "configs": { "delay": 600000, "destinations": "*" }, "disabled_at": null, "updated_at": "2026-01-14T13:35:52.746Z", "created_at": "2026-01-14T13:35:52.806Z", "channels": { "email": {} } } ] } ``` -------------------------------- ### GET /2026-09-01/bulk/requests/replay/plan Source: https://hookdeck.com/docs/requests.md Previews how many requests a bulk replay would affect before starting it. ```APIDOC ## GET /2026-09-01/bulk/requests/replay/plan ### Description Previews how many requests a bulk replay would affect before starting it. ### Method GET ### Endpoint /2026-09-01/bulk/requests/replay/plan ### Parameters No parameters are documented in the source. ### Request Example No request example is provided in the source. ### Response No response body is documented in the source. ``` -------------------------------- ### GET /2026-09-01/events - Response example (JSON) Source: https://hookdeck.com/docs/events.md Example response from the Hookdeck API for listing events. Shows pagination metadata and an event object with fields like id, status, attempts, and timestamps. ```json { "pagination": { "order_by": "created_at", "dir": "desc", "limit": 100 }, "count": 1, "models": [ { "id": "evt_EKbUbpGzNMIdfqnXzA", "team_id": "tm_lbhzBKgFOUnB", "webhook_id": "web_FMKlTwAoGFRu", "source_id": "src_qa5626p6y5o79b", "destination_id": "des_TU9ioCk5EHUU", "attempts": 2, "response_status": 200, "last_attempt_at": "2026-01-14T13:36:31.820Z", "next_attempt_at": null, "successful_at": "2026-01-14T13:36:06.675Z", "updated_at": "2026-01-14T13:36:32.172Z", "created_at": "2026-01-14T13:36:06.415Z", "status": "SUCCESSFUL", "event_data_id": "edt_zjQsVjdTqSMI0cNIPPXE", "cli_id": null, "request_id": "req_fpSzYE7G0Op42UkKvFOB", "error_code": null } ] } ``` -------------------------------- ### Run the quickstart script with python outpost_quickstart.py Source: https://hookdeck.com/docs/outpost/quickstarts/hookdeck-outpost-python.md Run the quickstart script after saving it as outpost_quickstart.py. The script prints the published event id; delivery continues in the background. ```sh python outpost_quickstart.py ``` -------------------------------- ### List issues with GET /2026-09-01/issues Source: https://hookdeck.com/docs/issues.md Use the GET /2026-09-01/issues endpoint to list issues. The response example shows a single delivery issue with status OPENED, including aggregation keys and the full attempt body with received data and headers. ```http GET /2026-09-01/issues ``` ```json { "pagination": { "order_by": "created_at", "dir": "desc", "limit": 100 }, "count": 1, "models": [ { "id": "iss_nLxlgkpe2GpkcSTtMt", "team_id": "tm_lbhzBKgFOUnB", "type": "delivery", "status": "OPENED", "aggregation_keys": { "error_code": [], "webhook_id": [ "web_nOYiSWuNW8EF" ], "response_status": [ 500 ] }, "reference": { "event_id": "evt_eNycCNgd99CGUBflic", "attempt_id": "atm_TgM9dDa4KzwKPmnnzuXA", "attempt_body": { "message": "The Mock API returns the request data with a HTTP 500 code", "next_step": "Convinced? Update your destination with your own server HTTP URL.", "received_data": { "body": { "body": { "type": "order.created", "total": 99.99, "customer": { "id": "cust_123", "email": "customer@example.com" }, "timestamp": "2026-01-14T13:35:55.335Z" }, "headers": { "content-type": "application/json" } }, "query": { "status": "500" }, "method": "POST", "headers": { "via": "1.1 google", "host": "mock.hookdeck.com", "accept": "application/json, text/plain, */*", "connection": "Keep-Alive", "user-agent": "axios/1.11.0", "content-type": "application/json", "content-length": "192", "accept-encoding": "gzip, compress, deflate, br", "idempotency-key": "evt_eNycCNgd99CGUBflic", "x-forwarded-for": "24.222.229.208, 34.36.135.20", "x-forwarded-proto": "https", "x-hookdeck-eventid": "evt_eNycCNgd99CGUBflic", "x-hookdeck-verified": "false", "x-hookdeck-event-url": "http://localhost:3000/events/evt_eNycCNgd99CGUBflic", "x-hookdeck-requestid": "req_eLU3Rb3wyAfHpbRgrDIW", "x-hookdeck-signature": "z73yK7iH8/YjGgA6ozLojgTk7/AxJZHy4hOVOQhMujs=", "x-cloud-trace-context": "7b79cbbeb30598a3646e743a2cf61f55/10630529597864032755", "x-hookdeck-original-ip": "::1", "x-hookdeck-source-name": "example", "x-hookdeck-attempt-count": "1", "x-hookdeck-attempt-trigger": "INITIAL", "x-hookdeck-connection-name": "", "x-hookdeck-destination-name": "mock-api-failure", "x-hookdeck-will-retry-after": "" } }, "requested_path": "/" } }, "last_updated_by": null, "merged_with": null, "first_seen_at": "2026-01-14T13:35:55.736Z", "last_seen_at": "2026-01-14T13:35:55.736Z", "dismissed_at": null, "opened_at": "2026-01-14T13:35:55.736Z", "updated_at": "2026-01-14T13:35:55.737Z", "created_at": "2026-01-14T13:35:55.737Z", "issue_trigger_id": "it_XsLswYZ6nLMdze", "auto_resolved_at": null } ] } ``` -------------------------------- ### Create and run the Outpost TypeScript quickstart script Source: https://hookdeck.com/docs/outpost/quickstarts/hookdeck-outpost-typescript.md Save as `outpost-quickstart.ts`. Builds an authenticated Outpost SDK client, upserts a tenant, creates a webhook destination subscribed to `user.created`, publishes one test event, and prints the event id. Requires `OUTPOST_API_KEY` and `OUTPOST_TEST_WEBHOOK_URL` environment variables; `OUTPOST_API_BASE_URL` is optional. Publish is asynchronous (HTTP 202): a successful call only means the event was accepted, not that it is visible or delivered. Run with `npx tsx outpost-quickstart.ts`. To subscribe to all topics, pass `topics: ["*"]` instead of `[topic]`. ```typescript import { Outpost } from "@hookdeck/outpost-sdk"; // // --- 1. Authenticated client (API key from Settings → Secrets) --- // const apiKey = process.env.OUTPOST_API_KEY; if (!apiKey) { throw new Error("Set OUTPOST_API_KEY"); } const outpost = new Outpost({ apiKey, ...(process.env.OUTPOST_API_BASE_URL ? { serverURL: process.env.OUTPOST_API_BASE_URL } : {}), }); // // --- 2. Tenant id, topic name, and webhook URL (from env) --- // // tenantId = one of your customers in Outpost. // topic = must match a topic configured in the dashboard. // const tenantId = "customer_acme_001"; const topic = "user.created"; const webhookUrl = process.env.OUTPOST_TEST_WEBHOOK_URL; if (!webhookUrl) { throw new Error( "Set OUTPOST_TEST_WEBHOOK_URL to an HTTPS endpoint (e.g. a Hookdeck Console Source URL)", ); } // // --- 3. Create or update the tenant --- // await outpost.tenants.upsert(tenantId); // // --- 4. Webhook destination: Outpost delivers events on `topic` to this URL --- // await outpost.destinations.create(tenantId, { type: "webhook", topics: [topic], config: { url: webhookUrl }, }); // // --- 5. Publish one event (delivered to destinations subscribed to `topic`) --- // const published = await outpost.publish({ tenantId, topic, eligibleForRetry: true, metadata: { source: "quickstart" }, data: { user_id: "user_123" }, }); console.log("Published event id:", published.id); ``` ```sh npx tsx outpost-quickstart.ts ``` -------------------------------- ### Echo all required configuration values Source: https://hookdeck.com/docs/outpost/self-hosting/guides/service-bus-internal-mq.md Display all the values needed to configure Outpost. ```bash echo "tenant_id: $TENANT_ID" echo "client_id: $CLIENT_ID" echo "client_secret: $CLIENT_SECRET" echo "subscription_id: $SUBSCRIPTION_ID" echo "resource_group: $RESOURCE_GROUP" echo "namespace: $NAMESPACE_NAME" ``` -------------------------------- ### Create a Hookdeck Connection with CLI Source: https://hookdeck.com/docs/use-cases/asynchronous-apis/quickstart.md Run this command to create a Connection named `asynchronous-api-quickstart` with a Source `inbound-api` and a Destination `internal-api` (Mock API). The Source uses API key authentication with header `X-API-KEY` and key `{UNIQUE_CLIENT_API_KEY}`. Replace `{UNIQUE_CLIENT_API_KEY}` with a unique value for your API client. ```bash hookdeck connection create \ --name asynchronous-api-quickstart \ --source-name inbound-api \ --source-type WEBHOOK \ --source-config '{"auth_type":"API_KEY","auth":{"header_key":"X-API-KEY","api_key":"{UNIQUE_CLIENT_API_KEY}"}}' \ --destination-name internal-api \ --destination-type MOCK_API ``` -------------------------------- ### GET /2026-09-01/issues/:id - Response example Source: https://hookdeck.com/docs/issues.md Example JSON response from the Hookdeck API when retrieving an issue. Shows the issue ID, type, status, aggregation keys, reference to the failed event and attempt, and the trigger event data with request details. ```json { "id": "iss_nLxlgkpe2GpkcSTtMt", "team_id": "tm_lbhzBKgFOUnB", "type": "delivery", "status": "OPENED", "aggregation_keys": { "error_code": [], "webhook_id": [ "web_nOYiSWuNW8EF" ], "response_status": [ 500 ] }, "reference": { "event_id": "evt_eNycCNgd99CGUBflic", "attempt_id": "atm_TgM9dDa4KzwKPmnnzuXA", "attempt_body": { "message": "The Mock API returns the request data with a HTTP 500 code", "next_step": "Convinced? Update your destination with your own server HTTP URL.", "received_data": { "body": { "body": { "type": "order.created", "total": 99.99, "customer": { "id": "cust_123", "email": "customer@example.com" }, "timestamp": "2026-01-14T13:35:55.335Z" }, "headers": { "content-type": "application/json" } }, "query": { "status": "500" }, "method": "POST", "headers": { "via": "1.1 google", "host": "mock.hookdeck.com", "accept": "application/json, text/plain, */*", "connection": "Keep-Alive", "user-agent": "axios/1.11.0", "content-type": "application/json", "content-length": "192", "accept-encoding": "gzip, compress, deflate, br", "idempotency-key": "evt_eNycCNgd99CGUBflic", "x-forwarded-for": "24.222.229.208, 34.36.135.20", "x-forwarded-proto": "https", "x-hookdeck-eventid": "evt_eNycCNgd99CGUBflic", "x-hookdeck-verified": "false", "x-hookdeck-event-url": "http://localhost:3000/events/evt_eNycCNgd99CGUBflic", "x-hookdeck-requestid": "req_eLU3Rb3wyAfHpbRgrDIW", "x-hookdeck-signature": "z73yK7iH8/YjGgA6ozLojgTk7/AxJZHy4hOVOQhMujs=", "x-cloud-trace-context": "7b79cbbeb30598a3646e743a2cf61f55/10630529597864032755", "x-hookdeck-original-ip": "::1", "x-hookdeck-source-name": "example", "x-hookdeck-attempt-count": "1", "x-hookdeck-attempt-trigger": "INITIAL", "x-hookdeck-connection-name": "", "x-hookdeck-destination-name": "mock-api-failure", "x-hookdeck-will-retry-after": "" } }, "requested_path": "/" } }, "last_updated_by": null, "merged_with": null, "first_seen_at": "2026-01-14T13:35:55.736Z", "last_seen_at": "2026-01-14T13:35:55.736Z", "dismissed_at": null, "opened_at": "2026-01-14T13:35:55.736Z", "updated_at": "2026-01-14T13:35:55.737Z", "created_at": "2026-01-14T13:35:55.737Z", "issue_trigger_id": "it_XsLswYZ6nLMdze", "auto_resolved_at": null, "data": { "trigger_event": { "webhook_id": "web_nOYiSWuNW8EF", "team_id": "tm_lbhzBKgFOUnB", "source_id": "src_32qkficffmdlme", "destination_id": "des_cWwBe16NUh9h", "event_data_id": "edt_sZp4bwt9En2j1FA6RnLd", "request_id": "req_eLU3Rb3wyAfHpbRgrDIW", "cli_id": null, "ingested_at": "2026-01-14T13:35:55.341Z", "attempts": 1, "status": "FAILED", "state": "NONE", "last_pending_at": "2026-01-14T13:35:55.404Z", "next_attempt_meta": null, "id": "evt_eNycCNgd99CGUBflic", "last_attempt_at": "2026-01-14T13:35:55.444Z", "next_attempt_at": null, "response_status": 500, "error_code": null, "successful_at": null, "issue_ids": [ "iss_nLxlgkpe2GpkcSTtMt" ], "created_at": "2026-01-14T13:35:55.397439Z", "updated_at": "2026-01-14T13:35:55.742271Z", "data": { "method": "POST", "url": "https://mock.hookdeck.com?status=500", "headers": { "Accept": "application/json, text/plain, */*", "Idempotency-Key": "evt_eNycCNgd99CGUBflic", "content-length": "192", "content-type": "application/json", "user-agent": "axios/1.11.0", "X-Hookdeck-Signature": "z73yK7iH8/YjGgA6ozLojgTk7/AxJZHy4hOVOQhMujs=", "X-Hookdeck-EventID": "evt_eNycCNgd99CGUBflic", "X-Hookdeck-RequestID": "req_eLU3Rb3wyAfHpbRgrDIW", "X-Hookdeck-Original-IP": "::1", "X-Hookdeck-Verified": "false" } } } } } ``` -------------------------------- ### Example environment variables for GCP Pub/Sub Source: https://hookdeck.com/docs/outpost/publishing/publish-from-gcp-pubsub.md Example values for the environment variables, showing a sample project, credentials as a single-line JSON string, and topic/subscription names. ```plaintext PUBLISH_GCP_PUBSUB_PROJECT="my-gcp-project" PUBLISH_GCP_PUBSUB_SERVICE_ACCOUNT_CREDENTIALS="single_line_json_string" PUBLISH_GCP_PUBSUB_TOPIC="outpost-publish" PUBLISH_GCP_PUBSUB_SUBSCRIPTION="outpost-publish-sub" ``` -------------------------------- ### Filter requests with GET /2026-09-01/requests response Source: https://hookdeck.com/docs/requests.md Response example for the GET /2026-09-01/requests endpoint when filtering requests. The response structure is identical to the browse-all response, showing pagination and request details. Filtering is done by appending query parameters like status and source_id. ```json { "pagination": { "order_by": "ingested_at", "dir": "desc", "limit": 100 }, "count": 1, "models": [ { "id": "req_fpSzYE7G0Op42UkKvFOB", "team_id": "tm_lbhzBKgFOUnB", "verified": false, "rejection_cause": null, "original_event_data_id": "edt_zjQsVjdTqSMI0cNIPPXE", "service_tier": "level1", "ingested_at": "2026-01-14T13:36:06.368000Z", "source_id": "src_qa5626p6y5o79b", "updated_at": "2026-01-14T13:36:06.415515Z", "created_at": "2026-01-14T13:36:06.415515Z", "events_count": 1, "ignored_count": 0, "cli_events_count": 0 } ] } ``` -------------------------------- ### Clone and prepare Outpost repository Source: https://hookdeck.com/docs/outpost/self-hosting/quickstarts/docker.md Clones the Outpost repository, navigates to the Docker Compose examples directory, and creates a .env file from the example. After copying, set a value for API_KEY in the .env file. ```sh git clone https://github.com/hookdeck/outpost.git ``` ```sh cd outpost/examples/docker-compose/ ``` ```sh cp .env.example .env ``` -------------------------------- ### Outpost YAML configuration for Azure Service Bus Source: https://hookdeck.com/docs/outpost/self-hosting/guides/service-bus-internal-mq.md Example YAML configuration block for the Outpost configuration file, using the values obtained from the setup steps. ```yaml mqs: azure_servicebus: client_id: "" client_secret: "" namespace: "" resource_group: "" subscription_id: "" tenant_id: "" ``` -------------------------------- ### Install and use the TypeScript SDK to manage Outpost resources Source: https://hookdeck.com/docs/outpost/sdks.md Install the TypeScript SDK with npm. Then create an Outpost instance using an Admin API Key and the default server URL, upsert a tenant, create a webhook destination for that tenant, and publish an event with retry eligibility. Requires the ADMIN_API_KEY environment variable; the script exits if it is missing. ```bash npm install @hookdeck/outpost-sdk ``` ```typescript import { randomUUID } from "crypto"; import dotenv from "dotenv"; dotenv.config(); import { Outpost } from "@hookdeck/outpost-sdk"; const ADMIN_API_KEY = process.env.ADMIN_API_KEY; const SERVER_URL = process.env.OUTPOST_BASE_URL || "https://api.outpost.hookdeck.com/2026-09-01"; if (!ADMIN_API_KEY) { console.error("Please set the ADMIN_API_KEY environment variable."); process.exit(1); } async function manageOutpostResources() { // 1. Create an Outpost instance using the API Key const outpostAdmin = new Outpost({ apiKey: ADMIN_API_KEY, serverURL: SERVER_URL, }); const tenantId = `hookdeck`; const topic = `user.created`; const newDestinationName = `My Test Destination ${randomUUID()}`; try { // 2. Create a tenant console.log(`Creating tenant: ${tenantId}`); const tenant = await outpostAdmin.tenants.upsert(tenantId); console.log("Tenant created successfully:", tenant); // 3. Create a destination for the tenant console.log( `Creating destination: ${newDestinationName} for tenant ${tenantId}...`, ); const destination = await outpostAdmin.destinations.create(tenantId, { type: "webhook", config: { url: "https://example.com/webhook-receiver", }, topics: [topic], }); console.log("Destination created successfully:", destination); // 4. Publish an event for the created tenant const eventPayload = { userId: "user_456", orderId: "order_xyz", timestamp: new Date().toISOString(), }; console.log(`Publishing event to topic ${topic} for tenant ${tenantId}...`); await outpostAdmin.publish({ data: eventPayload, tenantId, topic, eligibleForRetry: true, }); console.log("Event published successfully"); } catch (error) { console.error("An error occurred:", error); } } manageOutpostResources(); ``` -------------------------------- ### Enable Custom Methods - Query String Parameter Source: https://hookdeck.com/docs/sources.md Query string parameter to enable custom HTTP methods on a Hookdeck source URL. The example shows enabling the GET method. ```text ?x-hookdeck-allow-methods=get ``` -------------------------------- ### Example YAML configuration for GCP Pub/Sub Source: https://hookdeck.com/docs/outpost/publishing/publish-from-gcp-pubsub.md Example YAML configuration with sample values and comments explaining each field, including the GCP project ID, credentials file contents, and Pub/Sub topic/subscription names. ```yaml publishmq: gcp_pubsub: project: "GCP_PUBSUB_PROJECT" # GCP project ID service_account_credentials: "GCP_PUBSUB_SERVICE_ACCOUNT_CREDENTIALS" # Contents of service account credentials JSON file topic: "outpost-publish" # Pub/Sub to read for published events subscription: "outpost-publish-sub" # Pub/Sub subscription for published events ``` -------------------------------- ### Metrics API response for GET /2026-09-01/metrics/events Source: https://hookdeck.com/docs/metrics.md Example response from the Metrics API for /metrics/events. Shows the structure with data array and metadata including granularity, query time, row count, and truncation flag. ```json { "data": [ { "time_bucket": null, "dimensions": {}, "metrics": { "count": 9, "successful_count": 7, "failed_count": 1, "scheduled_count": 0, "paused_count": 0, "error_rate": 11.11, "avg_attempts": 1.2222222222222223 } } ], "metadata": { "granularity": null, "query_time_ms": 9, "row_count": 1, "row_limit": 1000000, "truncated": false } } ```