{"openapi":"3.0.0","paths":{"/v1/workspaces/{id}/analytics/campaigns":{"get":{"operationId":"AnalyticsController_campaigns","x-required-scope":"analytics.view","summary":"Campaign delivery analytics for a date range","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign analytics"}},"tags":["Analytics"],"security":[{"api-key":[]}],"description":"**Required scope:** `analytics.view`"}},"/v1/workspaces/{id}/analytics/overview":{"get":{"operationId":"AnalyticsController_overview","x-required-scope":"analytics.view","summary":"Headline dashboard metrics for a date range","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Overview analytics"}},"tags":["Analytics"],"security":[{"api-key":[]}],"description":"**Required scope:** `analytics.view`"}},"/v1/workspaces/{id}/campaigns":{"get":{"operationId":"CampaignController_list","x-required-scope":"campaign.view","summary":"List this workspace's campaigns","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Campaigns"}},"tags":["Campaigns"],"security":[{"api-key":[]}],"description":"**Required scope:** `campaign.view`"}},"/v1/workspaces/{id}/campaigns/count":{"get":{"operationId":"CampaignController_count","x-required-scope":"campaign.view","summary":"Get the authoritative campaign count for the active filters","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Filtered campaign count"}},"tags":["Campaigns"],"security":[{"api-key":[]}],"description":"**Required scope:** `campaign.view`"}},"/v1/workspaces/{id}/campaigns/{campaignId}":{"get":{"operationId":"CampaignController_get","x-required-scope":"campaign.view","summary":"Get a campaign, including its recipient status counts","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign"},"404":{"description":"Not found"}},"tags":["Campaigns"],"security":[{"api-key":[]}],"description":"**Required scope:** `campaign.view`"}},"/v1/workspaces/{id}/campaigns/{campaignId}/report":{"get":{"operationId":"CampaignController_getReport","x-required-scope":"campaign.view","summary":"Named funnel rates, currency-separated cost reconciliation, and structured all-recipient failure aggregation for a campaign","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"campaignId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Campaign report"},"404":{"description":"Not found"}},"tags":["Campaigns"],"security":[{"api-key":[]}],"description":"**Required scope:** `campaign.view`"}},"/v1/workspaces/{id}/contacts":{"get":{"operationId":"ContactController_list","x-required-scope":"contact.view","summary":"List (and optionally search/filter-by-tag) contacts","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Contacts"}},"tags":["Contacts"],"security":[{"api-key":[]}],"description":"**Required scope:** `contact.view`"}},"/v1/workspaces/{id}/contacts/count":{"get":{"operationId":"ContactController_count","x-required-scope":"contact.view","summary":"Get the authoritative contact count for the active filters","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Filtered contact count"}},"tags":["Contacts"],"security":[{"api-key":[]}],"description":"**Required scope:** `contact.view`"}},"/v1/workspaces/{id}/contacts/{contactId}":{"get":{"operationId":"ContactController_get","x-required-scope":"contact.view","summary":"Get a contact","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Contact"},"404":{"description":"Not found"}},"tags":["Contacts"],"security":[{"api-key":[]}],"description":"**Required scope:** `contact.view`"}},"/v1/workspaces/{id}/contacts/{contactId}/consents":{"get":{"operationId":"ContactController_listConsents","x-required-scope":"contact.view","summary":"Get a contact's consent ledger (append-only, newest first)","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"contactId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Consent entries"}},"tags":["Contacts"],"security":[{"api-key":[]}],"description":"**Required scope:** `contact.view`"}},"/v1/workspaces/{id}/tags":{"get":{"operationId":"TagController_list","x-required-scope":"contact.view","summary":"List every tag in the workspace","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Tags"}},"tags":["Tags"],"security":[{"api-key":[]}],"description":"**Required scope:** `contact.view`"}},"/v1/workspaces/{id}/templates":{"get":{"operationId":"TemplateController_list","x-required-scope":null,"summary":"List the workspace's WhatsApp templates","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Templates"}},"tags":["Templates"],"security":[{"api-key":[]}],"description":"**Required scope:** none — any valid API key."}},"/v1/workspaces/{id}/templates/{templateId}":{"get":{"operationId":"TemplateController_get","x-required-scope":null,"summary":"Get a single template","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"templateId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Template"},"404":{"description":"Not found"}},"tags":["Templates"],"security":[{"api-key":[]}],"description":"**Required scope:** none — any valid API key."}}},"info":{"title":"IgniChat Public API","description":"Read your IgniChat workspace's contacts, tags, WhatsApp templates, campaigns and headline analytics, and receive events by webhook.\n\n**Version 1 is read-only.** An API key can call the `GET` operations below; any other method returns `403 api_key.write_not_supported`.\n\n**Authentication.** Send `Authorization: Bearer <key>`. A key belongs to one workspace and carries only the scopes chosen when it was created.\n**Rate limit.** 300 requests per minute per key. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`; a `429` also carries `Retry-After`.\n**Pagination.** Cursor based: pass `limit` (1–100) and the `nextCursor` of the previous page. There is no offset.\n**Errors.** `{ \"error\": { \"code\": \"…\", \"message\": \"…\", \"requestId\": \"…\" } }`. Quote the `requestId` when contacting support.","version":"1.0.0","contact":{"name":"IgniChat developer support","url":"https://ignichat.ignisparx.com/developers","email":""}},"tags":[{"name":"Analytics"},{"name":"Campaigns"},{"name":"Contacts"},{"name":"Tags"},{"name":"Templates"}],"servers":[{"url":"https://ignichat.ignisparx.com"}],"components":{"securitySchemes":{"api-key":{"scheme":"bearer","bearerFormat":"ign_live_… or ign_test_…","type":"http","description":"Create a key in Settings → Developer, choose its scopes, and send it as `Authorization: Bearer <key>`. Keys are read-only in v1."}},"schemas":{}}}