SureContact Public API for external integrations.
This documentation provides all the information you need to work with the SureContact Public API.
All Public API endpoints require an API key. Include it in the request header:
X-API-Key: surecontact_your_api_key_here
Or using the Authorization header with Bearer prefix:
Authorization: Bearer surecontact_your_api_key_here
API requests are rate-limited based on your organization's plan. Rate limit information is included in response headers:
X-RateLimit-Limit - Maximum requests allowedX-RateLimit-Remaining - Remaining requests in the windowX-RateLimit-Reset - Unix timestamp when the limit resetsTo authenticate requests, include a X-API-Key header with the value "{YOUR_API_KEY}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can create API keys from the Profile > API Keys section in the dashboard.
APIs for managing landing pages within a workspace. Landing pages can be created as drafts and published with a custom slug and optional custom domain.
Get all landing pages for the current workspace with optional filtering and sorting.
Search pages by name.
Filter by status: draft, published, scheduled, archived.
Sort field. Allowed: name, created_at, updated_at, status.
Sort direction: asc or desc. Default: desc.
Number of items per page (1–100). Default: 15.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/pages?search=My+Landing+Page&status=published&sort_by=created_at&sort_order=desc&per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"search\": \"b\",
\"status\": \"scheduled\",
\"sort_by\": \"created_at\",
\"sort_order\": \"asc\",
\"per_page\": 22
}"
{
"success": true,
"message": "",
"data": [
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Summer Sale",
"slug": "summer-sale",
"description": "Our summer promotion page",
"status": {
"value": "published",
"label": "Published",
"color": "green",
"icon": "check"
},
"is_password_protected": false,
"thumbnail": "https://example.com/thumb.jpg",
"custom_domain": null,
"published_at": "2026-06-01T10:00:00+00:00",
"created_at": "2026-05-20T08:00:00+00:00",
"updated_at": "2026-06-01T10:00:00+00:00",
"urls": {
"public": "https://pages.example.com/summer-sale"
}
}
],
"meta": {
"current_page": 1,
"per_page": 15,
"total": 1
}
}
Retrieve a single landing page including its full design JSON.
The UUID of the landing page.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/pages/b4413073-0f89-47d6-b230-4e3db2057a08" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"message": "",
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Summer Sale",
"slug": "summer-sale",
"description": "Our summer promotion landing page",
"design_json": {},
"status": {
"value": "published",
"label": "Published",
"color": "green",
"icon": "check"
},
"is_password_protected": false,
"seo": {
"title": "Summer Sale 2026",
"description": null,
"og_image": null,
"og_title": null,
"og_description": null,
"canonical_url": null,
"no_index": false
},
"tracking": {
"gtm_id": null,
"pixel_id": null
},
"thumbnail": null,
"custom_domain": null,
"published_at": "2026-06-01T10:00:00+00:00",
"created_at": "2026-05-20T08:00:00+00:00",
"updated_at": "2026-06-01T10:00:00+00:00",
"urls": {
"public": "https://pages.example.com/summer-sale"
}
}
}
Create a new landing page as a draft. Optionally initialise it from an existing template.
Tip — building
design_jsonprogrammatically? Use the SureContact Claude Skills to generate a complete, validdesign_jsonpayload from a plain-text description. The skill produces ready-to-use JSON that you can pass directly to this endpoint without touching the visual builder.
curl --request POST \
"https://api.surecontact.com/api/v1/public/pages" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Summer Sale\",
\"description\": \"Our summer promotion landing page\",
\"design_json\": [],
\"template_uuid\": \"550e8400-e29b-41d4-a716-446655440000\"
}"
{
"success": true,
"message": "Page created successfully",
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Summer Sale",
"slug": null,
"description": "Our summer promotion landing page",
"design_json": {},
"status": {
"value": "draft",
"label": "Draft",
"color": "gray",
"icon": "file"
},
"is_password_protected": false,
"seo": {
"title": null,
"description": null,
"og_image": null,
"og_title": null,
"og_description": null,
"canonical_url": null,
"no_index": false
},
"tracking": {
"gtm_id": null,
"pixel_id": null
},
"thumbnail": null,
"custom_domain": null,
"published_at": null,
"created_at": "2026-06-01T10:00:00+00:00",
"updated_at": "2026-06-01T10:00:00+00:00",
"urls": {
"public": null
}
}
}
Update an existing landing page. All fields are optional — only supplied fields are updated.
Tip — building
design_jsonprogrammatically? Use the SureContact Claude Skills to generate a complete, validdesign_jsonpayload from a plain-text description. The skill produces ready-to-use JSON that you can pass directly to this endpoint without touching the visual builder.
The UUID of the landing page.
curl --request PUT \
"https://api.surecontact.com/api/v1/public/pages/b4413073-0f89-47d6-b230-4e3db2057a08" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Summer Sale 2026\",
\"description\": \"Updated summer promo\",
\"design_json\": [],
\"seo_title\": \"Summer Sale 2026 | Acme\",
\"seo_description\": \"Shop our summer deals.\",
\"og_image\": \"https:\\/\\/example.com\\/og.jpg\",
\"og_title\": \"Summer Sale\",
\"og_description\": \"Don\'t miss our summer deals!\",
\"canonical_url\": \"https:\\/\\/example.com\\/summer-sale\",
\"no_index\": false,
\"gtm_id\": \"GTM-ABC1234\",
\"pixel_id\": \"123456789012345\",
\"thumbnail\": \"https:\\/\\/example.com\\/thumb.jpg\"
}"
{
"success": true,
"message": "Page updated successfully",
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Summer Sale 2026",
"slug": "summer-sale",
"description": "Updated summer promo",
"design_json": {},
"status": {
"value": "draft",
"label": "Draft",
"color": "gray",
"icon": "file"
},
"is_password_protected": false,
"seo": {
"title": "Summer Sale 2026 | Acme",
"description": "Shop our summer deals.",
"og_image": null,
"og_title": null,
"og_description": null,
"canonical_url": null,
"no_index": false
},
"tracking": {
"gtm_id": null,
"pixel_id": null
},
"thumbnail": null,
"custom_domain": null,
"published_at": null,
"created_at": "2026-05-20T08:00:00+00:00",
"updated_at": "2026-06-01T11:00:00+00:00",
"urls": {
"public": null
}
}
}
Soft-delete a landing page. The page is removed from the workspace and its public URL is unpublished.
The UUID of the landing page.
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/pages/b4413073-0f89-47d6-b230-4e3db2057a08" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"message": "Page deleted successfully",
"data": null
}
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/automations" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request GET \
--get "https://api.surecontact.com/api/v1/public/automations/691e8cef-9803-43e2-9423-645fa39bd176" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Manually triggers an active automation for a contact. The automation
runs asynchronously through the standard execution pipeline. Both the
contact and the automation must belong to the caller's workspace, and
the automation must be in active status.
Sibling of ContactController::startAutomation, which takes the automation_uuid from the request body. This variant takes both entities from the URL — used by the public API.
UUID of the contact.
UUID of the automation.
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/automations/7c9e6679-7425-40de-944b-e07fc1f90ae7/start" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"message": "Automation has been scheduled successfully",
"data": {
"automation_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"automation_name": "Welcome Workflow"
}
}
APIs for managing email campaigns within a workspace. Build, configure, and preview campaigns programmatically. The actual send action is intentionally not exposed through the API — campaigns must be sent from the SureContact UI so a human always reviews recipients and content before any blast goes out.
Get all campaigns for the current workspace with optional filtering and pagination.
Search campaigns by name or subject.
Filter by campaign status (draft, scheduled, sending, sent, paused, cancelled, failed).
Sort column. Allowed: name, status, send_at, scheduled_at, completed_at, created_at, updated_at.
Sort order: asc or desc. Default: desc.
Number of items per page. Default: 15.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/campaigns?search=Welcome&status=draft&per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Welcome Series",
"subject": "Welcome to our newsletter!",
"from_name": "Acme Co",
"from_email": "[email protected]",
"status": {
"value": "draft",
"label": "Draft",
"color": "gray"
},
"recipient_count": 0,
"created_at": "2025-01-15T10:30:00+00:00"
}
],
"meta": {
"current_page": 1,
"per_page": 15,
"total": 1
}
}
Get full details of a specific campaign including content, recipients, and stats.
The UUID of the campaign.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Spring Sale 2025",
"subject": "25% off everything",
"from_name": "Acme Co",
"from_email": "[email protected]",
"status": {
"value": "draft",
"label": "Draft",
"color": "gray"
},
"recipient_count": 1250,
"created_at": "2025-01-15T10:30:00+00:00"
}
}
Get a sample of contacts that match the campaign's recipient filters. Useful for confirming the audience before sending. Returns up to 100 recipients per call.
The UUID of the campaign.
Maximum number of recipients to return. Max 100. Default: 50.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000/recipients?limit=25" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Doe"
}
]
}
Get the total number of contacts that match the campaign's recipient filters. Faster than listing recipients when you only need the count.
The UUID of the campaign.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000/recipients/count" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"count": 1250
}
}
Get the contacts a campaign was sent to, including per-contact engagement data (sent, delivered, opened, clicked, bounced, etc.). Paginated.
The UUID of the campaign.
Filter by send status. One of: pending, queued, sent, delivered, failed, bounced.
Filter to contacts that opened (true) or did not open (false) the email.
Filter to contacts that clicked (true) or did not click (false) any link.
Search contacts by email, first name, last name, or company.
Number of items per page. Default: 15.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000/contacts?status=delivered&opened=1&clicked=1&search=jane%40&per_page=25" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Doe",
"sent_at": "2025-01-15T10:31:12+00:00",
"opened_at": "2025-01-15T10:45:00+00:00",
"clicked_at": null,
"status": "opened"
}
],
"meta": {
"current_page": 1,
"per_page": 15,
"total": 1250
}
}
Get live sending progress for a campaign currently in sending status.
Returns 400 for campaigns in any other status. Poll this endpoint to
watch a send in real time.
The UUID of the campaign.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000/progress" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Spring Sale 2025",
"status": {
"value": "sending",
"label": "Sending",
"color": "blue"
},
"progress": {
"total": 1250,
"sent": 800,
"failed": 5,
"remaining": 445,
"percentage": 64
}
}
}
Render the campaign's HTML and text content with merge tags resolved against
a real contact in the workspace. Pass a contact_uuid to preview as a
specific contact, or omit it to use the first matching recipient.
The UUID of the campaign.
curl --request POST \
"https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000/preview" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuid\": \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\"
}"
{
"success": true,
"data": {
"html": "<p>Hello Jane!</p>",
"text": "Hello Jane!",
"subject": "Welcome, Jane",
"from_name": "Acme Co",
"from_email": "[email protected]",
"preview_contact": {
"uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"email": "[email protected]",
"name": "Jane Doe"
}
}
}
Create a new campaign as a draft. Only the name is required up front; all
other fields (subject, content, recipients, schedule) can be filled in via
subsequent updates. Created campaigns always start in draft status; sending
happens from the UI.
curl --request POST \
"https://api.surecontact.com/api/v1/public/campaigns" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Spring Sale 2025\",
\"subject\": \"25% off everything this weekend\",
\"preview_text\": \"Limited time offer\",
\"html_content\": \"<p>Hello {{first_name}}!<\\/p>\",
\"from_name\": \"Acme Co\",
\"from_email\": \"[email protected]\",
\"reply_to\": \"[email protected]\",
\"filters\": {
\"include_lists\": [
\"550e8400-e29b-41d4-a716-446655440000\"
],
\"exclude_lists\": [
\"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\"
],
\"include_tags\": [],
\"exclude_tags\": [
\"d6fa562b-acd5-35ff-babb-d11194d3737b\"
],
\"status\": [
\"architecto\"
],
\"source\": [
\"webhook\"
],
\"engagement\": {
\"opened\": true,
\"clicked\": true,
\"not_opened_in_days\": 22,
\"not_clicked_in_days\": 7,
\"opened_in_days\": 16,
\"clicked_in_days\": 17,
\"opened_campaign_ids\": [
\"a1a0a47d-e8c3-3cf0-8e6e-c1ff9dca5d1f\"
],
\"clicked_campaign_ids\": [
\"21c4122b-d554-3723-966c-6d723ea5293f\"
],
\"not_opened_campaign_ids\": [
\"add3503c-ebff-3875-93af-b8c6a695762b\"
],
\"not_clicked_campaign_ids\": [
\"c3b6b42e-3a0f-3935-b28d-cb767f8a2a0a\"
],
\"included_in_campaign_ids\": [
\"51c7cf5e-fac2-3ac6-8ef8-61e6050503af\"
],
\"not_included_in_campaign_ids\": [
\"d207102d-bce0-31f9-8c36-aa9cf4cfe75a\"
]
},
\"dates\": {
\"created_after\": \"2026-06-08T05:26:39\",
\"created_before\": \"2026-06-08T05:26:39\",
\"last_activity_after\": \"2026-06-08T05:26:39\",
\"last_activity_before\": \"2026-06-08T05:26:39\",
\"inactive_for_days\": 24,
\"active_in_days\": 18
},
\"custom_fields\": [
{
\"field_uuid\": \"3b33fac5-d303-3ce9-8d1f-c931158d7dad\",
\"operator\": \"greater_than\"
}
],
\"filter_groups\": [
{
\"logic\": \"OR\",
\"conditions\": [
{
\"field\": \"y\",
\"operator\": \"u\"
}
]
}
]
},
\"send_at\": \"architecto\",
\"timezone\": \"America\\/New_York\",
\"throttle_limit\": 720,
\"track_opens\": true,
\"track_clicks\": true,
\"utm_source\": \"newsletter\",
\"utm_medium\": \"email\",
\"utm_campaign\": \"spring-sale\",
\"template_uuid\": \"b1d4e9f2-1234-4abc-8def-9876543210ab\"
}"
{
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Spring Sale 2025",
"subject": null,
"status": {
"value": "draft",
"label": "Draft",
"color": "gray"
},
"recipient_count": 0,
"created_at": "2025-01-15T10:30:00+00:00"
}
}
Update fields on an existing draft campaign. All body fields are optional — only the fields you supply will be changed. Drafts can be progressively built up across multiple update calls.
The UUID of the campaign.
curl --request PUT \
"https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Spring Sale 2025 — v2\",
\"subject\": \"Final hours: 25% off\",
\"preview_text\": \"Sale ends tonight\",
\"html_content\": \"architecto\",
\"from_name\": \"Acme Co\",
\"from_email\": \"[email protected]\",
\"reply_to\": \"[email protected]\",
\"filters\": {
\"include_lists\": [
\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\"
],
\"exclude_lists\": [
\"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\"
],
\"include_tags\": [
\"977e5426-8d13-3824-86aa-b092f8ae52c5\"
],
\"exclude_tags\": [
\"d6fa562b-acd5-35ff-babb-d11194d3737b\"
],
\"status\": [
\"architecto\"
],
\"source\": [
\"wordpress\"
],
\"engagement\": {
\"opened\": false,
\"clicked\": true,
\"not_opened_in_days\": 22,
\"not_clicked_in_days\": 7,
\"opened_in_days\": 16,
\"clicked_in_days\": 17,
\"opened_campaign_ids\": [
\"a1a0a47d-e8c3-3cf0-8e6e-c1ff9dca5d1f\"
],
\"clicked_campaign_ids\": [
\"21c4122b-d554-3723-966c-6d723ea5293f\"
],
\"not_opened_campaign_ids\": [
\"add3503c-ebff-3875-93af-b8c6a695762b\"
],
\"not_clicked_campaign_ids\": [
\"c3b6b42e-3a0f-3935-b28d-cb767f8a2a0a\"
],
\"included_in_campaign_ids\": [
\"51c7cf5e-fac2-3ac6-8ef8-61e6050503af\"
],
\"not_included_in_campaign_ids\": [
\"d207102d-bce0-31f9-8c36-aa9cf4cfe75a\"
]
},
\"dates\": {
\"created_after\": \"2026-06-08T05:26:39\",
\"created_before\": \"2026-06-08T05:26:39\",
\"last_activity_after\": \"2026-06-08T05:26:39\",
\"last_activity_before\": \"2026-06-08T05:26:39\",
\"inactive_for_days\": 24,
\"active_in_days\": 18
},
\"custom_fields\": [
{
\"field_uuid\": \"3b33fac5-d303-3ce9-8d1f-c931158d7dad\",
\"operator\": \"less_than\"
}
],
\"filter_groups\": [
{
\"logic\": \"OR\",
\"conditions\": [
{
\"field\": \"y\",
\"operator\": \"u\"
}
]
}
]
},
\"send_at\": \"2025-06-01T09:00:00Z\",
\"timezone\": \"America\\/New_York\",
\"throttle_limit\": 720,
\"track_opens\": true,
\"track_clicks\": true,
\"utm_source\": \"newsletter\",
\"utm_medium\": \"email\",
\"utm_campaign\": \"spring-sale-2025\"
}"
{
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"name": "Spring Sale 2025 — v2",
"subject": "Final hours: 25% off",
"status": {
"value": "draft",
"label": "Draft",
"color": "gray"
}
}
}
Create a copy of an existing campaign. The new campaign is always created as a draft regardless of the original's status, so you can edit and re-send a previously-sent campaign.
The UUID of the campaign to duplicate.
curl --request POST \
"https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000/duplicate" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Spring Sale 2025 — Resend\"
}"
{
"data": {
"uuid": "11111111-2222-3333-4444-555555555555",
"name": "Spring Sale 2025 — Resend",
"status": {
"value": "draft",
"label": "Draft",
"color": "gray"
}
}
}
Get the number of contacts that would be targeted by a given set of recipient filters, without creating a campaign. Useful for sizing an audience before building out the campaign content.
curl --request POST \
"https://api.surecontact.com/api/v1/public/campaigns/estimate-recipients" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"filters\": {
\"include_lists\": [
\"550e8400-e29b-41d4-a716-446655440000\"
],
\"exclude_lists\": [
\"architecto\"
],
\"include_tags\": [],
\"exclude_tags\": [
\"architecto\"
],
\"status\": [
\"subscribed\"
],
\"company\": \"n\",
\"source\": [
\"form\"
],
\"has_phone\": false,
\"engagement\": {
\"opened\": false,
\"clicked\": false,
\"not_opened_in_days\": 7,
\"not_clicked_in_days\": 16,
\"opened_in_days\": 17,
\"clicked_in_days\": 15,
\"opened_campaign_ids\": [
\"d6fa562b-acd5-35ff-babb-d11194d3737b\"
],
\"clicked_campaign_ids\": [
\"5707ca55-f609-3528-be8b-1baeaee1567e\"
],
\"not_opened_campaign_ids\": [
\"947170af-7488-3f30-a16d-723355a9502f\"
],
\"not_clicked_campaign_ids\": [
\"cd1eb1ea-4697-3b9a-9dd0-988044a83af6\"
],
\"included_in_campaign_ids\": [
\"5e4f00df-4238-35bd-9edc-0b98dc359c80\"
],
\"not_included_in_campaign_ids\": [
\"3c85cf54-98c1-36ed-b65a-abaafdecdfa9\"
]
},
\"dates\": {
\"created_after\": \"2026-06-08T05:26:39\",
\"created_before\": \"2026-06-08T05:26:39\",
\"last_activity_after\": \"2026-06-08T05:26:39\",
\"last_activity_before\": \"2026-06-08T05:26:39\",
\"inactive_for_days\": 18,
\"active_in_days\": 8
},
\"custom_fields\": [
{
\"field_uuid\": \"a232abbe-3006-3f67-bed4-124abab91dce\",
\"operator\": \"not_equals\"
}
]
}
}"
{
"success": true,
"data": {
"count": 1250,
"lists_selected": 1,
"filters_applied": true
}
}
Soft-delete a campaign. Drafts, cancelled, and completed campaigns can be deleted. In-progress (sending) campaigns must be cancelled first.
The UUID of the campaign.
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/campaigns/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
Soft-delete multiple campaigns at once. Only Draft, Cancelled, and Sent
campaigns can be deleted; in-progress campaigns are skipped and reported
back in skipped_uuids.
curl --request POST \
"https://api.surecontact.com/api/v1/public/campaigns/bulk-delete" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"delete_all\": false,
\"uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}"
{
"message": "3 campaigns deleted, 1 skipped (in-progress).",
"deleted_count": 3,
"skipped_count": 1,
"skipped_uuids": [
"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
]
}
Account-level CRM endpoints. Requires the companies plan feature.
Returns a paginated, filterable, sortable list of companies in the current workspace.
Requires the workspace plan to have the companies feature.
Free-text search across name, domain, and website. Must not be greater than 255 characters.
Filter to companies created by a specific user UUID. Must be a valid UUID.
Filter by lifecycle stage (subscriber, lead, marketing_qualified_lead, sales_qualified_lead, opportunity, customer, evangelist, other).
subscriberleadmarketing_qualified_leadsales_qualified_leadopportunitycustomerevangelistotherFilter by company type (prospect, customer, partner, reseller, vendor, other).
prospectcustomerpartnerresellervendorotherFilter by lead status (new, open, in_progress, open_deal, unqualified, attempted_to_contact, connected, bad_timing).
newopenin_progressopen_dealunqualifiedattempted_to_contactconnectedbad_timingFilter by employee range bucket (1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+).
1-1011-5051-200201-500501-10001001-50005001-1000010001+Filter by annual revenue bucket (under_1m, 1m_10m, 10m_50m, 50m_100m, 100m_500m, 500m_1b, 1b_plus).
under_1m1m_10m10m_50m50m_100m100m_500m500m_1b1b_plusFilter by industry string (exact match). Must not be greater than 255 characters.
Filter by exact domain (case-insensitive). Must not be greater than 255 characters.
Filter by exact year founded. Must be at least 1700. Must not be greater than 2026.
Filter to companies founded on or after this year. Must be at least 1700. Must not be greater than 2026.
Filter to companies founded on or before this year. Must be at least 1700. Must not be greater than 2026.
When true, return only companies with at least one linked contact.
truefalse011When true, return only archived companies; false (default) returns only active companies.
truefalse011When set, each returned company includes an is_linked_to_contact boolean indicating whether it is already linked to this contact (used by the Link Company flyout to mark already-linked rows). Must be a valid UUID.
Exact case-insensitive match on company name. Names are unique per workspace, so this returns at most one company. Use to resolve a company UUID by name for follow-up update calls. Must not be greater than 255 characters.
Sort column: created_at, name, contacts_count, last_activity_at, lifecycle_stage.
created_atnamecontacts_countlast_activity_atlifecycle_stageSort direction: asc or desc.
ascdescItems per page (1-100, default 20). Must be at least 1. Must not be greater than 100.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/companies?search=Acme&created_by_uuid=550e8400-e29b-41d4-a716-446655440000&lifecycle_stage=customer&type=customer&lead_status=new&employee_range=11-50&annual_revenue_range=1m_10m&industry=Software&domain=acme.com&year_founded=2015&year_founded_min=2010&year_founded_max=2024&has_contacts=true&archived=false&contact_uuid=550e8400-e29b-41d4-a716-446655440000&exact_company_name=Acme+Corporation&sort_by=created_at&sort_dir=desc&per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": false,
"message": "Your current plan does not include the Companies module."
}
Returns a single company by UUID with createdBy, parentCompany, and customValues eager-loaded.
The UUID of the company.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": false,
"message": "This action is unauthorized."
}
Returns a paginated list of contacts the company is linked to, ordered with
the primary contact first then by linked_at desc. Each entry includes the pivot
data (is_primary, role, linked_via, linked_at) needed to render the company's
Linked Contacts tab. Requires the workspace plan to have the companies feature.
The UUID of the company.
The page number.
Items per page (1-100, default 20).
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/contacts?page=1&per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Counts against the companies plan limit. Triggers the FirstCompanyCreated
organization milestone on the first successful create per workspace.
Company names are unique per workspace (case-insensitive, whitespace-trimmed). Soft-deleted companies free their name for reuse.
curl --request POST \
"https://api.surecontact.com/api/v1/public/companies" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Acme Corporation\",
\"parent_company_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",
\"website\": \"https:\\/\\/acme.com\",
\"logo_url\": \"https:\\/\\/cdn.acme.com\\/logo.png\",
\"phone\": \"+1-555-0100\",
\"address\": {
\"street\": \"1 Market St\",
\"city\": \"San Francisco\",
\"state\": \"CA\",
\"country\": \"US\",
\"postal_code\": \"94105\"
},
\"industry\": \"Software\",
\"employee_range\": \"11-50\",
\"annual_revenue_range\": \"1m_10m\",
\"year_founded\": 2015,
\"linkedin_url\": \"https:\\/\\/www.linkedin.com\\/company\\/acme\",
\"twitter_handle\": \"acmecorp\",
\"facebook_url\": \"https:\\/\\/www.facebook.com\\/acme\",
\"about\": \"B2B SaaS platform for managing customer accounts.\",
\"description\": \"Acme Corporation builds tools that help revenue teams close more deals.\",
\"lifecycle_stage\": \"customer\",
\"type\": \"customer\",
\"lead_status\": \"new\",
\"source\": \"api\",
\"source_id\": \"hubspot-12345\",
\"metadata\": {
\"priority\": \"high\"
}
}"
{
"success": false,
"message": "You've reached your plan's companies limit."
}
Setting logo_url to a non-empty value flips logo_source to manual
and locks the favicon fetcher from overwriting it. To return to
auto-managed, hit POST /companies/{uuid}/logo/reset — sending
logo_url: null via this endpoint leaves logo_source unchanged.
Renaming to a name already taken by another non-soft-deleted company in the same workspace returns 422. Compare names case-insensitively after trimming whitespace.
The UUID of the company.
curl --request PUT \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Acme Corporation\",
\"parent_company_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",
\"website\": \"https:\\/\\/acme.com\",
\"logo_url\": \"https:\\/\\/cdn.acme.com\\/logo.png\",
\"phone\": \"+1-555-0100\",
\"address\": {
\"street\": \"1 Market St\",
\"city\": \"San Francisco\",
\"state\": \"CA\",
\"country\": \"US\",
\"postal_code\": \"94105\"
},
\"industry\": \"Software\",
\"employee_range\": \"51-200\",
\"annual_revenue_range\": \"10m_50m\",
\"year_founded\": 2015,
\"linkedin_url\": \"https:\\/\\/www.linkedin.com\\/company\\/acme\",
\"twitter_handle\": \"acmecorp\",
\"facebook_url\": \"https:\\/\\/www.facebook.com\\/acme\",
\"about\": \"B2B SaaS platform for managing customer accounts.\",
\"description\": \"Acme Corporation builds tools that help revenue teams close more deals.\",
\"lifecycle_stage\": \"customer\",
\"type\": \"customer\",
\"lead_status\": \"connected\",
\"metadata\": {
\"priority\": \"high\"
}
}"
{
"success": false,
"message": "The selected parent company uuid is invalid."
}
The UUID of the company.
curl --request POST \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/archive" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" The UUID of the company.
curl --request POST \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/unarchive" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" If is_primary is omitted, the link is auto-marked primary when this is the contact's first company link.
The UUID of the company.
curl --request POST \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/contacts" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",
\"role\": \"CTO\",
\"is_primary\": true,
\"linked_via\": \"api\"
}"
{
"success": false,
"message": "The selected contact uuid is invalid."
}
is_primary is only honored when exactly one contact_uuid is provided —
for multi-attach it is ignored and the existing auto-promote rule applies
(a contact's first company link becomes primary by default).
Per-contact failures are collected and reported in the response, so a single bad UUID does not block the rest of the batch.
The UUID of the company.
curl --request POST \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/contacts/bulk-attach" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuids\": [
\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\"
],
\"role\": \"CTO\",
\"is_primary\": true,
\"linked_via\": \"manual\"
}"
Marks this company as the contact's primary link and clears the flag from any other company links the contact has.
The UUID of the company.
The UUID of the contact. Must already be linked to this company.
curl --request POST \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/contacts/770e8400-e29b-41d4-a716-446655440000/primary" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Deletes the company; pivot links to contacts are preserved and the
contact's company string column is not affected.
The UUID of the company.
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
If the contact's primary link is removed, one of the remaining links is promoted to primary automatically.
The UUID of the company.
The UUID of the contact to unlink. Must belong to the same workspace.
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/contacts/770e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" APIs for managing the company-level custom field schema. Separate from contact custom fields so account-level firmographics (ARR, account tier, renewal date, etc.) live in their own definition table.
Returns the company-scoped custom field schema for the current workspace.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/company-custom-fields" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" The UUID of the company custom field.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/company-custom-fields/4976b155-4a1c-4a95-897b-3a4f7ad3fd37" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" APIs for managing notes attached to companies. Notes allow free-form account-level context separate from contact notes.
Get paginated notes for a specific company in reverse chronological order.
The UUID of the company.
The page number.
Items per page (1-100, default 20).
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/notes?page=1&per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" The UUID of the company note.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/company-notes/12d107d1-5717-4808-9f06-105a18974d1c" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" The UUID of the company.
curl --request POST \
"https://api.surecontact.com/api/v1/public/companies/550e8400-e29b-41d4-a716-446655440000/notes" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"Renewal Discussion\",
\"content\": \"Met with the procurement team to discuss next-year renewal terms.\"
}"
The note creator can always update their own note; everyone else requires manager+ role on the workspace.
The UUID of the company note.
curl --request PUT \
"https://api.surecontact.com/api/v1/public/company-notes/12d107d1-5717-4808-9f06-105a18974d1c" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"Follow-up Scheduled\",
\"content\": \"Updated: Procurement confirmed the renewal terms for next year.\"
}"
The UUID of the company note.
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/company-notes/12d107d1-5717-4808-9f06-105a18974d1c" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
APIs for viewing and creating contact activities. Activities represent events and interactions associated with a contact, forming an audit trail of all engagements.
Activity types include: email_sent, email_opened, email_clicked, form_submitted, note_added, note_updated, note_deleted, tag_added, tag_removed, contact_created, contact_updated, list_added, list_removed, custom_field_added, custom_field_updated, custom_field_deleted, purchase_completed, purchase_cancelled, purchase_refunded.
Available via both authenticated API (Sanctum) and Public API (API Key).
Get paginated activities for a specific contact. Activities are returned in reverse chronological order (newest first).
The UUID of the contact.
Filter by activity type.
Filter activities from this date (ISO 8601).
Filter activities until this date (ISO 8601).
Filter to activities from the last N days.
Number of items per page. Default: 15.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/activities?type=email_sent&from=2025-01-01T00%3A00%3A00%2B00%3A00&to=2025-01-31T23%3A59%3A59%2B00%3A00&days=30&per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"uuid": 123,
"type": "email_sent",
"type_label": "Email Sent",
"icon": "mail",
"color": "blue",
"description": "Campaign email sent to contact",
"metadata": {
"campaign_id": "campaign-uuid",
"subject": "Welcome to our newsletter"
},
"contact": {
"uuid": "contact-uuid",
"email": "[email protected]",
"full_name": "John Doe"
},
"created_by": {
"uuid": "user-uuid",
"name": "System",
"email": "[email protected]"
},
"created_at": "2025-01-15T10:30:00+00:00"
}
],
"links": {},
"meta": {
"current_page": 1,
"per_page": 15,
"total": 50
}
}
Get details of a specific activity.
The UUID of the activity.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/activities/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"type": "form_submitted",
"type_label": "Form Submitted",
"icon": "document-text",
"color": "indigo",
"description": "Contact submitted the newsletter signup form",
"metadata": {
"form_name": "Newsletter Signup",
"page_url": "https://example.com/signup"
},
"contact": {
"uuid": "contact-uuid",
"email": "[email protected]",
"full_name": "John Doe"
},
"created_by": {
"uuid": "user-uuid",
"name": "API Integration",
"email": "[email protected]"
},
"created_at": "2025-01-15T10:30:00+00:00"
}
}
Create a new activity for a contact. This is useful for logging external events or custom integrations. The activity will be attributed to the authenticated user (or API key owner).
The UUID of the contact.
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/activities" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"type\": \"form_submitted\",
\"description\": \"Customer submitted the contact form on the pricing page.\",
\"metadata\": {
\"form_name\": \"Contact Form\",
\"page_url\": \"https:\\/\\/example.com\\/pricing\"
}
}"
{
"data": {
"uuid": 456,
"type": "form_submitted",
"type_label": "Form Submitted",
"icon": "document-text",
"color": "indigo",
"description": "Customer submitted the contact form on the pricing page.",
"metadata": {
"form_name": "Contact Form",
"page_url": "https://example.com/pricing"
},
"contact": {
"uuid": "contact-uuid",
"email": "[email protected]",
"full_name": "John Doe"
},
"created_by": {
"uuid": "user-uuid",
"name": "API Integration",
"email": "[email protected]"
},
"created_at": "2025-01-15T10:30:00+00:00"
}
}
APIs for managing contacts within a workspace. Contacts are the core entity representing individuals you interact with.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/contacts" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"search\": \"b\",
\"exclude_company_uuid\": \"a4855dc5-0acb-33c3-b921-f4291f719ca0\",
\"custom_field_filters\": [
{
\"custom_field_uuid\": \"c90237e9-ced5-3af6-88ea-84aeaa148878\",
\"operator\": \"greater_than\"
}
]
}"
Look up a contact by their email address. Returns the contact if found, or a 404 response if no contact exists with the given email.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/contacts/email/[email protected]" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"full_name": "John Doe",
"status": "subscribed",
"created_at": "2025-01-10T10:00:00+00:00",
"updated_at": "2025-01-10T10:00:00+00:00"
}
}
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/contacts/b5783fab-aef4-4bf8-b701-8f6748ccedca" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Find an existing contact by email or create a new one if not found. This is an idempotent operation - calling multiple times with the same email will return the same contact without modifications.
Behavior:
tag_uuids or list_uuids are provided → Tags/lists are appended to the contact (both new and existing)Use this endpoint when you want to ensure a contact exists without overwriting any existing data.
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"primary_fields\": {
\"email\": \"[email protected]\",
\"first_name\": \"John\",
\"last_name\": \"Doe\",
\"phone\": \"+1234567890\",
\"company\": \"Acme Inc\",
\"job_title\": \"Marketing Manager\",
\"birthdate\": \"1990-01-15\",
\"gender\": \"male\",
\"anniversary\": \"06-20\",
\"prefix\": \"Dr\",
\"suffix\": \"Jr\",
\"source\": \"api\",
\"status\": \"active\",
\"language\": \"en\",
\"timezone\": \"America\\/New_York\",
\"created_at\": \"2023-01-15T10:30:00Z\",
\"updated_at\": \"2024-06-20T14:45:00Z\"
},
\"metadata\": {
\"utm_source\": \"google\"
},
\"custom_fields\": {
\"industry\": \"Technology\"
},
\"tag_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
],
\"list_uuids\": [
\"660e8400-e29b-41d4-a716-446655440001\"
]
}"
{
"success": true,
"is_created": false,
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"full_name": "John Doe",
"status": "subscribed",
"tags": [],
"lists": [],
"created_at": "2025-01-10T10:00:00+00:00",
"updated_at": "2025-01-10T10:00:00+00:00"
}
}
Create a new contact or update an existing one based on email address. This is an idempotent operation ideal for syncing contact data from external systems.
Behavior:
is_created: falseis_created: truetag_uuids or list_uuids are provided → Tags/lists are appended to the contact (both new and existing)Use this endpoint when you want to keep contact data synchronized with an external system.
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/upsert" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"primary_fields\": {
\"email\": \"[email protected]\",
\"first_name\": \"John\",
\"last_name\": \"Doe\",
\"phone\": \"+1234567890\",
\"company\": \"Acme Inc\",
\"job_title\": \"Marketing Manager\",
\"birthdate\": \"1990-01-15\",
\"gender\": \"male\",
\"anniversary\": \"06-20\",
\"prefix\": \"Dr\",
\"suffix\": \"Jr\",
\"source\": \"api\",
\"status\": \"active\",
\"language\": \"en\",
\"timezone\": \"America\\/New_York\",
\"created_at\": \"2023-01-15T10:30:00Z\",
\"updated_at\": \"2024-06-20T14:45:00Z\"
},
\"metadata\": {
\"utm_source\": \"google\"
},
\"custom_fields\": {
\"industry\": \"Technology\"
},
\"tag_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
],
\"list_uuids\": [
\"660e8400-e29b-41d4-a716-446655440001\"
]
}"
{
"success": true,
"is_created": false,
"data": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"full_name": "John Doe",
"status": "subscribed",
"tags": [],
"lists": [],
"created_at": "2025-01-10T10:00:00+00:00",
"updated_at": "2025-01-15T10:30:00+00:00"
}
}
Update an existing contact's information. Only the fields provided will be updated.
The UUID of the contact.
curl --request PUT \
"https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"primary_fields\": {
\"email\": \"[email protected]\",
\"first_name\": \"John\",
\"last_name\": \"Doe\",
\"phone\": \"+1234567890\",
\"company\": \"Acme Inc\",
\"job_title\": \"Marketing Manager\",
\"birthdate\": \"1990-01-15\",
\"gender\": \"male\",
\"anniversary\": \"06-20\",
\"prefix\": \"Dr\",
\"suffix\": \"Jr\",
\"source\": \"api\",
\"status\": \"active\",
\"language\": \"en\",
\"timezone\": \"America\\/New_York\",
\"created_at\": \"2023-01-15T10:30:00Z\",
\"updated_at\": \"2024-06-20T14:45:00Z\"
},
\"metadata\": {
\"utm_source\": \"google\"
},
\"custom_fields\": {
\"industry\": \"Technology\"
}
}"
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"full_name": "John Doe",
"status": "active",
"language": "en",
"timezone": "America/New_York",
"created_at": "2023-01-15T10:30:00+00:00",
"updated_at": "2024-06-20T14:45:00+00:00"
}
curl --request PATCH \
"https://api.surecontact.com/api/v1/public/contacts/b5783fab-aef4-4bf8-b701-8f6748ccedca/status" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"status\": \"active\"
}"
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/b5783fab-aef4-4bf8-b701-8f6748ccedca/tags/attach" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"tag_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}"
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/b5783fab-aef4-4bf8-b701-8f6748ccedca/tags/detach" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"tag_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}"
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/b5783fab-aef4-4bf8-b701-8f6748ccedca/lists/attach" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"list_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}"
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/b5783fab-aef4-4bf8-b701-8f6748ccedca/lists/detach" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"list_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}"
Symmetric counterpart of POST /companies/{uuid}/contacts/bulk-attach.
is_primary is only honored when exactly one company_uuid is provided —
for multi-attach it is ignored and the existing auto-promote rule applies
(a contact's first company link becomes primary by default).
Per-company failures are collected and reported in the response, so a single bad UUID does not block the rest of the batch.
The UUID of the contact.
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/companies/bulk-attach" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"company_uuids\": [
\"6ff8f7f6-1eb3-3525-be4a-3932c805afed\"
],
\"role\": \"CTO\",
\"is_primary\": true,
\"linked_via\": \"manual\"
}"
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/contacts/b5783fab-aef4-4bf8-b701-8f6748ccedca" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Regenerates the opt-in token and re-sends the confirmation email using
the workspace's configured opt-in template. Only applies to contacts
in the pending status.
UUID of the contact.
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/resend-double-opt-in" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"message": "Double opt-in confirmation email resent.",
"data": {
"contact": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]"
}
}
}
APIs for managing notes attached to contacts. Notes allow you to store free-form text information about a contact.
Available via both authenticated API (Sanctum) and Public API (API Key).
Get paginated notes for a specific contact. Notes are returned in reverse chronological order (newest first).
The UUID of the contact.
Number of items per page. Default: 15.
Page number.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/notes?per_page=20&page=1" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": [
{
"uuid": "note-uuid-here",
"content": "Called customer to discuss renewal options.",
"created_by": {
"uuid": "user-uuid",
"name": "John Doe",
"email": "[email protected]"
},
"updated_by": null,
"created_at": "2025-01-15T10:30:00+00:00",
"updated_at": "2025-01-15T10:30:00+00:00"
}
],
"links": {},
"meta": {
"current_page": 1,
"per_page": 15,
"total": 5
}
}
Get details of a specific note.
The UUID of the note.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/notes/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"data": {
"uuid": "note-uuid-here",
"content": "Customer requested a callback next week.",
"created_by": {
"uuid": "user-uuid",
"name": "John Doe",
"email": "[email protected]"
},
"updated_by": {
"uuid": "user-uuid-2",
"name": "Jane Smith",
"email": "[email protected]"
},
"created_at": "2025-01-15T10:30:00+00:00",
"updated_at": "2025-01-16T14:00:00+00:00"
}
}
Create a new note for a contact. The note will be attributed to the authenticated user (or API key owner for public API).
The UUID of the contact.
curl --request POST \
"https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/notes" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"Renewal Discussion\",
\"content\": \"Customer requested a callback next week to discuss enterprise pricing.\"
}"
{
"data": {
"uuid": "note-uuid-here",
"content": "Customer requested a callback next week to discuss enterprise pricing.",
"created_by": {
"uuid": "user-uuid",
"name": "John Doe",
"email": "[email protected]"
},
"updated_by": null,
"created_at": "2025-01-15T10:30:00+00:00",
"updated_at": "2025-01-15T10:30:00+00:00"
}
}
Update an existing note. Only the note creator or workspace managers can update notes.
The UUID of the note.
curl --request PUT \
"https://api.surecontact.com/api/v1/public/notes/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"title\": \"Follow-up Call Scheduled\",
\"content\": \"Updated: Customer confirmed callback for Monday at 2pm.\"
}"
{
"data": {
"uuid": "note-uuid-here",
"content": "Updated: Customer confirmed callback for Monday at 2pm.",
"created_by": {
"uuid": "user-uuid",
"name": "John Doe",
"email": "[email protected]"
},
"updated_by": {
"uuid": "user-uuid",
"name": "John Doe",
"email": "[email protected]"
},
"created_at": "2025-01-15T10:30:00+00:00",
"updated_at": "2025-01-16T14:00:00+00:00"
}
}
Soft delete a note. Only the note creator or workspace managers can delete notes.
The UUID of the note.
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/notes/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" [Empty response]
APIs for managing custom fields within a workspace. Custom fields allow extending contact data with workspace-specific attributes.
Pass ?grouped=true to receive fields nested under their sections.
The default flat response remains backward-compatible.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/custom-fields" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request GET \
--get "https://api.surecontact.com/api/v1/public/custom-fields/5aea5a89-56fe-4ea7-8ba3-229e647fb8e7" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Public-API endpoint for sending one-off emails. Accepts either a raw subject + HTML body or a template_uuid (with optional caller-provided variables substituted into the template).
Send a one-off email to a contact. The email is queued and delivered
asynchronously. Provide either a raw subject + HTML body, or a
template_uuid (with optional variables substituted into the
template). Caller-provided variables are applied first; standard
{{contact.*}} and {{workspace.*}} placeholders are resolved at
send time.
curl --request POST \
"https://api.surecontact.com/api/v1/public/emails/send" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",
\"contact_email\": \"[email protected]\",
\"subject\": \"Welcome to our newsletter\",
\"body\": \"<p>Hi {{first_name}}, welcome aboard.<\\/p>\",
\"template_uuid\": \"b1d4e9f2-1234-4abc-8def-9876543210ab\",
\"from_email\": \"[email protected]\",
\"from_name\": \"Acme Marketing\",
\"reply_to\": \"[email protected]\",
\"track_opens\": true,
\"track_clicks\": true
}"
{
"success": true,
"message": "Email queued for sending.",
"data": {
"uuid": "9b7a4f2c-3e6d-4f12-9c8b-2a1b0c5d6e7f",
"status": "queued",
"subject": "Welcome to our newsletter",
"recipient_email": "[email protected]"
}
}
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/email-templates" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"search\": \"b\",
\"type\": \"architecto\",
\"sort_by\": \"updated_at\",
\"sort_order\": \"asc\",
\"per_page\": 22
}"
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/email-templates/f3b2ea1c-695c-4479-b58c-32849923a1de" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request GET \
--get "https://api.surecontact.com/api/v1/public/forms" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"search\": \"b\",
\"status\": \"architecto\",
\"sort_by\": \"submission_count\",
\"sort_order\": \"desc\",
\"per_page\": 22
}"
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/forms/1364df30-2256-4a0c-b7c4-088456a4483c" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request GET \
--get "https://api.surecontact.com/api/v1/public/forms/1364df30-2256-4a0c-b7c4-088456a4483c/submissions" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"search\": \"b\",
\"status\": \"architecto\",
\"from\": \"2026-06-08T05:26:39\",
\"to\": \"2026-06-08T05:26:39\",
\"per_page\": 22
}"
APIs for managing lists within a workspace. Lists can be static (manually managed) or dynamic (filter-based).
Filter by archive status: "false" (default, active only), "true" (archived only), "all" (both).
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/lists?archived=false" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request GET \
--get "https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request GET \
--get "https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1/contacts" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request GET \
--get "https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1/refresh-status" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request POST \
"https://api.surecontact.com/api/v1/public/lists" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Newsletter Subscribers\",
\"description\": \"Contacts subscribed to our weekly newsletter\",
\"type\": \"static\",
\"filters\": []
}"
curl --request PUT \
"https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Active Subscribers\",
\"description\": \"Contacts who are actively engaged with our content\",
\"type\": \"static\",
\"filters\": []
}"
curl --request POST \
"https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1/contacts/add" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}"
curl --request POST \
"https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1/contacts/remove" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuids\": [
\"550e8400-e29b-41d4-a716-446655440000\"
]
}"
curl --request POST \
"https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1/copy" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request POST \
"https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1/refresh" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request POST \
"https://api.surecontact.com/api/v1/public/lists/refresh-all" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" curl --request DELETE \
"https://api.surecontact.com/api/v1/public/lists/c0dd539b-0c2a-4678-975e-dab016cc32e1" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" APIs for managing e-commerce purchases and order tracking. Purchases represent transactions made by contacts, tracked from various sources like WordPress/WooCommerce, Shopify, or via the API.
Purchase statuses: completed, cancelled, refunded, pending. Purchase sources: wordpress, shopify, api, manual.
Available via both authenticated API (Sanctum) and Public API (API Key).
Get paginated list of purchases for the workspace. Purchases are returned in reverse chronological order (newest first).
Number of items per page (1-100). Default: 20.
Page number.
Filter by purchase status.
Filter by purchase source.
Filter by contact UUID.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/purchases?per_page=20&page=1&status=completed&source=api&contact_uuid=550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22,
\"status\": \"pending\",
\"source\": \"mcp\",
\"contact_uuid\": \"6b72fe4a-5b40-307c-bc24-f79acf9a1bb9\"
}"
{
"success": true,
"data": [
{
"uuid": "purchase-uuid",
"source": "api",
"source_order_id": "ORD-12345",
"status": "completed",
"total_amount": 99.99,
"currency": "USD",
"products": [
{
"name": "Product A",
"quantity": 1,
"price": 99.99
}
],
"purchased_at": "2025-01-15T10:30:00+00:00",
"contact": {
"uuid": "contact-uuid",
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe"
}
}
],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 20,
"total": 100
}
}
Retrieve a specific purchase by UUID.
The UUID of the purchase.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/purchases/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"uuid": "purchase-uuid",
"source": "api",
"source_order_id": "ORD-12345",
"status": "completed",
"total_amount": 99.99,
"currency": "USD",
"products": [
{
"name": "Product A",
"quantity": 1,
"price": 99.99
}
],
"metadata": {
"payment_method": "credit_card",
"shipping_amount": 5
},
"purchased_at": "2025-01-15T10:30:00+00:00",
"contact": {
"uuid": "contact-uuid",
"email": "[email protected]"
}
}
}
Retrieve purchase history for a specific contact, ordered by most recent first.
The UUID of the contact.
Number of purchases per page (1-100). Default: 20.
Page number. Default: 1.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/purchases?per_page=20&page=1" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"per_page\": 1,
\"page\": 22
}"
{
"success": true,
"data": [
{
"uuid": "purchase-uuid",
"source": "api",
"source_order_id": "ORD-12345",
"status": "completed",
"total_amount": 99.99,
"currency": "USD",
"purchased_at": "2025-01-15T10:30:00+00:00"
}
],
"meta": {
"current_page": 1,
"last_page": 3,
"per_page": 20,
"total": 55
}
}
Retrieve purchase statistics for a specific contact including total purchases, total spent, average order value, and purchase date range.
The UUID of the contact.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/contacts/550e8400-e29b-41d4-a716-446655440000/purchase-stats" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"total_purchases": 5,
"total_spent": 499.95,
"average_order_value": 99.99,
"last_purchase_date": "2025-01-15T10:30:00+00:00",
"first_purchase_date": "2024-06-01T14:00:00+00:00"
}
}
Track a new purchase for a contact. The contact can be identified by UUID or email. If using email and the contact doesn't exist, a new contact will be created automatically.
curl --request POST \
"https://api.surecontact.com/api/v1/public/purchases" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_email\": \"[email protected]\",
\"contact_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",
\"order_id\": \"ORD-12345\",
\"purchase_id\": \"PUR-001\",
\"transaction_id\": \"TXN-ABC123\",
\"status\": \"completed\",
\"total_amount\": 99.99,
\"currency\": \"USD\",
\"products\": [
{
\"name\": \"Product A\",
\"quantity\": 1,
\"price\": 99.99
}
],
\"coupon_code\": \"SAVE10\",
\"coupon_amount\": 10,
\"discount\": 10,
\"shipping_amount\": 5,
\"tax_amount\": 8.5,
\"subtotal\": 94.99,
\"payment_method\": \"credit_card\",
\"shipping_method\": \"standard\",
\"customer_note\": \"Please gift wrap\",
\"billing_address\": {
\"street\": \"123 Main St\",
\"city\": \"New York\"
},
\"shipping_address\": {
\"street\": \"123 Main St\",
\"city\": \"New York\"
},
\"purchased_at\": \"2025-01-15T10:30:00Z\",
\"metadata\": {
\"custom_field\": \"value\"
}
}"
{
"success": true,
"message": "Purchase tracked successfully",
"data": {
"purchase_uuid": "purchase-uuid",
"contact_uuid": "contact-uuid",
"contact_email": "[email protected]",
"order_id": "ORD-12345",
"amount": "$99.99 USD",
"status": "completed",
"purchased_at": "2025-01-15T10:30:00+00:00"
}
}
Mark a purchase as cancelled. This updates the status to 'cancelled' and records the cancellation timestamp.
The UUID of the purchase to cancel.
curl --request POST \
"https://api.surecontact.com/api/v1/public/purchases/550e8400-e29b-41d4-a716-446655440000/cancel" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"message": "Purchase cancelled successfully",
"data": {
"purchase_uuid": "purchase-uuid",
"order_id": "ORD-12345",
"status": "cancelled",
"cancelled_at": "2025-01-15T12:00:00+00:00"
}
}
Mark a purchase as refunded. This updates the status to 'refunded' and records the refund timestamp.
The UUID of the purchase to refund.
curl --request POST \
"https://api.surecontact.com/api/v1/public/purchases/550e8400-e29b-41d4-a716-446655440000/refund" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"message": "Purchase refunded successfully",
"data": {
"purchase_uuid": "purchase-uuid",
"order_id": "ORD-12345",
"status": "refunded",
"cancelled_at": "2025-01-15T12:00:00+00:00"
}
}
APIs for advanced analytics and reporting with date filtering, comparison periods, and export functionality.
Returns high-level KPIs across contacts, emails, engagement, and revenue with optional comparison to previous period.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/overview" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"12_months\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"previous_year\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"week\"
}"
Returns contact growth statistics with optional filtering by tag or list.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/contacts/growth" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"yesterday\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"custom\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"month\",
\"filter_type\": \"tag\",
\"filter_uuid\": \"a4855dc5-0acb-33c3-b921-f4291f719ca0\"
}"
Returns email sending statistics including sent, delivered, failed, and bounced counts.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/emails/sending" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"7_days\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"custom\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"day\"
}"
Returns email engagement statistics including opens, clicks, and rates.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/emails/engagement" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"custom\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"previous_year\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"day\"
}"
Returns top clicked links with total and unique click counts.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/links/clicks" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"today\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"previous_year\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"month\",
\"campaign_uuid\": \"a4855dc5-0acb-33c3-b921-f4291f719ca0\",
\"limit\": 16
}"
Returns unsubscribe statistics with optional reasons breakdown.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/unsubscribes" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"today\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"previous_month\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"day\"
}"
Returns bounce statistics with hard/soft bounce breakdown.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/bounces" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"custom\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"none\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"month\",
\"bounce_type\": \"hard\"
}"
Returns revenue statistics including total revenue, orders, AOV, and trends.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/ecommerce/revenue" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"30_days\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"none\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"day\",
\"source\": \"wordpress\"
}"
Returns top products by revenue and order count.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/ecommerce/products" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"yesterday\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"previous_year\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"week\",
\"limit\": 22
}"
Returns aggregated metrics across all campaigns.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/campaigns/summary" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"today\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"none\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"month\",
\"status\": \"all\"
}"
Downloads report data as CSV or Excel file.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/reports/export" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"date_range\": \"12_months\",
\"start_date\": \"2022-07-02\",
\"end_date\": \"2022-07-02\",
\"compare_with\": \"custom\",
\"compare_start_date\": \"2022-07-02\",
\"compare_end_date\": \"2022-07-02\",
\"group_by\": \"week\",
\"report_type\": \"bounces\",
\"format\": \"xlsx\",
\"filter_type\": \"list\",
\"filter_uuid\": \"a4855dc5-0acb-33c3-b921-f4291f719ca0\"
}"
Public-API alias of index() filtered to type=sequence. Returns a
paginated list of sequences (Automations of type=sequence) in the
current workspace.
Filter by sequence name.
Filter by status (draft, active, inactive).
Field to sort by.
asc or desc.
Items per page (max 100).
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/sequences?search=onboarding&status=active&sort_by=created_at&sort_order=desc&per_page=15" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Returns a single sequence by UUID. Returns 404 if the automation exists but is not a sequence (i.e., a workflow).
UUID of the sequence.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/sequences/7c9e6679-7425-40de-944b-e07fc1f90ae7" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Enrolls a contact in an active sequence. The contact must belong to the
caller's workspace and the sequence must be in active status. The
first sequence email is sent shortly after enrollment.
UUID of the sequence.
curl --request POST \
"https://api.surecontact.com/api/v1/public/sequences/7c9e6679-7425-40de-944b-e07fc1f90ae7/enroll" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",
\"contact_email\": \"[email protected]\"
}"
{
"success": true,
"message": "Contact enrolled in sequence.",
"data": {
"sequence": {
"uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Onboarding"
},
"contact": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]"
}
}
}
Cancels any active executions for the contact in the sequence and marks
the subscriber as cancelled. Idempotent — calling on a non-enrolled
contact returns success with cancelled_executions: 0.
UUID of the sequence.
curl --request POST \
"https://api.surecontact.com/api/v1/public/sequences/7c9e6679-7425-40de-944b-e07fc1f90ae7/unenroll" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuid\": \"550e8400-e29b-41d4-a716-446655440000\",
\"contact_email\": \"[email protected]\"
}"
{
"success": true,
"message": "Contact unenrolled from sequence.",
"data": {
"cancelled_executions": 2,
"sequence": {
"uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"name": "Onboarding"
},
"contact": {
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]"
}
}
}
APIs for managing tags within a workspace. Tags can be applied to contacts for categorization and segmentation purposes.
Get all tags for the current workspace with optional search and sorting.
Search tags by name or slug.
Filter by archive status: "false" (default, active only), "true" (archived only), "all" (both).
Sort field. Allowed: name, slug, usage_count, created_at, updated_at.
Sort direction: asc or desc. Default: asc.
Number of items per page. Default: 15.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/tags?search=newsletter&archived=false&sort=name&direction=asc&per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Get details of a specific tag.
The UUID of the tag.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/tags/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Get all contacts that have this tag applied.
The UUID of the tag.
Number of items per page. Default: 15.
curl --request GET \
--get "https://api.surecontact.com/api/v1/public/tags/550e8400-e29b-41d4-a716-446655440000/contacts?per_page=20" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" Create a new tag in the current workspace.
curl --request POST \
"https://api.surecontact.com/api/v1/public/tags" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"VIP Customer\",
\"color\": \"#10B981\",
\"description\": \"High-value customers\",
\"slug\": \"vip-customer\"
}"
Update an existing tag's details.
The UUID of the tag.
curl --request PUT \
"https://api.surecontact.com/api/v1/public/tags/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"name\": \"Premium Customer\",
\"color\": \"#F59E0B\",
\"description\": \"Premium tier customers\",
\"slug\": \"premium-customer\"
}"
Add multiple contacts to a tag. Contacts that already have the tag will be skipped. Maximum 10,000 contacts per request.
The UUID of the tag.
curl --request POST \
"https://api.surecontact.com/api/v1/public/tags/550e8400-e29b-41d4-a716-446655440000/contacts/add" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuids\": [
\"660e8400-e29b-41d4-a716-446655440001\",
\"770e8400-e29b-41d4-a716-446655440002\"
]
}"
Remove multiple contacts from a tag. Contacts that don't have the tag will be skipped. Maximum 10,000 contacts per request.
The UUID of the tag.
curl --request POST \
"https://api.surecontact.com/api/v1/public/tags/550e8400-e29b-41d4-a716-446655440000/contacts/remove" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"contact_uuids\": [
\"660e8400-e29b-41d4-a716-446655440001\",
\"770e8400-e29b-41d4-a716-446655440002\"
]
}"
Permanently delete a tag. This will remove the tag from all contacts.
The UUID of the tag.
curl --request DELETE \
"https://api.surecontact.com/api/v1/public/tags/550e8400-e29b-41d4-a716-446655440000" \
--header "X-API-Key: {YOUR_API_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"