Skip to main content
Filed sends workspace-scoped task status events to HTTPS endpoints you configure. Use webhooks when your integration needs task updates without polling the 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:
The event catalog is public. Listing or managing webhook endpoints requires an administrator’s read-write workspaceToken. Send the token as a bearer token:
See Authentication for token setup.

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.
Variables using every available input field:
Store signingSecret immediately in a secrets manager. Filed returns it only when the endpoint is created or its secret is rotated. Do not put it in source control or expose it to browser code.

Complete cURL request

3. List endpoints

Endpoint listing is cursor-paginated and is reached through the authenticated workspace returned by me.
All query arguments:
All page and endpoint return fields: 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: provide endpointId and only the fields you want to change. At least one update field must be present.
Variables using every available input field:
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.
Pause an endpoint without deleting it:

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.
Do not verify a parsed or re-serialized JSON object. Whitespace or key ordering changes invalidate the signature. Pass the exact raw request body to the Svix verification library.

9. Handle duplicates, ordering, and retries

Webhook delivery is at least once. Store the webhook-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.
Treat webhook events as notifications, not as the only task record. To reconcile state, query the task by taskId through the tasks API.

Common GraphQL errors