Webhooks
Receive signed HTTPS notifications for account grants, sync, account resources, orders, and reauth.
Finatic can POST JSON events to an HTTPS endpoint you control whenever subscribed account grants, sync state, account resources, orders, or reauth requirements change. Delivery is handled by FinaticBackground and is scoped to company account grants.
Configure subscriptions
Create and manage webhook endpoints in the Finatic dashboard under Settings → Webhooks for your team workspace.
For each subscription you provide:
- URL — Must be HTTPS.
- Environment —
liveorsandbox. - Event types — One or more event strings from the catalog below.
- Secret — Used to compute
X-Finatic-Signature.
The public event catalog is available at GET /api/v1/webhooks/catalog (no auth required). Subscription management is performed through the dashboard.
Event catalog
The canonical catalog is available at /api/v1/webhooks/catalog.
Account grants
account.grant.createdaccount.grant.updatedaccount.grant.revoked
Account sync
account.sync.startedaccount.sync.succeededaccount.sync.failed
Account resources
account.balance.updatedaccount.position.updatedaccount.transaction.created
Orders
order.createdorder.updatedorder.filledorder.cancelledorder.rejected
Connections
connection.reauth.required
Request shape
Each POST body is a JSON object with:
- schemaVersion — currently
v1. - eventId — unique event id.
- eventType — subscribed event string.
- createdAt — ISO timestamp.
- environment —
liveorsandbox. - companyAccountId — company workspace that owns the grant/subscription.
- accountId — financial account ID when the event is account-scoped.
- grantId — account grant ID when available.
- resource — resource pointer with
resourceType,resourceId,accountId, andgrantId. - data — event-specific payload.
Example:
1{
2"schemaVersion": "v1",
3"eventId": "evt_01HX...",
4"eventType": "order.filled",
5"createdAt": "2026-06-08T20:15:00Z",
6"environment": "live",
7"companyAccountId": "acct_company_123",
8"accountId": "acct_financial_456",
9"grantId": "grant_789",
10"resource": {
11"resourceType": "order",
12"resourceId": "order_abc",
13"accountId": "acct_financial_456",
14"grantId": "grant_789"
15},
16"data": {
17"status": "FILLED",
18"symbol": "AAPL"
19}
20}
21Headers
Finatic sends at least:
1Content-Type: application/json
2User-Agent: Finatic-Webhooks/3.0
3X-Finatic-Event
4X-Finatic-Event-Id
5X-Finatic-Delivery
6X-Finatic-Signature: sha256=<hex>
7X-Finatic-Signature is included when a subscription secret is configured.
Verify signatures
The signature is HMAC-SHA256 over the exact UTF-8 JSON body Finatic posts. Acknowledge quickly with any HTTP 2xx and process expensive work asynchronously.
1import { createHmac, timingSafeEqual } from 'node:crypto';
2
3export async function POST(request: Request) {
4const rawBody = await request.text();
5const signature = request.headers.get('x-finatic-signature') ?? '';
6const expected = `sha256=${createHmac(
7'sha256',
8process.env.FINATIC_WEBHOOK_SECRET!,
9)
10.update(rawBody, 'utf8')
11.digest('hex')}`;
12
13const valid =
14signature.length === expected.length &&
15timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
16
17if (!valid) {
18return new Response('invalid signature', { status: 401 });
19}
20
21return new Response('ok', { status: 200 });
22}
23Retries and idempotency
The worker treats any HTTP 2xx response as success. On timeouts, transport errors, or non-2xx responses, Finatic retries with exponential backoff. Use eventId as your idempotency key and store the latest processed event per resource if your workflow is order-sensitive.
Testing
- Use sandbox subscriptions while you iterate.
- Use dashboard test sends to validate endpoint routing and signature handling.
- Confirm your handler routes by
companyAccountId,accountId, andgrantId. - Do not use provider connection IDs in webhook routing logic.
Next steps
- Account-First Model — Understand public identity fields.
- Account Grants — Manage grant scopes and disconnect behavior.
- API Reference — Explore the webhook event catalog.
