/meWho am I
Role: VIEWER
- 200
- The caller: a user, or an API key with its organization and role.
00 / API reference
Everything in the dashboard, over HTTPS and JSON. This page is generated from the same schemas the server validates requests with.
https://hookstead.dev/api/v1Authorization: Bearer hw_live_… (Settings → API keys). Keys are scoped to one organization and capped at ADMIN.application/problem+json with a stable code. Another tenant's resources always answer 404.Idempotency-Key where marked; the same key and body return the stored response for 24 hours./meWho am I
Role: VIEWER
/organizationsList my organizations
Role: VIEWER
/organizationsCreate an organization
The caller becomes OWNER; a default production workspace is created.
Role: VIEWERSigned-in users only
Body
| name * | string | 1–80 chars |
|---|---|---|
| slug * | string | 2–48 chars |
/organizations/{orgId}Get an organization
Role: VIEWER
/organizations/{orgId}Rename or change the URL of an organization
Role: ADMIN
Body
| name | string | 1–80 chars |
|---|---|---|
| slug | string | 2–48 chars |
/organizations/{orgId}/membersList members
Role: VIEWER
/organizations/{orgId}/workspacesList workspaces
Role: VIEWER
/organizations/{orgId}/workspacesCreate a workspace
Counts toward the plan's workspace limit (403 plan_limit_reached).
Role: ADMIN
Body
| name * | string | 1–80 chars |
|---|---|---|
| slug * | string | 2–48 chars |
/workspaces/{wsId}Get a workspace
Role: VIEWER
/workspaces/{wsId}Update a workspace
Role: ADMIN
Body
| name | string | 1–80 chars |
|---|---|---|
| slug | string | 2–48 chars |
/workspaces/{wsId}Delete a workspace and everything in it
Role: ADMIN
/organizations/{orgId}/billingPlan, usage and limits
Usage counts ingested events plus replayed deliveries in the current UTC month.
Role: VIEWER
{billingEnabled, plan, status, currentPeriodEnd, cancelAtPeriodEnd, entitledPlan, entitledUntil, graceEndsAt, usage, limits}./organizations/{orgId}/billing/checkoutStart Stripe Checkout for a paid plan
Return URLs are fixed on the server. 409 if a subscription exists (use the portal).
Role: OWNERIdempotency-Key: requiredSigned-in users only
Body
| plan * | "PRO" | "TEAM" | |
|---|---|---|
| interval | "month" | "year" | default "month" |
{url}: redirect the user there./organizations/{orgId}/billing/portalOpen the Stripe customer portal
Role: OWNERSigned-in users only
{url}: redirect the user there./workspaces/{wsId}/sourcesList sources
Role: VIEWER
hasSecret)./workspaces/{wsId}/sourcesCreate a source
Senders POST webhooks to the returned ingestUrl. Plan limits apply.
Role: MEMBER
Body
| name * | string | 1–80 chars |
|---|---|---|
| provider | "stripe" | "lemonsqueezy" | "quickbooks" | "paypal" | "shopify" | "github" | "gitlab" | "linear" | "dockerhub" | "vercel" | "aws-sns" | "hubspot" | "openai" | "clerk" | "supabase" | "standard-webhooks" | "custom" | null | default null |
| authType | "NONE" | "HMAC_SHA256" | "STRIPE" | "GITHUB" | "SHOPIFY" | "STANDARD_WEBHOOKS" | "BASIC_AUTH" | "HEADER_TOKEN" | "VERCEL" | "HUBSPOT" | "AWS_SNS" | "PAYPAL" | default "NONE" |
| authConfig | object | default {} |
| authSecret | string | 0–1024 chars |
| allowedMethods | "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE"[] | |
| maxBodyBytes | integer | 1024–9007199254740991 |
| dedupeStrategy | object | null | default null |
| redactionRules | object | default {"headers":[],"keys":[]} |
| responseStatus | 200 | 201 | 202 | 204 | default 202 |
/workspaces/{wsId}/sources/{sourceId}Get a source
Role: VIEWER
/workspaces/{wsId}/sources/{sourceId}Update a source
Changing authType, authConfig, authSecret or redactionRules needs ADMIN.
Role: MEMBER
Body
| name | string | 1–80 chars |
|---|---|---|
| provider | "stripe" | "lemonsqueezy" | "quickbooks" | "paypal" | "shopify" | "github" | "gitlab" | "linear" | "dockerhub" | "vercel" | "aws-sns" | "hubspot" | "openai" | "clerk" | "supabase" | "standard-webhooks" | "custom" | null | |
| authType | "NONE" | "HMAC_SHA256" | "STRIPE" | "GITHUB" | "SHOPIFY" | "STANDARD_WEBHOOKS" | "BASIC_AUTH" | "HEADER_TOKEN" | "VERCEL" | "HUBSPOT" | "AWS_SNS" | "PAYPAL" | |
| authConfig | object | |
| authSecret | string | 0–1024 chars |
| allowedMethods | "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE"[] | |
| maxBodyBytes | integer | 1024–9007199254740991 |
| dedupeStrategy | object | null | |
| redactionRules | object | |
| responseStatus | 200 | 201 | 202 | 204 | |
| enabled | boolean |
/workspaces/{wsId}/sources/{sourceId}Delete a source
Its ingest URL stops working immediately.
Role: MEMBER
/workspaces/{wsId}/sources/{sourceId}/rotate-tokenRotate the ingest URL
The old URL returns 404 immediately.
Role: ADMIN
/workspaces/{wsId}/destinationsList destinations
Role: VIEWER
/workspaces/{wsId}/destinationsCreate a destination
The response contains the signing secret (whsec_…) once. Plan limits apply.
Role: MEMBER
Body
| name * | string | 1–80 chars |
|---|---|---|
| url * | string | 1–2048 chars |
| method | "POST" | "PUT" | "PATCH" | default "POST" |
| headers | object | |
| timeoutMs | integer | 1000–9007199254740991 |
| maxAttempts | integer | 1–9007199254740991 |
| backoffBaseMs | integer | 1000–3600000, default 30000 |
| backoffMaxMs | integer | 1000–86400000, default 21600000 |
| retryOn4xx | boolean | default false |
| maxConcurrency | integer | 1–100, default 10 |
signingSecret./workspaces/{wsId}/destinations/{destinationId}Get a destination
Role: VIEWER
/workspaces/{wsId}/destinations/{destinationId}Update a destination
Role: MEMBER
Body
| name | string | 1–80 chars |
|---|---|---|
| url | string | 1–2048 chars |
| method | "POST" | "PUT" | "PATCH" | |
| headers | object | |
| timeoutMs | integer | 1000–9007199254740991 |
| maxAttempts | integer | 1–9007199254740991 |
| backoffBaseMs | integer | 1000–3600000 |
| backoffMaxMs | integer | 1000–86400000 |
| retryOn4xx | boolean | |
| maxConcurrency | integer | 1–100 |
/workspaces/{wsId}/destinations/{destinationId}Delete a destination
Pending deliveries to it are cancelled.
Role: MEMBER
/workspaces/{wsId}/destinations/{destinationId}/pausePause deliveries
New deliveries are held until resumed.
Role: MEMBER
/workspaces/{wsId}/destinations/{destinationId}/resumeResume deliveries
Role: MEMBER
/workspaces/{wsId}/destinations/{destinationId}/rotate-signing-secretRotate the signing secret
During overlapHours both secrets sign every delivery.
Role: ADMIN
Body
| overlapHours | integer | 0–72, default 0 |
|---|
signingSecret (shown once)./workspaces/{wsId}/destinations/{destinationId}/healthHealth and hourly stats
Role: VIEWER
Query parameters
| from | string | |
|---|---|---|
| to | string | |
| granularity | "hour" | "day" |
/workspaces/{wsId}/connectionsList connections
Role: VIEWER
/workspaces/{wsId}/connectionsConnect a source to a destination
Role: MEMBER
Body
| sourceId * | string | |
|---|---|---|
| destinationId * | string |
/workspaces/{wsId}/connections/{connectionId}Enable or disable a connection
Role: MEMBER
Body
| enabled * | boolean |
|---|
/workspaces/{wsId}/connections/{connectionId}Delete a connection
Role: MEMBER
/workspaces/{wsId}/eventsSearch events
Newest first, keyset pagination (cursor).
Role: VIEWER
Query parameters
| sourceId | string | |
|---|---|---|
| from | string | |
| to | string | |
| deliveryStatus | "PENDING" | "SCHEDULED" | "IN_FLIGHT" | "SUCCEEDED" | "DEAD" | "CANCELLED"[] | |
| errorClass | string[] | |
| httpStatus | integer | 100–599 |
| q | string | 3–200 chars |
| header | string[] | |
| jsonPath | string | 0–600 chars |
| cursor | string | |
| limit | integer | 1–100, default 50 |
{data, nextCursor}; bodies and headers are the redacted copies./workspaces/{wsId}/events/{eventId}Get an event
Role: VIEWER
/workspaces/{wsId}/events/{eventId}/rawGet the original request (decrypted)
ADMIN only; every view is audit-logged.
Role: ADMIN
/workspaces/{wsId}/events/{eventId}/replayReplay an event
Creates new deliveries (to the connected destinations, or destinationIds). Counts toward the monthly quota; rate limited.
Role: MEMBERIdempotency-Key: required
Body
| destinationIds | string[] |
|---|
{deliveries: [{id, destinationId}]}./workspaces/{wsId}/deliveriesSearch deliveries
Role: VIEWER
Query parameters
| status | "PENDING" | "SCHEDULED" | "IN_FLIGHT" | "SUCCEEDED" | "DEAD" | "CANCELLED"[] | |
|---|---|---|
| destinationId | string | |
| sourceId | string | |
| eventId | string | |
| errorClass | string[] | |
| httpStatus | integer | 100–599 |
| trigger | "INITIAL" | "MANUAL_RETRY" | "REPLAY" | |
| from | string | |
| to | string | |
| cursor | string | |
| limit | integer | 1–100, default 50 |
{data, nextCursor}./workspaces/{wsId}/deliveries/{deliveryId}Get a delivery and its attempts
Role: VIEWER
/workspaces/{wsId}/deliveries/{deliveryId}/retryRetry a delivery now
409 while it's in flight or after it succeeded (replay the event instead).
Role: MEMBERIdempotency-Key: required
/workspaces/{wsId}/deliveries/{deliveryId}/cancelCancel a pending delivery
Role: MEMBER
/workspaces/{wsId}/deliveries/bulk-retryRetry many deliveries
Up to 1,000 matching deliveries, as a background job. dryRun only counts.
Role: MEMBERIdempotency-Key: required
Body
| filter | object | default {} |
|---|---|---|
| dryRun | boolean | default false |
{jobId: null, matched, capped}.{jobId, matched, capped}./workspaces/{wsId}/jobs/{jobId}Bulk job progress
Role: VIEWER
/workspaces/{wsId}/metricsWorkspace metrics
Role: VIEWER
Query parameters
| from | string | |
|---|---|---|
| to | string | |
| granularity | "hour" | "day" |
/workspaces/{wsId}/alert-rulesList alert rules
Role: VIEWER
/workspaces/{wsId}/alert-rulesCreate an alert rule
Recipients must be members of the organization.
Role: MEMBER
Body
| name * | string | 1–80 chars |
|---|---|---|
| type * | "FAILURE_RATE" | "CONSECUTIVE_FAILURES" | "DEAD_DELIVERIES" | "SOURCE_INACTIVE" | |
| subjectId | string (uuid) | null | default null |
| threshold * | number | 0–1000000 |
| windowSec * | integer | 60–604800 |
| minSamples | integer | 1–100000, default 10 |
| cooldownSec | integer | 0–604800, default 3600 |
| recipients * | string (email)[] | |
| enabled | boolean | default true |
/workspaces/{wsId}/alert-rules/{ruleId}Get an alert rule
Role: VIEWER
/workspaces/{wsId}/alert-rules/{ruleId}Update an alert rule
Role: MEMBER
Body
| name | string | 1–80 chars |
|---|---|---|
| subjectId | string (uuid) | null | |
| threshold | number | 0–1000000 |
| windowSec | integer | 60–604800 |
| minSamples | integer | 1–100000 |
| cooldownSec | integer | 0–604800 |
| recipients | string (email)[] | |
| enabled | boolean |
/workspaces/{wsId}/alert-rules/{ruleId}Delete an alert rule
Its open incidents close without email.
Role: MEMBER
/workspaces/{wsId}/incidentsList incidents
Role: VIEWER
Query parameters
| state | "OPEN" | "RESOLVED" | |
|---|---|---|
| cursor | string | |
| limit | integer | 1–100, default 50 |
{data, nextCursor}./workspaces/{wsId}/incidents/{incidentId}/acknowledgeAcknowledge an incident
Role: MEMBER