Webhooks

Receive push notifications when your watchlist changes

Instead of polling the API for changes, register a webhook URL and TickerAPI will POST updates to you after each daily and weekly pipeline run. Subscribe to the events you care about and get structured, field-level diffs delivered automatically.

Tier Access
Free no webhooks. Plus 1 webhook URL. Pro 3 webhook URLs. Commercial Plus gets 3, Commercial Pro gets 5 webhook URLs.

Event Types

EventDescriptionDefault
watchlist.changesStructured field-level diffs for tickers on your watchlist. Only fires when at least one field has changed.Enabled on creation
data.readySimple notification that fresh data has been computed and is available via the API.Opt-in

Each webhook delivery counts as one API request against your daily allowance.

GET — List webhooks

GET https://api.tickerapi.ai/v1/webhooks

Returns all registered webhooks for your account. The secret field is never included in GET responses.

Response Fields

FieldTypeDescription
webhooksarrayArray of webhook objects
webhooks[].idstringWebhook ID
webhooks[].urlstringDelivery URL
webhooks[].eventsobjectSubscribed event configuration
webhooks[].activebooleanWhether the webhook is active
webhooks[].created_atstringISO 8601 creation timestamp
webhooks[].updated_atstringISO 8601 last update timestamp
webhook_countintegerNumber of registered webhooks
webhook_limitintegerMax webhooks for your tier
GET /v1/webhooks
{ "webhooks": [ { "id": "d3f1a2b4-...", "url": "https://example.com/webhook", "events": { "watchlist.changes": true, "data.ready": true }, "active": true, "created_at": "2026-03-27T12:00:00.000Z", "updated_at": "2026-03-27T12:00:00.000Z" } ], "webhook_count": 1, "webhook_limit": 1 }

POST — Register a webhook

POST https://api.tickerapi.ai/v1/webhooks

Register a new webhook URL. The secret is returned only on creation — save it immediately. Use it to verify webhook signatures.

Request Body

FieldTypeRequiredDescription
urlstringYesHTTPS URL to receive webhook payloads
eventsobjectNoEvent subscriptions. Defaults to {"watchlist.changes": true}
Example Request
{ "url": "https://example.com/webhook", "events": { "watchlist.changes": true, "data.ready": true } }
POST /v1/webhooks
{ "id": "d3f1a2b4-...", "url": "https://example.com/webhook", "secret": "a1b2c3d4e5f6...", "events": { "watchlist.changes": true, "data.ready": true }, "active": true, "created_at": "2026-03-27T12:00:00.000Z" }

PUT — Update a webhook

PUT https://api.tickerapi.ai/v1/webhooks

Update the URL, event subscriptions, or active status of an existing webhook.

Request Body

FieldTypeRequiredDescription
idstringYesWebhook ID to update
urlstringNoNew HTTPS URL
eventsobjectNoUpdated event subscriptions
activebooleanNoEnable or disable the webhook
Example Request
{ "id": "d3f1a2b4-...", "events": { "watchlist.changes": true }, "active": false }
PUT /v1/webhooks
{ "updated": true, "id": "d3f1a2b4-..." }

DELETE — Remove a webhook

DELETE https://api.tickerapi.ai/v1/webhooks

Request Body

FieldTypeRequiredDescription
idstringYesWebhook ID to delete
Example Request
{ "id": "d3f1a2b4-..." }
DELETE /v1/webhooks
{ "deleted": "d3f1a2b4-...", "webhook_count": 0 }

Verifying Webhook Signatures

Every webhook delivery includes an X-Webhook-Signature header containing an HMAC-SHA256 signature of the request body, signed with your webhook's secret. Always verify this signature before processing the payload.

HeaderDescription
X-Webhook-SignatureHMAC-SHA256 hex digest of the raw request body
X-Webhook-EventEvent type: watchlist.changes or data.ready
Content-Typeapplication/json
User-AgentTickerAPI-Webhook/1.0

Webhook Payloads

watchlist.changes

Delivered after each pipeline run when at least one field has changed on a watchlist ticker. Contains structured diffs showing exactly which fields changed and their previous/current values.

Fields tracked: rsi_zone, macd_state, momentum_direction, divergence_detected, trend_direction, volume_ratio_band, accumulation_state, squeeze_active, extreme_condition, breakout_type, and fundamental fields (valuation_zone, analyst_consensus, analyst_consensus_direction, earnings_proximity, last_earnings_surprise, growth_zone).

When a band field changes, the change object includes stability context on Plus Pro tiers: stability, periods_in_current_state, flips_recent, and flips_lookback. These describe the new band value's stability at the time of the change. Not included on Free tier.

watchlist.changes payload
{ "event": "watchlist.changes", "timestamp": "2026-03-27T21:30:00Z", "data": { "timeframe": "daily", "run_date": "2026-03-27", "changes": { "AAPL": [ { "field": "rsi_zone", "from": "neutral", "to": "oversold", "stability": "fresh", "periods_in_current_state": 1, "flips_recent": 3, "flips_lookback": "30d" }, { "field": "divergence_detected", "from": false, "to": true } ], "TSLA": [ { "field": "macd_state", "from": "bearish", "to": "bullish_cross", "stability": "fresh", "periods_in_current_state": 1, "flips_recent": 2, "flips_lookback": "30d" }, { "field": "accumulation_state", "from": "neutral", "to": "accumulation" }, { "field": "fundamentals.analyst_consensus", "from": "hold", "to": "buy" } ] }, "tickers_checked": 15, "tickers_changed": 2 } }

data.ready

Simple notification that fresh data has been computed. Useful for triggering downstream fetches without polling.

data.ready payload
{ "event": "data.ready", "timestamp": "2026-03-27T21:30:00Z", "data": { "timeframe": "daily", "run_date": "2026-03-27", "tickers_computed": 9847 } }