tasks API.
This guide includes every argument, input field, return field, and default
value for the webhook GraphQL operations it documents because schema
introspection is not available.
Before you begin
All GraphQL requests use:workspaceToken. Send the token as a bearer token:
Complete GraphQL schema
The following is the complete schema available for webhook configuration. No other arguments or fields are required to use this API.1. Discover supported events
Query the catalog instead of hard-coding event support. This query has no arguments or variables and does not require a workspace ID.payloadSchema contains the complete Draft 7 JSON Schema for that event, not
only the abbreviated fields shown above.
The current event catalog is:
task.* reports the task as a whole. subtask.* reports each stage inside it
— extraction, reconciliation, data entry and the rest. A stage is only reported
when it finishes, so these mark completion rather than progress.
documents.synced is not a task event, which is why it carries no status or
task type. Filed emits it when documents are pulled into a client from a
connected system — a document management system, or a practice management
system such as Canopy, Karbon or Truss. It arrives before any processing
begins, so it tells you documents landed, not what Filed made of them. Its
payload names the connectionId and providerKey they came from, the
sourceExternalId of the folder or project, and each document’s
inputDocumentId, fileName and mimeType. duplicateCount reports how many
files in the same pull Filed already held and therefore left out.
Documents added by hand rather than pulled from a connection do not raise it.
Subscribe to subtask.* only if you need stage detail. A single tax prep
moves through many stages, so these are an order of magnitude more traffic than
task.*. eventTypes on an endpoint is how you choose: subscribe to task.*
alone and you never receive them.
An endpoint created without eventTypes receives every event, current and
future — so an endpoint made before subtask.* existed now receives it too. Set
eventTypes explicitly on those endpoints to keep the volume you had.
2. Create an endpoint
Create an endpoint once for each delivery destination. New endpoints are enabled by default.Complete cURL request
3. List endpoints
Endpoint listing is cursor-paginated and is reached through the authenticated workspace returned byme.
To read every endpoint, send the returned
iterator in the next request until
done is true.
4. Update an endpoint
The update mutation is a patch: provideendpointId and only the fields you
want to change. At least one update field must be present.
GraphQL distinguishes an omitted input field from an explicitly supplied
null. This matters for description and eventTypes, where null clears or
resets the existing value.5. Rotate a signing secret
Rotate a secret before you suspect compromise or as part of regular credential hygiene.
The response contains every
WebhookEndpoint field plus the new
signingSecret. Deploy the new secret before the grace period ends, verify a
delivery with it, and then remove the old secret.
6. Delete an endpoint
Deletion stops delivery permanently for that endpoint.
Use
enabled: false with updateWebhookEndpoint instead when you may need to
resume the endpoint later.
7. Receive the payload
Every event uses the same version 2 envelope:Sub-task payload
subtask.* uses the same envelope, minus taxPrepResult and customerError,
plus the stage it reports:
Each request also includes these Svix signature headers:
8. Verify the signature
Verify the raw request body before parsing JSON or changing application state.9. Handle duplicates, ordering, and retries
Webhook delivery is at least once. Store thewebhook-id in a table with a
uniqueness constraint before applying the event. If the ID has already been
handled, return a successful response without applying it again.
Events can be delayed or arrive out of order. Compare occurredAt with the
latest status transition you have stored, and do not let an older event replace
newer state.
Return a 2xx response promptly after durable acceptance. Move slow work to a
queue. Non-2xx responses and network failures are retried.