API And Webhooks
The Bitaic API and webhook layer lets engineering, operations, and automation teams retrieve monitoring data, manage monitored resources, configure alert behavior, export operational data, and deliver operational events into internal systems.
When To Use API Versus Webhooks
| Need | Use | Typical workflow |
|---|---|---|
| Read current or historical state on demand. | API | Query targets, checks, metrics, alerts, or exports from a script, dashboard, or internal tool. |
| Create or update monitoring configuration from automation. | API | Manage monitored targets, check schedules, alert thresholds, integration settings, and agent metadata. |
| React when something changes. | Webhooks | Send alert, recovery, certificate, endpoint, DNS, or domain events to another system. |
| Connect Bitaic to incident or workflow tools. | Integrations and webhooks | Use a built-in integration where one exists, and use webhooks for custom routing or in-house automation. |
Authentication And Authorization
- API requests use a Bitaic API token in the
Authorization: Bearer <token>header. - API tokens are workspace-scoped service tokens created and rotated from Bitaic App settings by users with permission to manage API access.
- Requests are authorized against the workspace in the URL path and the scopes granted to the token.
- Administrative API activity is part of the Bitaic audit trail so teams can review configuration and access changes.
Create and rotate API tokens from an account role that can manage API access, then scope each automation token to the resources and actions it actually needs.
Store API tokens in a secrets manager or protected runtime variable, not in source code, command history, or committed configuration files.
Base URL And Versioning
| Base URL | https://api.bitaic.com/v1 |
|---|---|
| Workspace boundary | Workspace resources live under /v1/workspaces/{workspace_id}. |
| Content type | Send and receive JSON with Content-Type: application/json. |
| Timestamps | Use ISO 8601 UTC timestamps in request and response payloads. |
| Request IDs | Responses include request_id and X-Bitaic-Request-Id. |
| Idempotent writes | Send Idempotency-Key on retried POST, PATCH, or DELETE requests when the first outcome is unknown. |
Resource Model
| Resource | Purpose | Common fields |
|---|---|---|
| Targets | Monitored infrastructure objects such as endpoints, domains, and DNS records. | id, workspace_id, name, type, status, labels, created_at, updated_at |
| Checks | Scheduled or on-demand monitoring rules attached to targets. | id, target_id, type, state, enabled, schedule, thresholds, last_run |
| Metrics | Current and historical values for uptime, response time, DNS latency, certificate expiration, and domain status. | metric, value, unit, target_id, check_id, observed_at |
| Alerts | Alert records created from threshold crossings, status changes, failures, and recoveries. | id, severity, state, summary, source, target_id, check_id, opened_at, resolved_at |
| Agents | Installed collectors and their version, status, last report time, and product coverage. | id, name, agent_type, version, status, last_seen_at |
| Integrations | Notification, incident, webhook, and API-connected routing configuration. | id, provider, name, enabled, status, filters, created_at, updated_at |
Target And Check Types
| Launch product | Target type | Primary check type | Key API usage |
|---|---|---|---|
| Certificate Monitoring | endpoint | ssl_certificate | Certificate status, expiration metrics, and certificate alert thresholds. |
| Domain Monitoring | domain | domain_status | Domain continuity status, expiration thresholds, registry metadata, nameserver drift, DNSSEC state, registrar-lock state, and domain alerts. |
| DNS Monitoring | dns_record | dns_resolution | Regional resolver state, authoritative answers, expected-value mismatches, TTL and DNSSEC state, propagation state, latency metrics, and DNS alerts. |
| Endpoint Monitoring | endpoint | endpoint_availability | Availability state, status-code and redirect behavior, response-time metrics, and response-time threshold severity. |
Health Monitoring and Windows Event Monitoring remain private beta only and release publicly in Q1 2027. Detailed target types, check types, metrics, events, and troubleshooting fields for those products stay in beta-specific documentation for enrolled workspaces.
Endpoint Reference
| Method | Path | Purpose | Use case |
|---|---|---|---|
GET | /v1/workspaces/{workspace_id}/targets | List monitored targets. | Inventory the resources Bitaic is monitoring. |
POST | /v1/workspaces/{workspace_id}/targets | Create a monitored target. | Add an endpoint, domain, or DNS record. |
GET | /v1/workspaces/{workspace_id}/targets/{target_id} | Retrieve one monitored target. | Inspect target metadata, status, labels, and configuration. |
PATCH | /v1/workspaces/{workspace_id}/targets/{target_id} | Update a target. | Rename a target, change labels, or update supported config. |
DELETE | /v1/workspaces/{workspace_id}/targets/{target_id} | Remove a monitored target. | Stop monitoring a retired resource. |
GET | /v1/workspaces/{workspace_id}/targets/{target_id}/checks | List checks for a target. | See which monitoring rules are attached to a resource. |
POST | /v1/workspaces/{workspace_id}/targets/{target_id}/checks | Create a target check. | Add availability, certificate, DNS, or domain checks. |
GET | /v1/workspaces/{workspace_id}/checks/{check_id} | Retrieve one check. | Inspect schedule, thresholds, state, and last run. |
PATCH | /v1/workspaces/{workspace_id}/checks/{check_id} | Update a check. | Change schedule, thresholds, enabled state, or rule metadata. |
DELETE | /v1/workspaces/{workspace_id}/checks/{check_id} | Remove a check. | Stop one monitoring rule while keeping the target. |
POST | /v1/workspaces/{workspace_id}/checks/{check_id}/run | Run an on-demand check. | Verify a fix before waiting for scheduled collection. |
GET | /v1/workspaces/{workspace_id}/metrics | Retrieve metrics. | Read bounded time-series or rolled-up monitoring data. |
GET | /v1/workspaces/{workspace_id}/alerts | List alerts. | Read active and resolved alert records for operations review. |
GET | /v1/workspaces/{workspace_id}/alerts/{alert_id} | Retrieve one alert. | Inspect alert source, evidence, timeline, and routing state. |
PATCH | /v1/workspaces/{workspace_id}/alerts/{alert_id} | Update an alert. | Acknowledge, annotate, assign, or resolve an alert. |
GET | /v1/workspaces/{workspace_id}/agents | List agents. | Check installed collector status and freshness. |
GET | /v1/workspaces/{workspace_id}/agents/{agent_id} | Retrieve one agent. | Inspect version, last-seen time, type, and associated targets. |
PATCH | /v1/workspaces/{workspace_id}/agents/{agent_id} | Update agent metadata. | Rename an agent or update supported desired-state metadata. |
GET | /v1/workspaces/{workspace_id}/integrations | List integrations. | Audit configured alert-routing destinations. |
POST | /v1/workspaces/{workspace_id}/integrations | Create an integration. | Configure a supported alert-routing provider from automation. |
GET | /v1/workspaces/{workspace_id}/integrations/{integration_id} | Retrieve one integration. | Inspect provider, enabled state, filters, and last test result. |
PATCH | /v1/workspaces/{workspace_id}/integrations/{integration_id} | Update an integration. | Change filters, routing metadata, or enabled state. |
DELETE | /v1/workspaces/{workspace_id}/integrations/{integration_id} | Remove an integration. | Disable and remove a retired alert-routing destination. |
POST | /v1/workspaces/{workspace_id}/integrations/{integration_id}/test | Send a test notification. | Confirm a configured integration reaches the expected channel. |
GET | /v1/workspaces/{workspace_id}/webhook-subscriptions | List webhook subscriptions. | Audit custom event receivers. |
POST | /v1/workspaces/{workspace_id}/webhook-subscriptions | Create a webhook subscription. | Deliver selected events to a customer-owned HTTPS endpoint. |
GET | /v1/workspaces/{workspace_id}/webhook-subscriptions/{subscription_id} | Retrieve one webhook subscription. | Inspect URL, event filters, enabled state, and signing status. |
PATCH | /v1/workspaces/{workspace_id}/webhook-subscriptions/{subscription_id} | Update a webhook subscription. | Change URL, selected events, description, or enabled state. |
DELETE | /v1/workspaces/{workspace_id}/webhook-subscriptions/{subscription_id} | Remove a webhook subscription. | Stop delivery to a retired receiver. |
POST | /v1/workspaces/{workspace_id}/webhook-subscriptions/{subscription_id}/test | Send a test webhook. | Verify signature handling and receiver availability. |
POST | /v1/workspaces/{workspace_id}/webhook-subscriptions/{subscription_id}/secret/rotate | Rotate a webhook signing secret. | Replace a subscription secret without changing the receiver URL. |
GET | /v1/workspaces/{workspace_id}/webhook-deliveries | List webhook delivery attempts. | Troubleshoot receiver failures, retries, and duplicates. |
POST | /v1/workspaces/{workspace_id}/exports | Start an export job. | Export alerts, metrics, targets, or audit-ready data. |
GET | /v1/workspaces/{workspace_id}/exports/{export_id} | Retrieve export status. | Poll until the export is complete or failed. |
GET | /v1/workspaces/{workspace_id}/exports/{export_id}/download | Download a completed export. | Fetch a generated JSON or CSV export. |
Create A Monitored Target
Use targets for monitored objects and attach one or more checks to decide what Bitaic should evaluate.
POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/targets HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: target-create-20260825-001
{
"type": "endpoint",
"name": "Production API",
"labels": {
"service": "checkout",
"environment": "production"
},
"config": {
"url": "https://api.example.com/health",
"method": "GET",
"follow_redirects": true,
"max_redirects": 5,
"expected_status_codes": ["200-399"],
"timeout_ms": 10000
}
}POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/targets HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: target-create-20260826-002
{
"type": "dns_record",
"name": "Production API DNS",
"labels": {
"service": "checkout",
"environment": "production"
},
"config": {
"record_name": "www.example.com",
"record_type": "A"
}
}{
"data": {
"id": "target_01J5Z8M4Q9K7P6N2H1W8R5T3A1",
"workspace_id": "workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X",
"type": "endpoint",
"name": "Production API",
"status": "healthy",
"labels": {
"service": "checkout",
"environment": "production"
},
"created_at": "2026-08-25T14:30:00Z",
"updated_at": "2026-08-25T14:30:00Z"
},
"request_id": "req_01J5Z8T6N9QVH6CY7W0Z6QG1F2"
}Create A Check
Checks hold schedules, thresholds, and product-specific rule configuration. The same endpoint target can have both endpoint_availability and ssl_certificate checks.
Endpoint response-time thresholds use thresholds.response_time_ms.warning and thresholds.response_time_ms.critical in whole milliseconds. If omitted, Bitaic uses 1000 ms for warning and 3000 ms for critical; custom values must be supplied together, must be positive integers, and critical must be greater than warning and no higher than the check timeout.
Domain Monitoring uses expiration_alert_days as its numeric threshold. It defaults to 30 calendar days and accepts integers from 1 through 365. Nameserver, DNSSEC, and registrar-lock alerts are expected-state checks: they alert only when the relevant expected value is configured.
DNS Monitoring uses dns_resolution checks with launch record types A, AAAA, CNAME, MX, TXT, NS, and CAA records. Default checks run every 60 seconds from us-east, us-west, and eu-west resolver regions, use a 2-second resolver-query timeout, and use max_latency_ms with a 500 ms default. Optional controls include authoritative_check, expected_ttl_seconds, dnssec_validation, and propagation_grace_period_minutes.
POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/targets/target_01J5Z8M4Q9K7P6N2H1W8R5T3A1/checks HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: check-create-20260825-001
{
"type": "endpoint_availability",
"enabled": true,
"schedule": {
"interval_seconds": 60
},
"thresholds": {
"response_time_ms": {
"warning": 1000,
"critical": 3000
}
}
}POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/targets/target_01J5Z9D7M4P2Q8R6T1V3W5X7Y/checks HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: check-create-20260826-002
{
"type": "domain_status",
"enabled": true,
"schedule": {
"interval_hours": 24
},
"expiration_alert_days": 30,
"expected_nameservers": [
"ns1.example-dns.com",
"ns2.example-dns.com"
],
"expected_dnssec_state": "enabled",
"expected_registrar_lock_state": "locked"
}POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/targets/target_01J5ZA9K8W7Q6R5T4Y3U2I1O0/checks HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: check-create-20260826-003
{
"type": "dns_resolution",
"enabled": true,
"schedule": {
"interval_seconds": 60
},
"resolver_regions": [
"us-east",
"us-west",
"eu-west"
],
"expected_values": [
"203.0.113.10"
],
"alert_on_mismatch": true,
"max_latency_ms": 500,
"timeout_ms": 2000,
"authoritative_check": true,
"expected_ttl_seconds": {
"min": 60,
"max": 3600
},
"dnssec_validation": "observe",
"propagation_grace_period_minutes": 30
}Retrieve Metrics
Metrics are queried by target, check, metric name, and a bounded time window. Use rollup and interval for charts, reports, and exports that do not need raw samples.
Domain Monitoring emits domain.days_until_expiration when expiration data is available. Domain check records also expose registrar, registry status, nameserver state, DNSSEC state, registrar-lock state, RDAP/WHOIS retrieval state, and checked timestamp.
GET /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/metrics?target_id=target_01J5Z8M4Q9K7P6N2H1W8R5T3A1&metric=endpoint.response_time_ms&from=2026-08-25T13:30:00Z&to=2026-08-25T14:30:00Z&rollup=avg&interval=5m HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Accept: application/json{
"data": [
{
"target_id": "target_01J5Z8M4Q9K7P6N2H1W8R5T3A1",
"check_id": "check_01J5ZA8FJ2N7G5Q0HF4P12V7XD",
"metric": "endpoint.response_time_ms",
"unit": "ms",
"value": 248,
"observed_at": "2026-08-25T14:30:00Z"
}
],
"pagination": {
"next_cursor": null,
"has_more": false
},
"request_id": "req_01J5Z8T6N9QVH6CY7W0Z6QG1F2"
}Pagination, Filtering, And Limits
- List APIs support cursor pagination with
limitandcursor. The default limit is50, and the maximum limit is100. - Cursor responses include
pagination.next_cursorandpagination.has_more. - Metric and delivery queries require bounded
fromandtotimestamps. - Rate-limit responses include
RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset, andRetry-Afteron429.
| Area | Common filters |
|---|---|
| Targets and checks | type, target_id, check_type, status, state, enabled, agent_id, label |
| Alerts | state, severity, source, target_id, check_id, from, to |
| Metrics | target_id, check_id, metric, from, to, rollup, interval |
| Webhook deliveries | subscription_id, event_type, status, from, to |
Permissions And Token Scopes
Use separate tokens for read-only reporting, configuration automation, alert operations, and integration management. A token can act only inside the workspace and scopes assigned to it.
| Scope | Allows |
|---|---|
targets:read | Read monitored targets and target status. |
targets:write | Create, update, or delete monitored targets. |
checks:read | Read check configuration and check results. |
checks:write | Create, update, delete, or run checks. |
metrics:read | Read current and historical metrics. |
alerts:read | Read alert records. |
alerts:write | Acknowledge, annotate, assign, or resolve alerts. |
agents:read | Read agent inventory and last-seen status. |
agents:write | Update agent display metadata or desired state. |
integrations:read | Read integration and webhook configuration. |
integrations:write | Create, update, test, or remove integrations and webhooks. |
exports:read | Read export status and download completed exports. |
exports:write | Start export jobs. |
Manage Integrations
Use integration resources for built-in provider destinations such as Slack, Microsoft Teams, email, and PagerDuty preview routing. Custom event receivers use webhook subscriptions.
| Provider ID | Status | Common config | Notes |
|---|---|---|---|
slack | Launch-ready | channel_id, filters, include_recoveries | Bitaic app authorization with posting access to selected channels. |
microsoft_teams | Launch-ready | workflow_webhook_url, filters, include_recoveries | Teams Workflows webhook URL for new channel delivery. |
email | Launch-ready | recipients, filters, include_recoveries | Verified recipients or group inboxes managed from notification settings. |
pagerduty | Preview | routing_key, service_name, severity_map, filters | Events API v2 routing key with Bitaic alert IDs as dedup keys. |
POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/integrations HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: integration-create-20260825-001
{
"provider": "slack",
"name": "Production operations alerts",
"enabled": true,
"filters": {
"severity": ["warning", "critical"],
"product": ["endpoint", "ssl"],
"label": {
"environment": "production"
},
"state": ["open", "resolved"]
},
"config": {
"channel_id": "C0123456789",
"include_recoveries": true
}
}{
"data": {
"id": "int_01J5ZAG2FF4V18T8G3J8K4N6XQ",
"workspace_id": "workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X",
"provider": "slack",
"name": "Production operations alerts",
"enabled": true,
"status": "active",
"filters": {
"severity": ["warning", "critical"],
"product": ["endpoint", "ssl"],
"label": {
"environment": "production"
},
"state": ["open", "resolved"]
},
"created_at": "2026-08-25T14:30:00Z",
"updated_at": "2026-08-25T14:30:00Z"
},
"request_id": "req_01J5ZAHX5TWW2E1V8W9S3CVR42"
}- Integration filters support
severity,product,target_id,check_id,label,team,service, andstatewhere the provider and selected event include that field. - PagerDuty preview uses Events API v2 routing keys and the Bitaic alert ID as the PagerDuty
dedup_key. - API keys are created from Bitaic App settings and controlled by token scopes rather than integration routing filters.
Errors And Recovery
| Status | Meaning | Recovery |
|---|---|---|
400 | Request body, query, or parameter is malformed. | Fix the request syntax and retry. |
401 | Authentication token is missing, expired, or invalid. | Rotate or reissue the token, then retry the request. |
403 | The token lacks the required workspace or scope permission. | Use a token with the required least-privilege scope. |
404 | The resource does not exist in the active workspace. | Check the workspace and resource ID. |
409 | The requested write conflicts with current state. | Reload the resource, apply the current state, and retry. |
422 | The request is syntactically valid but fails validation. | Fix the field named in the error details and retry. |
429 | The client exceeded a rate limit. | Honor Retry-After, reduce concurrency, and use backoff. |
5xx | Bitaic could not complete the request. | Retry safe requests with backoff and include the request ID. |
{
"error": {
"code": "validation_failed",
"message": "One or more request fields are invalid.",
"field": "config.expected_status_codes",
"details": [
{
"field": "config.expected_status_codes",
"message": "At least one expected status code is required."
}
]
},
"request_id": "req_01J5Z8W6YF5QA20NHJ9FE7J7VQ"
}Manage Webhook Subscriptions
Webhook subscriptions define where Bitaic sends events, which event names are selected, which filters apply, and whether delivery is currently enabled.
| Field | Meaning |
|---|---|
id | Webhook subscription identifier. |
url | Customer-owned HTTPS receiver URL. |
events | Explicit event names delivered to the subscription. |
filters | Optional severity, product, target, check, agent, or label filters. |
enabled | User-controlled delivery pause or resume flag. |
status | Delivery health such as active, degraded, or disabled_by_system. |
secret_last_rotated_at | Timestamp of the most recent signing-secret rotation. |
POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/webhook-subscriptions HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: webhook-subscription-20260825-001
{
"url": "https://automation.example.com/bitaic/webhooks",
"description": "Production operations receiver",
"events": [
"alert.created",
"alert.resolved",
"endpoint.check_failed",
"ssl.expiring",
"agent.offline"
],
"filters": {
"severity": ["warning", "critical"],
"product": ["endpoint", "ssl"],
"label": {
"environment": "production"
}
},
"enabled": true
}{
"data": {
"id": "whsub_01J5Z8ZYK2M4X7P2Q9BH8E3E2R",
"workspace_id": "workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X",
"url": "https://automation.example.com/bitaic/webhooks",
"description": "Production operations receiver",
"events": [
"alert.created",
"alert.resolved",
"endpoint.check_failed",
"ssl.expiring",
"agent.offline"
],
"filters": {
"severity": ["warning", "critical"],
"product": ["endpoint", "ssl"],
"label": {
"environment": "production"
}
},
"enabled": true,
"status": "active",
"signing_secret": "whsec_01J5Z92Y3EJ9G5X8S5PS7VN2BB",
"secret_last_rotated_at": "2026-08-25T14:30:00Z",
"created_at": "2026-08-25T14:30:00Z",
"updated_at": "2026-08-25T14:30:00Z"
},
"request_id": "req_01J5Z930ZPK7VYV3XG3C7Z9WNQ"
}- Bitaic returns
signing_secretonly when a subscription is created or rotated. - Rotate a secret with
/v1/workspaces/{workspace_id}/webhook-subscriptions/{subscription_id}/secret/rotate. - During rotation, Bitaic includes signatures for the current and previous secret for 24 hours so receivers can deploy the new secret without dropping events.
Webhook Events
| Event | When it fires | Payload focus | Common consumers |
|---|---|---|---|
alert.created | A new alert opens. | alert, target, check | Incident tools, chat channels, ticketing systems. |
alert.updated | An alert changes severity, owner, note, or routing state. | alert, changes | Incident records, automation workflows. |
alert.resolved | An alert returns to clear or resolved state. | alert, resolution | Incident closure, status summaries, reporting. |
endpoint.check_failed | An endpoint availability check fails. | target, check, result, alert | On-call routing, service dashboards. |
endpoint.recovered | An endpoint returns to healthy state. | target, check, result, alert | Recovery automation, incident updates. |
ssl.expiring | A certificate enters its configured expiration window. | target, check, certificate, alert | Renewal workflows, ticket queues. |
ssl.renewed | A certificate check observes a renewed certificate. | target, check, certificate | Renewal confirmation, compliance evidence. |
domain.status_changed | A monitored domain moves between healthy, at-risk, degraded, unavailable, or unknown states. | target, check, domain, alert | Domain operations, escalation workflows. |
dns.lookup_failed | A DNS lookup cannot resolve successfully. | target, check, dns_result, alert | Network operations, incident workflows. |
dns.record_mismatch | A DNS answer differs from the configured expected value. | target, check, dns_result, alert | Change review, DNS operations. |
agent.offline | An agent stops reporting within its expected window. | agent, target, alert | Collector health automation, operations channels. |
agent.recovered | An agent resumes reporting. | agent, target, alert | Recovery automation, operational reports. |
webhook.test | A user sends a test delivery for a subscription. | subscription, test | Receiver validation, deployment checks. |
Webhook Payload And Security
Webhook deliveries use HTTPS, include a unique event ID, and provide the event name, delivery timestamp, workspace context, and related resource payload. Receivers should verify the signature before processing the event.
Reject unsigned deliveries, failed signature checks, stale timestamps, and duplicate event IDs before triggering downstream automation.
POST /bitaic/webhooks HTTP/1.1
Host: automation.example.com
Content-Type: application/json
X-Bitaic-Event: alert.created
X-Bitaic-Delivery: whd_01J5Z91CBA9W37F68JTE7W8JEV
X-Bitaic-Timestamp: 2026-08-25T14:30:00Z
X-Bitaic-Signature: v1=<hex_hmac_sha256>{
"event_id": "evt_01J5Z91CBA9W37F68JTE7W8JEV",
"event_type": "alert.created",
"api_version": "v1",
"created_at": "2026-08-25T14:30:00Z",
"workspace_id": "workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X",
"subscription_id": "whsub_01J5Z8ZYK2M4X7P2Q9BH8E3E2R",
"delivery_id": "whd_01J5Z91CBA9W37F68JTE7W8JEV",
"attempt": 1,
"data": {
"alert": {
"id": "alert_01J5Z8P2A9W8H2XP0J4K3V7B8C",
"severity": "critical",
"state": "open",
"summary": "Endpoint response time exceeded threshold",
"target_id": "target_01J5Z8M4Q9K7P6N2H1W8R5T3A1",
"check_id": "check_01J5ZA8FJ2N7G5Q0HF4P12V7XD"
},
"target": {
"id": "target_01J5Z8M4Q9K7P6N2H1W8R5T3A1",
"type": "endpoint",
"name": "Production API"
}
}
}- Build the signed value from
X-Bitaic-Timestamp + "." + X-Bitaic-Delivery + "." + raw_request_body. - Validate
X-Bitaic-Signatureby calculating an HMAC-SHA256 digest with the webhook signing secret and comparing thev1value in constant time. - Verify the raw request body before JSON parsing, and reject timestamps older than five minutes.
- Treat
event_idandX-Bitaic-Deliveryas idempotency values to prevent duplicate processing. - Respond with a
2xxstatus after successful processing. - During secret rotation, accept any valid
v1signature generated by either the current or previous signing secret.
Delivery Guarantees And Retries
Webhooks are delivered at least once. Consumers should handle duplicate deliveries and should not depend on global ordering across subscriptions, products, or targets.
| Condition | Behavior | Retry handling |
|---|---|---|
| 2xx | Delivery succeeds. | No retry. |
| Network, TLS, timeout, 408, 429, or 5xx | Temporary failure. | Retry with jitter after roughly 1m, 5m, 15m, 1h, 4h, 12h, 24h, and 48h. |
| 3xx, 400, 401, 403, 404, 410, or 422 | Terminal failure for that event delivery. | No retry. |
| Repeated production failures | Subscription becomes degraded, then disabled_by_system after 50 consecutive failures or 72 hours after the first failed production delivery without a successful production delivery. | Fix the receiver and re-enable the subscription. |
Bitaic retains webhook delivery attempt records for 30 days. Test deliveries use the same timeout and signature behavior as production deliveries, but they do not count toward system-disable thresholds.
Webhook Delivery Records
Use delivery records to troubleshoot receiver failures, identify retry timing, and correlate downstream automation with Bitaic event IDs.
| Status | Meaning |
|---|---|
pending | The delivery has been queued but not attempted. |
delivered | The receiver returned a 2xx response. |
retrying | The last attempt failed temporarily and another attempt is scheduled. |
failed | The receiver returned a terminal response or retries were exhausted. |
discarded | Delivery was skipped because the subscription was disabled. |
GET /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/webhook-deliveries?subscription_id=whsub_01J5Z8ZYK2M4X7P2Q9BH8E3E2R&status=retrying&from=2026-08-25T00:00:00Z&to=2026-08-25T23:59:59Z HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Accept: application/json{
"data": [
{
"id": "whd_01J5Z91CBA9W37F68JTE7W8JEV",
"event_id": "evt_01J5Z91CBA9W37F68JTE7W8JEV",
"event_type": "alert.created",
"subscription_id": "whsub_01J5Z8ZYK2M4X7P2Q9BH8E3E2R",
"status": "retrying",
"attempt": 2,
"response_status": 503,
"next_attempt_at": "2026-08-25T14:36:00Z",
"created_at": "2026-08-25T14:30:00Z",
"updated_at": "2026-08-25T14:31:00Z"
}
],
"pagination": {
"next_cursor": null,
"has_more": false
},
"request_id": "req_01J5Z9KJCPZ85FRJN2X7B2S4MD"
}Data Export
API exports support operational reporting, compliance review, backup, and downstream analytics. Export requests should include the resource area, target scope, time window, and desired output format.
POST /v1/workspaces/workspace_01J5Z82DB7YV6PRPK6K4WSGJ5X/exports HTTP/1.1
Host: api.bitaic.com
Authorization: Bearer <token>
Content-Type: application/json
Idempotency-Key: export-20260825-001
{
"resource": "alerts",
"format": "csv",
"from": "2026-08-01T00:00:00Z",
"to": "2026-08-25T23:59:59Z",
"filters": {
"state": "resolved",
"severity": ["warning", "critical"]
}
}Security Notes
- Use least-privilege tokens for automation and rotate them on a regular schedule.
- Separate read-only reporting tokens from tokens that can create, update, or delete configuration.
- Restrict webhook receivers to HTTPS endpoints controlled by your organization.
- Log
request_id,event_id, and delivery IDs in downstream systems for support and audit review. - Avoid forwarding secrets, credentials, or unnecessary sensitive details through webhook payloads or exports.
Related Workflows
- Integrations for Slack, Microsoft Teams, email, PagerDuty, and custom webhook routing.
- Certificate Monitoring for certificate status, expiration thresholds, and HTTPS certificate diagnostics.
- Endpoint Monitoring for endpoint availability, response time, and uptime states.
- DNS Monitoring for resolver checks, DNS latency, and record mismatches.
- Domain Monitoring for expiration, registry metadata, nameserver, DNSSEC, and registrar-lock signals.
- Audit for reviewing administrative and security-relevant activity.