https://www.expertailabs.ai/api/v1Authorization header. Keys are tenant-scoped with permissions read, write, or admin.X-RateLimit-Remaining and Retry-After on 429 responses.cursor from the previous response's next_cursor.{"error": {"code", "message", "details"}}. HTTP status follows REST conventions.X-EAL-Signature against your signing secret before acting.curl https://www.expertailabs.ai/api/v1/health \
-H "Authorization: Bearer eal_live_a1b2c3d4..."{
"status": "ok",
"version": "v1",
"tenant_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"environment": "live",
"scopes": ["read", "write"],
"timestamp": "2026-04-27T19:22:01.118Z"
}Service-level pulse and the calling identity. Use these endpoints in CI to verify connectivity and to confirm a freshly issued key is wired correctly.
/api/v1/healthREADReturns 200 if the v1 API surface is up. If a Bearer key is supplied, the response includes the resolved tenant_id, environment, and granted scopes, useful as a CI smoke test for newly issued keys.
{
"status": "ok",
"version": "v1",
"tenant_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"environment": "live",
"scopes": ["read", "write"],
"timestamp": "2026-04-27T19:22:01.118Z"
}Tenant entities. One organization per franchise location. Organizations may have a parent_organization_id; parent-org reads require an explicit grant from each child (Q3 2026 endpoint).
/api/v1/organizations/meREADReturns the organization tied to the API key making the request.
{
"id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"name": "PuroClean of North Metro Atlanta",
"industry": "restoration",
"parent_organization_id": null,
"settings": {
"timezone": "America/New_York",
"default_locale": "en-US"
},
"created_at": "2025-09-12T14:23:01.418Z"
}/api/v1/organizationsADMINReturns child organizations for parent-corp roll-up access. Requires admin-scope key on a parent organization.
{
"data": [
{
"id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"name": "PuroClean of North Metro Atlanta",
"industry": "restoration",
"grants": ["leads.read", "calls.read", "audit_log.read"]
}
],
"next_cursor": null
}/api/v1/organizationsADMINCreate a new tenant under the calling parent organization. Returns the new organization id and an initial admin invite link.
{
"name": "PuroClean of West Cobb",
"industry": "restoration",
"settings": {
"timezone": "America/New_York"
},
"primary_admin_email": "owner@example.com"
}{
"id": "5b2c7a31-4f98-4a7d-9e2b-c1f7e4a18b62",
"name": "PuroClean of West Cobb",
"parent_organization_id": "ab12c3d4-e5f6-7890-abcd-ef1234567890",
"invite_url": "https://www.expertailabs.ai/invite/itok_a1f3...",
"invite_expires_at": "2026-05-04T17:00:00.000Z",
"created_at": "2026-04-27T17:00:12.314Z"
}/api/v1/organizations/{id}ADMINUpdate name and settings (timezone, locale, integration toggles).
{
"settings": {
"timezone": "America/New_York",
"default_locale": "en-US"
}
}{
"id": "5b2c7a31-4f98-4a7d-9e2b-c1f7e4a18b62",
"settings": {
"timezone": "America/New_York",
"default_locale": "en-US"
},
"updated_at": "2026-04-27T17:02:55.901Z"
}/api/v1/organizations/{id}/grantsADMINA child organization grants read-only access to its parent organization for network roll-up reporting.
{
"parent_organization_id": "ab12c3d4-e5f6-7890-abcd-ef1234567890",
"scopes": ["leads.read", "calls.read", "audit_log.read"],
"expires_at": "2027-04-27T00:00:00.000Z"
}{
"grant_id": "f4e9c2a8-7d31-4b6f-9c83-21e5d4a07b14",
"parent_organization_id": "ab12c3d4-e5f6-7890-abcd-ef1234567890",
"scopes": ["leads.read", "calls.read", "audit_log.read"],
"created_at": "2026-04-27T17:09:33.001Z",
"expires_at": "2027-04-27T00:00:00.000Z"
}Inbound and outbound lead records. Each lead is bound to the calling organization (RLS enforced). The shape below matches the live Postgres schema; additional fields available on the single-record GET include AI-qualification metadata (pain_points, timeline, budget_range, ai_reasoning, qualification_completed_at).
/api/v1/leadsREADCursor-paginated. Default limit 50, max 200. Filter by pipeline_stage, source, and created_at range (?start_at=ISO8601&end_at=ISO8601). Cursors are opaque base64url-encoded JSON.
{
"data": [
{
"id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"organization_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"name": "Sarah Mitchell",
"company": null,
"email": "sarah.mitchell@example.com",
"source": "google_ads",
"lead_score": 87,
"pipeline_stage": "qualified",
"industry": null,
"company_size": null,
"created_at": "2026-04-27T13:22:05.114Z",
"updated_at": "2026-04-27T13:22:09.218Z"
}
],
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wNC0yN1QxMzoyMjowNS4xMTRaIiwiaWQiOiI5ZjFjOGEzMi00ZDY1LTRlMmItOGE5MS0zYzBlN2Q0YjJmMTgifQ"
}/api/v1/leads/{id}READTenant-scoped: returns 404 if the lead belongs to a different organization. Returns the full record including AI-qualification metadata.
{
"id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"organization_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"name": "Sarah Mitchell",
"company": null,
"email": "sarah.mitchell@example.com",
"source": "google_ads",
"lead_score": 87,
"pipeline_stage": "qualified",
"industry": "residential",
"company_size": null,
"pain_points": "Recurring basement moisture after spring rain",
"timeline": "this_week",
"budget_range": null,
"ai_reasoning": "High urgency: water damage signal, recent storm event, in-radius",
"qualification_completed_at": "2026-04-27T13:22:09.218Z",
"created_at": "2026-04-27T13:22:05.114Z",
"updated_at": "2026-04-27T13:22:09.218Z"
}/api/v1/leadsWRITECreates a new lead. Validates email format if provided. At least one of email, or (name + company), is required. Returns 201 with the created record.
{
"name": "Sarah Mitchell",
"email": "sarah.mitchell@example.com",
"source": "website",
"industry": "residential",
"pipeline_stage": "new"
}{
"id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"organization_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"name": "Sarah Mitchell",
"company": null,
"email": "sarah.mitchell@example.com",
"source": "website",
"lead_score": 0,
"pipeline_stage": "new",
"industry": "residential",
"company_size": null,
"created_at": "2026-04-27T13:22:05.114Z",
"updated_at": "2026-04-27T13:22:05.114Z"
}/api/v1/leads/{id}WRITEPartial update. Whitelisted fields only: name, company, email, source, lead_score (0–100), pipeline_stage, industry, company_size, pain_points, timeline, budget_range, ai_reasoning. Every change is recorded in /audit-log as a `lead.updated` event with a per-field diff.
{
"pipeline_stage": "won",
"lead_score": 92
}{
"id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"organization_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"name": "Sarah Mitchell",
"company": null,
"email": "sarah.mitchell@example.com",
"source": "google_ads",
"lead_score": 92,
"pipeline_stage": "won",
"updated_at": "2026-04-27T18:55:42.001Z"
}/api/v1/leads/{id}/scoreWRITEForce a re-score using the latest signals. Returns the new score and explanation.
{
"id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"lead_score": 91,
"ai_reasoning": "Recent storm event in service radius (+0.18); phone validated (+0.10); fast form completion (+0.08)",
"scored_at": "2026-04-27T19:01:15.214Z"
}/api/v1/leads/{id}/push-to-crmWRITEManually trigger a CRM push if the automatic push failed or was skipped. Idempotent: re-pushing returns the existing external_id without creating a duplicate record.
{
"id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"crm_sync": {
"vendor": "jobnimbus",
"external_id": "jn_117422",
"status": "ok",
"last_synced_at": "2026-04-27T19:03:42.118Z"
}
}Outbound prospect records produced by the AI qualification pipeline (separate from inbound `leads`). Includes enrichment data, qualification verdict, and outreach state. Activates during pilot phase.
/api/v1/prospectsREADCursor-paginated. Filter by qualification_status, vertical, outreach_status.
{
"data": [
{
"id": "1c4f7d28-3a90-4e2c-9b3a-8d5f1e0c7a32",
"company_name": "Sandy Springs Property Group",
"contact_name": "Daniel Park",
"contact_email": "dpark@example.com",
"vertical": "property_management",
"qualification_status": "qualified",
"outreach_status": "sequence_active",
"created_at": "2026-04-21T11:08:43.000Z"
}
],
"next_cursor": null
}/api/v1/prospects/qualifyWRITETriggers the AI qualification agent. Returns qualification verdict with structured rationale.
{
"prospect_id": "1c4f7d28-3a90-4e2c-9b3a-8d5f1e0c7a32"
}{
"prospect_id": "1c4f7d28-3a90-4e2c-9b3a-8d5f1e0c7a32",
"qualified": true,
"fit_score": 82,
"rationale": [
"Manages 28 multifamily buildings inside service radius",
"No incumbent restoration vendor on record (last 24 months)",
"Recent water-loss incident reported in news 2026-03"
],
"qualified_at": "2026-04-27T19:08:01.901Z"
}AI-generated blog posts, video scripts, social posts, and review responses. Includes draft, publish, and revision workflows. Activates during pilot phase.
/api/v1/contentREADFilter by type (blog | video | social | review_response), status (draft | scheduled | published), channel.
{
"data": [
{
"id": "ctnt_3p9w7m2q4r",
"type": "blog",
"title": "Water Damage Restoration in Alpharetta, What to Do in the First 24 Hours",
"status": "published",
"channel": "wordpress",
"url": "https://example.com/blog/water-damage-alpharetta-first-24-hours",
"word_count": 1842,
"target_keyword": "water damage alpharetta",
"published_at": "2026-04-22T15:00:00.000Z"
}
],
"next_cursor": null
}/api/v1/content/blogWRITEGenerate an SEO-optimized blog draft for a target keyword and service area.
{
"target_keyword": "mold removal roswell",
"service_area": { "city": "Roswell", "region": "GA", "postal_code": "30075" },
"service_type": "mold_remediation",
"word_count_target": 2000
}{
"id": "ctnt_7k1m4n9z",
"type": "blog",
"status": "draft",
"title": "Mold Removal in Roswell, GA, What Homeowners Need to Know",
"estimated_read_time_min": 9,
"word_count": 2014,
"created_at": "2026-04-27T19:14:08.118Z"
}/api/v1/content/video-scriptWRITEReturns a HeyGen-ready script in scenes with B-roll suggestions, lower-third copy, and a 30s cutdown variant.
{
"topic": "5 signs of hidden water damage in your basement",
"format": "feature",
"duration_seconds": 180
}{
"id": "ctnt_v8r3p2q9",
"type": "video",
"status": "draft",
"scenes": [
{ "scene": 1, "voiceover": "Hidden water damage starts where you can't see it...", "broll_suggestion": "basement wall close-up" }
],
"cutdown_30s_id": "ctnt_v8r3p2q9_30s"
}/api/v1/content/review-responseWRITEGenerates a brand-aligned response. Sentiment is auto-classified; negative reviews route to the franchise owner before any public response.
{
"platform": "google",
"review_id": "g_review_z2x8c4v1",
"rating": 5,
"review_text": "PuroClean was at our house within 45 minutes after a pipe burst...",
"tone": "warm-professional"
}{
"response_text": "Thank you, Sarah! We're glad we could be there fast and get the home dried out, the team appreciates the kind words.",
"sentiment": "positive",
"auto_publish_recommended": true
}/api/v1/content/{id}/publishWRITEPublish to WordPress, social, GBP, or review platform. Returns per-channel status.
{
"channels": ["wordpress", "instagram", "facebook"],
"scheduled_for": null
}{
"id": "ctnt_3p9w7m2q4r",
"results": [
{ "channel": "wordpress", "status": "published", "url": "https://example.com/blog/..." },
{ "channel": "instagram", "status": "queued", "estimated_publish_at": "2026-04-27T20:00:00.000Z" }
]
}Email and SMS sequences, drafts, sends, replies, suppressions, and deliverability events. Activates during pilot phase.
/api/v1/outreach/sequencesREADEmail or SMS sequences with stats (sent, opened, replied, opted-out).
{
"data": [
{
"id": "seq_n4q8p2w7",
"name": "Property-management cold outbound · Q2 2026",
"channel": "email",
"steps": 5,
"active": true,
"stats": { "enrolled": 184, "sent": 612, "opened": 271, "replied": 19, "opted_out": 4 }
}
],
"next_cursor": null
}/api/v1/outreach/sendWRITEOne-off email or SMS. Suppression list and rate limits still apply.
{
"channel": "sms",
"to": "+17705550142",
"body": "Hi Sarah, confirming our crew at 9am tomorrow. Reply HELP for help, STOP to cancel.",
"lead_id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18"
}{
"message_id": "msg_2k4n8q",
"status": "queued",
"channel": "sms",
"queued_at": "2026-04-27T19:30:14.001Z"
}/api/v1/outreach/suppressionsREADUnsubscribes, bounces, manual additions. Each entry includes source and reason.
{
"data": [
{
"id": "sup_t9q4n2",
"channel": "email",
"address": "old.contact@example.com",
"reason": "user_unsubscribe",
"source": "list-unsubscribe-header",
"added_at": "2026-04-22T08:14:11.000Z"
}
],
"next_cursor": null
}/api/v1/outreach/suppressionsWRITEBlock all outbound to this address or number.
{
"channel": "sms",
"address": "+17705559999",
"reason": "manual_owner_request"
}{
"id": "sup_n2m4q8",
"channel": "sms",
"address": "+17705559999",
"added_at": "2026-04-27T19:38:08.901Z"
}Inbound call records ingested from CallRail and other call-tracking platforms. Each record includes recording URL, transcript, AI classification, and dispatch decision. Activates during pilot phase.
/api/v1/callsREADFilter by status, classification (water | fire | mold | biohazard | sales | junk), and qualified flag.
{
"data": [
{
"id": "call_q4n8p2w7",
"tracking_number": "+17705550199",
"caller_number": "+14045550173",
"duration_seconds": 142,
"classification": "water",
"qualified": true,
"urgency": "high",
"dispatch_decision": "auto_dispatch",
"received_at": "2026-04-27T17:42:11.214Z"
}
],
"next_cursor": null
}/api/v1/calls/{id}READReturns the full record: signed recording URL (1-hour TTL), transcript, AI classification with confidence, dispatch decision and reason.
{
"id": "call_q4n8p2w7",
"tracking_number": "+17705550199",
"caller_number": "+14045550173",
"duration_seconds": 142,
"recording_url": "https://signed.expertailabs.ai/recordings/q4n8p2w7?exp=1745783100&sig=...",
"transcript": "Caller: Hi, I have water coming through my basement ceiling, I think a pipe burst...",
"classification": {
"intent": "water",
"confidence": 0.96,
"urgency": "high",
"qualified": true
},
"dispatch_decision": {
"action": "auto_dispatch",
"reason": "in_service_radius + qualified + business_hours",
"sms_callback_sent": true,
"job_created_in_jobnimbus": "jn_117422"
},
"received_at": "2026-04-27T17:42:11.214Z"
}/api/v1/calls/statsREADAggregated counts by classification and qualified flag. Default window: last 7 days. Override with ?window=24h | 7d | 30d | 90d.
{
"window": "7d",
"total_calls": 47,
"qualified": 18,
"junk_filtered": 12,
"by_intent": {
"water": 21,
"fire": 4,
"mold": 6,
"biohazard": 1,
"sales_pitch": 8,
"wrong_number": 4,
"other": 3
},
"median_classification_seconds": 11
}Insurance Documentation Assist generates structured inputs (scope items, photo summaries, room dimensions) that the operator pastes into Xactimate or the carrier portal. We do not write to Xactimate. Activates during pilot phase.
/api/v1/claimsREADEach job represents a claim documentation extraction run.
{
"data": [
{
"id": "clm_8w3p1m",
"job_external_ref": "jn_117422",
"loss_type": "water",
"status": "ready_for_review",
"scope_item_count": 14,
"photo_count": 38,
"created_at": "2026-04-27T18:09:11.000Z"
}
],
"next_cursor": null
}/api/v1/claimsWRITEProvide a CompanyCam project ID or upload photos directly via signed URLs. Extraction runs async; subscribe to claim.scope.ready webhook.
{
"loss_type": "water",
"source": { "vendor": "companycam", "project_id": "cc_proj_5482" },
"job_external_ref": "jn_117422"
}{
"id": "clm_8w3p1m",
"status": "extracting",
"estimated_ready_at": "2026-04-27T18:14:00.000Z",
"created_at": "2026-04-27T18:09:11.000Z"
}/api/v1/claims/{id}READReturns extracted scope items with confidence scores and photo references.
{
"id": "clm_8w3p1m",
"loss_type": "water",
"status": "ready_for_review",
"rooms": [
{
"name": "Basement",
"dimensions": { "length_ft": 24, "width_ft": 18, "height_ft": 8 },
"scope_items": [
{ "code": "WTR DRY3", "description": "Tear out wet drywall, cleanup, bag for disposal", "qty": 312, "unit": "SF", "confidence": 0.94 }
]
}
],
"summary_pdf_url": "https://signed.expertailabs.ai/claims/clm_8w3p1m.pdf?exp=...",
"summary_txt_url": "https://signed.expertailabs.ai/claims/clm_8w3p1m.txt?exp=..."
}/api/v1/claims/{id}/reviewWRITEHuman-in-loop reviewer marks each line as approved, edited, or rejected. Audit-logged.
{
"decisions": [
{ "scope_item_id": "scope_a1", "decision": "approve" },
{ "scope_item_id": "scope_a2", "decision": "edit", "qty": 410, "note": "Re-measured on site" },
{ "scope_item_id": "scope_a3", "decision": "reject", "reason": "Pre-existing damage, not from loss" }
]
}{
"id": "clm_8w3p1m",
"status": "reviewed",
"decisions_recorded": 3,
"reviewed_at": "2026-04-27T19:55:11.000Z"
}Immutable record of every state-changing action in the platform. Stored in `platform_events`. Includes action, source, correlation_id, and a JSON payload describing what changed. Retained 7 years.
/api/v1/audit-logREADCursor-paginated. Filter by action (e.g., lead.updated), source (api | cron | n8n | worker | system), and created_at range (?start_at=ISO8601&end_at=ISO8601). Default limit 50, max 200.
{
"data": [
{
"id": "a4b1c8d2-7e30-4f1a-9c83-21e5d4a07b14",
"organization_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"action": "lead.updated",
"source": "api",
"correlation_id": "corr_z3p7w2",
"payload": {
"lead_id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"diff": {
"pipeline_stage": { "from": "qualified", "to": "won" },
"lead_score": { "from": 87, "to": 92 }
},
"key_id": "k7e2c8a1-4d65-4e2b-8a91-3c0e7d4b2f18"
},
"created_at": "2026-04-27T18:55:42.001Z"
}
],
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wNC0yN1QxODo1NTo0Mi4wMDFaIiwiaWQiOiJhNGIxYzhkMi03ZTMwLTRmMWEtOWM4My0yMWU1ZDRhMDdiMTQifQ"
}/api/v1/audit-log/{id}READTenant-scoped. Returns the full audit record including the payload diff.
{
"id": "a4b1c8d2-7e30-4f1a-9c83-21e5d4a07b14",
"organization_id": "8c2f0a14-0c8a-4a3a-9a4d-3e0f1d6c2a91",
"action": "lead.updated",
"source": "api",
"correlation_id": "corr_z3p7w2",
"payload": {
"lead_id": "9f1c8a32-4d65-4e2b-8a91-3c0e7d4b2f18",
"diff": {
"pipeline_stage": { "from": "qualified", "to": "won" },
"lead_score": { "from": 87, "to": 92 }
},
"key_id": "k7e2c8a1-4d65-4e2b-8a91-3c0e7d4b2f18"
},
"created_at": "2026-04-27T18:55:42.001Z"
}/api/v1/audit-log/export.csvREADStream the audit log as CSV. Same filters as the list endpoint.
Outbound event subscriptions with HMAC-SHA256 signature verification. Subscribe at registration time; the signing secret is returned ONCE, save it. Rotate at any time with a 24-hour overlap window so you can deploy the new secret on the receiver before retiring the old one.
/api/v1/webhooksREADReturns all webhook endpoints registered for the calling organization.
{
"data": [
{
"id": "f4e9c2a8-7d31-4b6f-9c83-21e5d4a07b14",
"url": "https://crm-bridge.example.com/webhook",
"events": ["call.qualified", "lead.created", "claim.scope.ready"],
"description": "Production CRM bridge",
"signing_secret_prefix": "whsec_a1b2c3",
"enabled": true,
"created_at": "2026-02-14T09:11:00.000Z",
"last_delivery_at": "2026-04-27T17:42:18.001Z",
"last_delivery_status": 200
}
]
}/api/v1/webhooks/{id}READReturns subscription metadata. The signing secret itself is never returned, only the public prefix.
{
"id": "f4e9c2a8-7d31-4b6f-9c83-21e5d4a07b14",
"url": "https://crm-bridge.example.com/webhook",
"events": ["call.qualified", "lead.created", "claim.scope.ready"],
"description": "Production CRM bridge",
"signing_secret_prefix": "whsec_a1b2c3",
"enabled": true,
"created_at": "2026-02-14T09:11:00.000Z",
"last_delivery_at": "2026-04-27T17:42:18.001Z",
"last_delivery_status": 200
}/api/v1/webhooksADMINSubscribe to one or more event types. The endpoint must be HTTPS. We return a signing secret used for HMAC verification, save it; we will not show it again. Valid event names: call.received, call.classified, call.qualified, lead.created, lead.updated, outreach.email.sent, outreach.email.replied, claim.scope.ready, review.requested, review.received, audit.log.event.
{
"url": "https://crm-bridge.example.com/webhook",
"events": ["call.qualified", "lead.created", "claim.scope.ready"],
"description": "Production CRM bridge"
}{
"id": "f4e9c2a8-7d31-4b6f-9c83-21e5d4a07b14",
"url": "https://crm-bridge.example.com/webhook",
"events": ["call.qualified", "lead.created", "claim.scope.ready"],
"description": "Production CRM bridge",
"signing_secret_prefix": "whsec_a1b2c3",
"enabled": true,
"created_at": "2026-02-14T09:11:00.000Z",
"signing_secret": "whsec_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"_warning": "Save this signing_secret now. It will not be shown again."
}/api/v1/webhooks/{id}ADMINStops sending events to this endpoint immediately.
{
"id": "f4e9c2a8-7d31-4b6f-9c83-21e5d4a07b14",
"deleted": true
}/api/v1/webhooks/{id}/rotate-secretADMINReturns a new secret. The previous secret remains valid for 24 hours, so you can deploy the new one on the receiver before retiring the old.
{
"id": "f4e9c2a8-7d31-4b6f-9c83-21e5d4a07b14",
"url": "https://crm-bridge.example.com/webhook",
"signing_secret_prefix": "whsec_z9y8x7",
"signing_secret": "whsec_z9y8x7w6v5u4t3s2r1q0p9o8n7m6l5k4",
"_warning": "Save this signing_secret now. It will not be shown again. The previous secret remains valid for 24 hours."
}/api/v1/webhooks/{id}/deliveriesREADList the last 100 delivery attempts with status, response code, latency, and retry count.
{
"data": [
{
"id": "whd_8w3p1m",
"event": "call.qualified",
"status": "delivered",
"response_status": 200,
"latency_ms": 142,
"attempt": 1,
"delivered_at": "2026-04-27T17:42:18.001Z"
}
],
"next_cursor": null
}| Event | Description |
|---|---|
call.received | New inbound call ingested from CallRail or other tracker |
call.classified | AI classification finished; includes intent, urgency, qualified flag |
call.qualified | A call was determined to be a qualified lead |
lead.created | New lead added to the system |
lead.updated | Lead status, score, or fields changed |
outreach.email.sent | Outbound email sent |
outreach.email.replied | Reply received and classified |
claim.scope.ready | Insurance documentation extraction completed and ready for review |
review.requested | Customer was sent a review request after job completion |
review.received | New review detected on Google or another listing surface |
audit.log.event | Stream of audit events; opt-in for compliance integrations |