SureContact API Documentation

Introduction

SureContact Public API for external integrations.

This documentation provides all the information you need to work with the SureContact Public API.

Authentication

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

Getting an API Key

  1. Log in to SureContact
  2. Navigate to Profile on Top Bar > API Keys
  3. Click Create API Key
  4. Select the required abilities (read, write, delete)
  5. Copy the key immediately (it won't be shown again)

Rate Limiting

API requests are rate-limited based on your organization's plan. Rate limit information is included in response headers:

  • X-RateLimit-Limit - Maximum requests allowed
  • X-RateLimit-Remaining - Remaining requests in the window
  • X-RateLimit-Reset - Unix timestamp when the limit resets

Authenticating requests

To 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.

Landing Page Management

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.

List Landing Pages.

GET
https://api.surecontact.com
/api/v1/public/pages
requires authentication

Get all landing pages for the current workspace with optional filtering and sorting.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

search
string

Search pages by name.

Example:
My Landing Page
status
string

Filter by status: draft, published, scheduled, archived.

Example:
published
sort_by
string

Sort field. Allowed: name, created_at, updated_at, status.

Example:
created_at
sort_order
string

Sort direction: asc or desc. Default: desc.

Example:
desc
per_page
integer

Number of items per page (1–100). Default: 15.

Example:
20

Body Parameters

Example request:
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
}"
Example response:
{
    "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
    }
}

Get Landing Page.

GET
https://api.surecontact.com
/api/v1/public/pages/{page_uuid}
requires authentication

Retrieve a single landing page including its full design JSON.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

page_uuid
string
required
Example:
b4413073-0f89-47d6-b230-4e3db2057a08
page
string
required

The UUID of the landing page.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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"
        }
    }
}
{
    "success": false,
    "message": "Not found."
}

Create Landing Page.

POST
https://api.surecontact.com
/api/v1/public/pages
requires authentication

Create a new landing page as a draft. Optionally initialise it from an existing template.

Tip — building design_json programmatically? Use the SureContact Claude Skills to generate a complete, valid design_json payload 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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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
        }
    }
}
{
    "success": false,
    "message": "The name field is required.",
    "errors": {
        "name": [
            "The name field is required."
        ]
    }
}

Update Landing Page.

PUT
https://api.surecontact.com
/api/v1/public/pages/{page_uuid}
requires authentication

Update an existing landing page. All fields are optional — only supplied fields are updated.

Tip — building design_json programmatically? Use the SureContact Claude Skills to generate a complete, valid design_json payload 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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

page_uuid
string
required
Example:
b4413073-0f89-47d6-b230-4e3db2057a08
page
string
required

The UUID of the landing page.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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
        }
    }
}
{
    "success": false,
    "message": "Not found."
}
{
    "success": false,
    "message": "The name must not exceed 255 characters.",
    "errors": {
        "name": [
            "The name must not exceed 255 characters."
        ]
    }
}

Delete Landing Page.

DELETE
https://api.surecontact.com
/api/v1/public/pages/{page_uuid}
requires authentication

Soft-delete a landing page. The page is removed from the workspace and its public URL is unpublished.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

page_uuid
string
required
Example:
b4413073-0f89-47d6-b230-4e3db2057a08
page
string
required

The UUID of the landing page.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "success": true,
    "message": "Page deleted successfully",
    "data": null
}
{
    "success": false,
    "message": "Not found."
}

Automations

Get all automations.

GET
https://api.surecontact.com
/api/v1/public/automations
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
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"
Example response:

Show a specific automation.

GET
https://api.surecontact.com
/api/v1/public/automations/{automation_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

automation_uuid
string
required
Example:
691e8cef-9803-43e2-9423-645fa39bd176
Example request:
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"
Example response:

Start Automation for Contact.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/automations/{automation_uuid}/start
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000
automation_uuid
string
required

UUID of the automation.

Example:
7c9e6679-7425-40de-944b-e07fc1f90ae7
Example request:
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"
Example response:
{
    "success": true,
    "message": "Automation has been scheduled successfully",
    "data": {
        "automation_uuid": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
        "automation_name": "Welcome Workflow"
    }
}
{
    "success": false,
    "message": "Contact not found in this workspace.",
    "errors": null
}
{
    "success": false,
    "message": "Automation must be active to enroll contacts",
    "errors": null
}

Campaign Management

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.

List Campaigns.

GET
https://api.surecontact.com
/api/v1/public/campaigns
requires authentication

Get all campaigns for the current workspace with optional filtering and pagination.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

search
string

Search campaigns by name or subject.

Example:
Welcome
status
string

Filter by campaign status (draft, scheduled, sending, sent, paused, cancelled, failed).

Example:
draft
sort_by[].column
string

Sort column. Allowed: name, status, send_at, scheduled_at, completed_at, created_at, updated_at.

Example:
created_at
sort_by[].order
string

Sort order: asc or desc. Default: desc.

Example:
desc
per_page
integer

Number of items per page. Default: 15.

Example:
20
Example request:
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"
Example response:
{
    "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 Campaign.

GET
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}
requires authentication

Get full details of a specific campaign including content, recipients, and stats.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}

List Campaign Recipients.

GET
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}/recipients
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

limit
integer

Maximum number of recipients to return. Max 100. Default: 50.

Example:
25
Example request:
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"
Example response:
{
    "data": [
        {
            "uuid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
            "email": "[email protected]",
            "first_name": "Jane",
            "last_name": "Doe"
        }
    ]
}

Get Recipient Count.

GET
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}/recipients/count
requires authentication

Get the total number of contacts that match the campaign's recipient filters. Faster than listing recipients when you only need the count.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "success": true,
    "data": {
        "count": 1250
    }
}

List Campaign Contacts.

GET
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}/contacts
requires authentication

Get the contacts a campaign was sent to, including per-contact engagement data (sent, delivered, opened, clicked, bounced, etc.). Paginated.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

status
string

Filter by send status. One of: pending, queued, sent, delivered, failed, bounced.

Example:
delivered
opened
boolean

Filter to contacts that opened (true) or did not open (false) the email.

Example:
true
clicked
boolean

Filter to contacts that clicked (true) or did not click (false) any link.

Example:
true
search
string

Search contacts by email, first name, last name, or company.

Example:
jane@
per_page
integer

Number of items per page. Default: 15.

Example:
25
Example request:
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"
Example response:
{
    "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 Sending Progress.

GET
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}/progress
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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
        }
    }
}
{
    "success": false,
    "message": "Campaign is not in progress."
}

Preview Campaign.

POST
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}/preview
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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"
        }
    }
}
{
    "success": false,
    "message": "Campaign has no email content to preview."
}
{
    "success": false,
    "message": "No recipients available to preview this campaign."
}

Create Campaign.

POST
https://api.surecontact.com
/api/v1/public/campaigns
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "The name field is required."
        ]
    }
}

Update Campaign.

PUT
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"
Example response:
{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Spring Sale 2025 — v2",
        "subject": "Final hours: 25% off",
        "status": {
            "value": "draft",
            "label": "Draft",
            "color": "gray"
        }
    }
}
{
    "success": false,
    "message": "Campaign cannot be edited once it has started sending."
}

Duplicate Campaign.

POST
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}/duplicate
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign to duplicate.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"
Example response:
{
    "data": {
        "uuid": "11111111-2222-3333-4444-555555555555",
        "name": "Spring Sale 2025 — Resend",
        "status": {
            "value": "draft",
            "label": "Draft",
            "color": "gray"
        }
    }
}

Estimate Recipients.

POST
https://api.surecontact.com
/api/v1/public/campaigns/estimate-recipients
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
            }
        ]
    }
}"
Example response:
{
    "success": true,
    "data": {
        "count": 1250,
        "lists_selected": 1,
        "filters_applied": true
    }
}

Delete Campaign.

DELETE
https://api.surecontact.com
/api/v1/public/campaigns/{campaign_uuid}
requires authentication

Soft-delete a campaign. Drafts, cancelled, and completed campaigns can be deleted. In-progress (sending) campaigns must be cancelled first.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

campaign_uuid
string
required

The UUID of the campaign.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
[Empty response]
{
    "success": false,
    "message": "Campaign cannot be deleted while sending."
}

Bulk Delete Campaigns.

POST
https://api.surecontact.com
/api/v1/public/campaigns/bulk-delete
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
    ]
}"
Example response:
{
    "message": "3 campaigns deleted, 1 skipped (in-progress).",
    "deleted_count": 3,
    "skipped_count": 1,
    "skipped_uuids": [
        "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
    ]
}

Companies

Account-level CRM endpoints. Requires the companies plan feature.

List companies.

GET
https://api.surecontact.com
/api/v1/public/companies
requires authentication

Returns a paginated, filterable, sortable list of companies in the current workspace. Requires the workspace plan to have the companies feature.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

search
string

Free-text search across name, domain, and website. Must not be greater than 255 characters.

Example:
Acme
created_by_uuid
string

Filter to companies created by a specific user UUID. Must be a valid UUID.

Example:
550e8400-e29b-41d4-a716-446655440000
lifecycle_stage
string

Filter by lifecycle stage (subscriber, lead, marketing_qualified_lead, sales_qualified_lead, opportunity, customer, evangelist, other).

Must be one of:
  • subscriber
  • lead
  • marketing_qualified_lead
  • sales_qualified_lead
  • opportunity
  • customer
  • evangelist
  • other
Example:
customer
type
string

Filter by company type (prospect, customer, partner, reseller, vendor, other).

Must be one of:
  • prospect
  • customer
  • partner
  • reseller
  • vendor
  • other
Example:
customer
lead_status
string

Filter by lead status (new, open, in_progress, open_deal, unqualified, attempted_to_contact, connected, bad_timing).

Must be one of:
  • new
  • open
  • in_progress
  • open_deal
  • unqualified
  • attempted_to_contact
  • connected
  • bad_timing
Example:
new
employee_range
string

Filter by employee range bucket (1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+).

Must be one of:
  • 1-10
  • 11-50
  • 51-200
  • 201-500
  • 501-1000
  • 1001-5000
  • 5001-10000
  • 10001+
Example:
11-50
annual_revenue_range
string

Filter by annual revenue bucket (under_1m, 1m_10m, 10m_50m, 50m_100m, 100m_500m, 500m_1b, 1b_plus).

Must be one of:
  • under_1m
  • 1m_10m
  • 10m_50m
  • 50m_100m
  • 100m_500m
  • 500m_1b
  • 1b_plus
Example:
1m_10m
industry
string

Filter by industry string (exact match). Must not be greater than 255 characters.

Example:
Software
domain
string

Filter by exact domain (case-insensitive). Must not be greater than 255 characters.

Example:
acme.com
year_founded
integer

Filter by exact year founded. Must be at least 1700. Must not be greater than 2026.

Example:
2015
year_founded_min
integer

Filter to companies founded on or after this year. Must be at least 1700. Must not be greater than 2026.

Example:
2010
year_founded_max
integer

Filter to companies founded on or before this year. Must be at least 1700. Must not be greater than 2026.

Example:
2024
has_contacts
string

When true, return only companies with at least one linked contact.

Must be one of:
  • true
  • false
  • 0
  • 1
  • 1
Example:
true
archived
string

When true, return only archived companies; false (default) returns only active companies.

Must be one of:
  • true
  • false
  • 0
  • 1
  • 1
Example:
false
contact_uuid
string

When 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.

Example:
550e8400-e29b-41d4-a716-446655440000
exact_company_name
string

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.

Example:
Acme Corporation
sort_by
string

Sort column: created_at, name, contacts_count, last_activity_at, lifecycle_stage.

Must be one of:
  • created_at
  • name
  • contacts_count
  • last_activity_at
  • lifecycle_stage
Example:
created_at
sort_dir
string

Sort direction: asc or desc.

Must be one of:
  • asc
  • desc
Example:
desc
per_page
integer

Items per page (1-100, default 20). Must be at least 1. Must not be greater than 100.

Example:
20

Response Fields

Example request:
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"
Example response:
{
    "success": false,
    "message": "Your current plan does not include the Companies module."
}

Show a company.

GET
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}
requires authentication

Returns a single company by UUID with createdBy, parentCompany, and customValues eager-loaded.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "success": false,
    "message": "This action is unauthorized."
}

List the contacts linked to a company.

GET
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/contacts
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Items per page (1-100, default 20).

Example:
20
Example request:
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"
Example response:

Create a company.

POST
https://api.surecontact.com
/api/v1/public/companies
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
    }
}"
Example response:
{
    "success": false,
    "message": "You've reached your plan's companies limit."
}
{
    "success": false,
    "message": "The name field is required."
}
{
    "success": false,
    "message": "A company with this name already exists in this workspace.",
    "errors": {
        "name": [
            "A company with this name already exists in this workspace."
        ]
    }
}

Update a company.

PUT
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
    }
}"
Example response:
{
    "success": false,
    "message": "The selected parent company uuid is invalid."
}
{
    "success": false,
    "message": "A company with this name already exists in this workspace.",
    "errors": {
        "name": [
            "A company with this name already exists in this workspace."
        ]
    }
}

Archive a company (hide from active list, recoverable via unarchive).

POST
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/archive
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"

Unarchive a previously archived company.

POST
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/unarchive
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"

Link an existing contact to this company.

POST
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/contacts
requires authentication

If is_primary is omitted, the link is auto-marked primary when this is the contact's first company link.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"
Example response:
{
    "success": false,
    "message": "The selected contact uuid is invalid."
}

Attach multiple contacts to a company in one call.

POST
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/contacts/bulk-attach
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"

Set a contact's primary company.

POST
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/contacts/{contact_uuid}/primary
requires authentication

Marks this company as the contact's primary link and clears the flag from any other company links the contact has.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000
contact_uuid
string
required

The UUID of the contact. Must already be linked to this company.

Example:
770e8400-e29b-41d4-a716-446655440000
Example request:
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"

Delete a company.

DELETE
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}
requires authentication

Deletes the company; pivot links to contacts are preserved and the contact's company string column is not affected.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
[Empty response]

Unlink a contact from a company.

DELETE
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/contacts/{contact_uuid}
requires authentication

If the contact's primary link is removed, one of the remaining links is promoted to primary automatically.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000
contact_uuid
string
required

The UUID of the contact to unlink. Must belong to the same workspace.

Example:
770e8400-e29b-41d4-a716-446655440000
Example request:
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"

Company Custom Fields

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.

List company custom fields.

GET
https://api.surecontact.com
/api/v1/public/company-custom-fields
requires authentication

Returns the company-scoped custom field schema for the current workspace.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
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"
Example response:

Show a company custom field.

GET
https://api.surecontact.com
/api/v1/public/company-custom-fields/{companyCustomField_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

companyCustomField_uuid
string
required
Example:
4976b155-4a1c-4a95-897b-3a4f7ad3fd37
company_custom_field_uuid
string
required

The UUID of the company custom field.

Example:
aa0e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:

Company Notes

APIs for managing notes attached to companies. Notes allow free-form account-level context separate from contact notes.

List company notes.

GET
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/notes
requires authentication

Get paginated notes for a specific company in reverse chronological order.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

page
integer

The page number.

Example:
1
per_page
integer

Items per page (1-100, default 20).

Example:
20
Example request:
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"
Example response:

Show a company note.

GET
https://api.surecontact.com
/api/v1/public/company-notes/{companyNote_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

companyNote_uuid
string
required
Example:
12d107d1-5717-4808-9f06-105a18974d1c
company_note_uuid
string
required

The UUID of the company note.

Example:
990e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:

Create a company note.

POST
https://api.surecontact.com
/api/v1/public/companies/{company_uuid}/notes
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

company_uuid
string
required

The UUID of the company.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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.\"
}"

Update a company note.

PUT
https://api.surecontact.com
/api/v1/public/company-notes/{companyNote_uuid}
requires authentication

The note creator can always update their own note; everyone else requires manager+ role on the workspace.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

companyNote_uuid
string
required
Example:
12d107d1-5717-4808-9f06-105a18974d1c
company_note_uuid
string
required

The UUID of the company note.

Example:
990e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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.\"
}"

Delete a company note.

DELETE
https://api.surecontact.com
/api/v1/public/company-notes/{companyNote_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

companyNote_uuid
string
required
Example:
12d107d1-5717-4808-9f06-105a18974d1c
company_note_uuid
string
required

The UUID of the company note.

Example:
990e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
[Empty response]

Contact Activities

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).

List Activities.

GET
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/activities
requires authentication

Get paginated activities for a specific contact. Activities are returned in reverse chronological order (newest first).

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

type
string

Filter by activity type.

Example:
email_sent
from
string

Filter activities from this date (ISO 8601).

Example:
2025-01-01T00:00:00+00:00
to
string

Filter activities until this date (ISO 8601).

Example:
2025-01-31T23:59:59+00:00
days
integer

Filter to activities from the last N days.

Example:
30
per_page
integer

Number of items per page. Default: 15.

Example:
20
Example request:
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"
Example response:
{
    "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
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}

Get Activity.

GET
https://api.surecontact.com
/api/v1/public/activities/{activity_uuid}
requires authentication

Get details of a specific activity.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

activity_uuid
string
required

The UUID of the activity.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "Activity not found."
}

Create Activity.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/activities
requires authentication

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).

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
    }
}"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}
{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "type": [
            "Invalid activity type."
        ],
        "description": [
            "Activity description is required."
        ]
    }
}

Contact Management

APIs for managing contacts within a workspace. Contacts are the core entity representing individuals you interact with.

Get paginated contacts.

GET
https://api.surecontact.com
/api/v1/public/contacts
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
        }
    ]
}"
Example response:

Find Contact by Email.

GET
https://api.surecontact.com
/api/v1/public/contacts/email/{email}
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

email
string
required

The email address to search for.

Example request:
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"
Example response:

Show a specific contact.

GET
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required
Example:
b5783fab-aef4-4bf8-b701-8f6748ccedca
Example request:
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"
Example response:

Find or Create Contact.

POST
https://api.surecontact.com
/api/v1/public/contacts
requires authentication

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:

  • If contact with email exists → Return existing contact (no updates to primary fields)
  • If contact doesn't exist → Create new contact with provided data
  • If 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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
    ]
}"
Example response:
{
    "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"
    }
}
{
    "success": true,
    "is_created": true,
    "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-15T10:30:00+00:00",
        "updated_at": "2025-01-15T10:30:00+00:00"
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}
{
    "success": false,
    "message": "The primary_fields.email field is required."
}

Upsert Contact.

POST
https://api.surecontact.com
/api/v1/public/contacts/upsert
requires authentication

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:

  • If contact with email exists → Update with provided data, return with is_created: false
  • If contact doesn't exist → Create new contact, return with is_created: true
  • If 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 keep contact data synchronized with an external system.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
    ]
}"
Example response:
{
    "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"
    }
}
{
    "success": true,
    "is_created": true,
    "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-15T10:30:00+00:00",
        "updated_at": "2025-01-15T10:30:00+00:00"
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}
{
    "success": false,
    "message": "The primary_fields.email field is required."
}

Update a contact.

PUT
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}
requires authentication

Update an existing contact's information. Only the fields provided will be updated.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
    }
}"
Example response:
{
    "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"
}
{
    "success": false,
    "message": "This action is unauthorized."
}
{
    "success": false,
    "message": "Contact not found"
}
{
    "success": false,
    "message": "The primary_fields.email has already been taken."
}

Update a contact's status.

PATCH
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/status
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required
Example:
b5783fab-aef4-4bf8-b701-8f6748ccedca

Body Parameters

Example request:
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\"
}"

Attach tags to a contact.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/tags/attach
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required
Example:
b5783fab-aef4-4bf8-b701-8f6748ccedca

Body Parameters

Example request:
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\"
    ]
}"

Detach tags from a contact.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/tags/detach
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required
Example:
b5783fab-aef4-4bf8-b701-8f6748ccedca

Body Parameters

Example request:
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\"
    ]
}"

Attach lists to a contact.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/lists/attach
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required
Example:
b5783fab-aef4-4bf8-b701-8f6748ccedca

Body Parameters

Example request:
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\"
    ]
}"

Detach lists from a contact.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/lists/detach
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required
Example:
b5783fab-aef4-4bf8-b701-8f6748ccedca

Body Parameters

Example request:
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\"
    ]
}"

Attach this contact to multiple companies in one call.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/companies/bulk-attach
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"

Delete a contact.

DELETE
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required
Example:
b5783fab-aef4-4bf8-b701-8f6748ccedca
Example request:
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"

Resend Double Opt-in Confirmation.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/resend-double-opt-in
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "success": true,
    "message": "Double opt-in confirmation email resent.",
    "data": {
        "contact": {
            "uuid": "550e8400-e29b-41d4-a716-446655440000",
            "email": "[email protected]"
        }
    }
}
{
    "success": false,
    "message": "Double opt-in resend only applies to pending contacts.",
    "errors": null
}

Contact Notes

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).

List Notes.

GET
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/notes
requires authentication

Get paginated notes for a specific contact. Notes are returned in reverse chronological order (newest first).

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

per_page
integer

Number of items per page. Default: 15.

Example:
20
page
integer

Page number.

Example:
1
Example request:
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"
Example response:
{
    "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
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}

Get Note.

GET
https://api.surecontact.com
/api/v1/public/notes/{note_uuid}
requires authentication

Get details of a specific note.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

note_uuid
string
required

The UUID of the note.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "Note not found."
}

Create Note.

POST
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/notes
requires authentication

Create a new note for a contact. The note will be attributed to the authenticated user (or API key owner for public API).

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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.\"
}"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "content": [
            "Note content is required."
        ]
    }
}

Update Note.

PUT
https://api.surecontact.com
/api/v1/public/notes/{note_uuid}
requires authentication

Update an existing note. Only the note creator or workspace managers can update notes.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

note_uuid
string
required

The UUID of the note.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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.\"
}"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}

Delete Note.

DELETE
https://api.surecontact.com
/api/v1/public/notes/{note_uuid}
requires authentication

Soft delete a note. Only the note creator or workspace managers can delete notes.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

note_uuid
string
required

The UUID of the note.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
[Empty response]
{
    "success": false,
    "message": "This action is unauthorized."
}

Custom Field Management

APIs for managing custom fields within a workspace. Custom fields allow extending contact data with workspace-specific attributes.

Get all custom fields.

GET
https://api.surecontact.com
/api/v1/public/custom-fields
requires authentication

Pass ?grouped=true to receive fields nested under their sections. The default flat response remains backward-compatible.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
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"
Example response:

Show a specific custom field.

GET
https://api.surecontact.com
/api/v1/public/custom-fields/{customField_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

customField_uuid
string
required
Example:
5aea5a89-56fe-4ea7-8ba3-229e647fb8e7
Example request:
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"
Example response:

Email

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 Email.

POST
https://api.surecontact.com
/api/v1/public/emails/send
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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
}"
Example response:
{
    "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]"
    }
}
{
    "success": false,
    "message": "Contact not found in this workspace.",
    "errors": null
}
{
    "success": false,
    "message": "Email content was rejected by content moderation (phishing). Remove prohibited content before sending.",
    "errors": null
}

Email Templates

List all email templates.

GET
https://api.surecontact.com
/api/v1/public/email-templates
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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
}"
Example response:

Show a single email template.

GET
https://api.surecontact.com
/api/v1/public/email-templates/{template_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

template_uuid
string
required
Example:
f3b2ea1c-695c-4479-b58c-32849923a1de
Example request:
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"
Example response:

Forms

List all forms for workspace.

GET
https://api.surecontact.com
/api/v1/public/forms
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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
}"
Example response:

Show a single form.

GET
https://api.surecontact.com
/api/v1/public/forms/{form_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

form_uuid
string
required
Example:
1364df30-2256-4a0c-b7c4-088456a4483c
Example request:
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"
Example response:

Get form submissions.

GET
https://api.surecontact.com
/api/v1/public/forms/{form_uuid}/submissions
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

form_uuid
string
required
Example:
1364df30-2256-4a0c-b7c4-088456a4483c

Body Parameters

Example request:
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
}"
Example response:

List Management

APIs for managing lists within a workspace. Lists can be static (manually managed) or dynamic (filter-based).

Get all lists.

GET
https://api.surecontact.com
/api/v1/public/lists
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

archived
string

Filter by archive status: "false" (default, active only), "true" (archived only), "all" (both).

Example:
false
Example request:
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"
Example response:

Show a specific list.

GET
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1
Example request:
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"
Example response:

Get contacts in a list (with runtime evaluation for dynamic lists).

GET
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}/contacts
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1
Example request:
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"
Example response:

Get refresh status for a list GET /api/v1/lists/{list}/refresh-status.

GET
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}/refresh-status
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1
Example request:
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"
Example response:

Create a new list.

POST
https://api.surecontact.com
/api/v1/public/lists
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\": []
}"

Update a list.

PUT
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1

Body Parameters

Example request:
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\": []
}"

Add contacts to a list.

POST
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}/contacts/add
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1

Body Parameters

Example request:
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\"
    ]
}"

Remove contacts from a list.

POST
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}/contacts/remove
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1

Body Parameters

Example request:
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\"
    ]
}"

Copy a list.

POST
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}/copy
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1
Example request:
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"

Manually refresh a single dynamic list POST /api/v1/lists/{list}/refresh.

POST
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}/refresh
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1
Example request:
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"

Public API: Refresh all dynamic lists in the workspace resolved from API key POST /api/v1/public/lists/refresh-all.

POST
https://api.surecontact.com
/api/v1/public/lists/refresh-all
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
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"

Delete a list.

DELETE
https://api.surecontact.com
/api/v1/public/lists/{list_uuid}
requires authentication

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

list_uuid
string
required
Example:
c0dd539b-0c2a-4678-975e-dab016cc32e1
Example request:
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"

Purchases

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).

List Purchases.

GET
https://api.surecontact.com
/api/v1/public/purchases
requires authentication

Get paginated list of purchases for the workspace. Purchases are returned in reverse chronological order (newest first).

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

per_page
integer

Number of items per page (1-100). Default: 20.

Example:
20
page
integer

Page number.

Example:
1
status
string

Filter by purchase status.

Example:
completed
source
string

Filter by purchase source.

Example:
api
contact_uuid
string

Filter by contact UUID.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"
Example response:
{
    "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
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}

Get Purchase.

GET
https://api.surecontact.com
/api/v1/public/purchases/{purchase_uuid}
requires authentication

Retrieve a specific purchase by UUID.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

purchase_uuid
string
required

The UUID of the purchase.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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]"
        }
    }
}
{
    "success": false,
    "message": "Purchase not found"
}

Get Contact Purchases.

GET
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/purchases
requires authentication

Retrieve purchase history for a specific contact, ordered by most recent first.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

per_page
integer

Number of purchases per page (1-100). Default: 20.

Example:
20
page
integer

Page number. Default: 1.

Example:
1

Body Parameters

Example request:
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
}"
Example response:
{
    "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
    }
}
{
    "success": false,
    "message": "Contact not found"
}

Get Contact Purchase Stats.

GET
https://api.surecontact.com
/api/v1/public/contacts/{contact_uuid}/purchase-stats
requires authentication

Retrieve purchase statistics for a specific contact including total purchases, total spent, average order value, and purchase date range.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

contact_uuid
string
required

The UUID of the contact.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "Contact not found"
}

Create Purchase.

POST
https://api.surecontact.com
/api/v1/public/purchases
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
    }
}"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "Contact not found",
    "error_code": "CONTACT_NOT_FOUND"
}
{
    "success": false,
    "message": "Purchase already exists",
    "error_code": "DUPLICATE_PURCHASE"
}
{
    "success": false,
    "message": "The order_id field is required."
}

Cancel Purchase.

POST
https://api.surecontact.com
/api/v1/public/purchases/{purchase_uuid}/cancel
requires authentication

Mark a purchase as cancelled. This updates the status to 'cancelled' and records the cancellation timestamp.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

purchase_uuid
string
required

The UUID of the purchase to cancel.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}
{
    "success": false,
    "message": "Purchase not found",
    "error_code": "PURCHASE_NOT_FOUND"
}

Refund Purchase.

POST
https://api.surecontact.com
/api/v1/public/purchases/{purchase_uuid}/refund
requires authentication

Mark a purchase as refunded. This updates the status to 'refunded' and records the refund timestamp.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

purchase_uuid
string
required

The UUID of the purchase to refund.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "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"
    }
}
{
    "success": false,
    "message": "This action is unauthorized."
}
{
    "success": false,
    "message": "Purchase not found",
    "error_code": "PURCHASE_NOT_FOUND"
}

Reports

APIs for advanced analytics and reporting with date filtering, comparison periods, and export functionality.

Get reports overview.

GET
https://api.surecontact.com
/api/v1/public/reports/overview
requires authentication

Returns high-level KPIs across contacts, emails, engagement, and revenue with optional comparison to previous period.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Get contact growth report.

GET
https://api.surecontact.com
/api/v1/public/reports/contacts/growth
requires authentication

Returns contact growth statistics with optional filtering by tag or list.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Get email sending stats.

GET
https://api.surecontact.com
/api/v1/public/reports/emails/sending
requires authentication

Returns email sending statistics including sent, delivered, failed, and bounced counts.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Get email engagement stats.

GET
https://api.surecontact.com
/api/v1/public/reports/emails/engagement
requires authentication

Returns email engagement statistics including opens, clicks, and rates.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:
GET
https://api.surecontact.com
/api/v1/public/reports/links/clicks
requires authentication

Returns top clicked links with total and unique click counts.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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
}"
Example response:

Get unsubscribe stats.

GET
https://api.surecontact.com
/api/v1/public/reports/unsubscribes
requires authentication

Returns unsubscribe statistics with optional reasons breakdown.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Get bounce stats.

GET
https://api.surecontact.com
/api/v1/public/reports/bounces
requires authentication

Returns bounce statistics with hard/soft bounce breakdown.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Get e-commerce revenue stats.

GET
https://api.surecontact.com
/api/v1/public/reports/ecommerce/revenue
requires authentication

Returns revenue statistics including total revenue, orders, AOV, and trends.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Get e-commerce product performance.

GET
https://api.surecontact.com
/api/v1/public/reports/ecommerce/products
requires authentication

Returns top products by revenue and order count.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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
}"
Example response:

Get campaign performance summary.

GET
https://api.surecontact.com
/api/v1/public/reports/campaigns/summary
requires authentication

Returns aggregated metrics across all campaigns.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Export report data.

GET
https://api.surecontact.com
/api/v1/public/reports/export
requires authentication

Downloads report data as CSV or Excel file.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:

Sequences

List Sequences.

GET
https://api.surecontact.com
/api/v1/public/sequences
requires authentication

Public-API alias of index() filtered to type=sequence. Returns a paginated list of sequences (Automations of type=sequence) in the current workspace.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

search
string

Filter by sequence name.

Example:
onboarding
status
string

Filter by status (draft, active, inactive).

Example:
active
sort_by
string

Field to sort by.

Example:
created_at
sort_order
string

asc or desc.

Example:
desc
per_page
integer

Items per page (max 100).

Example:
15
Example request:
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"
Example response:

Show Sequence.

GET
https://api.surecontact.com
/api/v1/public/sequences/{automation_uuid}
requires authentication

Returns a single sequence by UUID. Returns 404 if the automation exists but is not a sequence (i.e., a workflow).

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

automation_uuid
string
required

UUID of the sequence.

Example:
7c9e6679-7425-40de-944b-e07fc1f90ae7
Example request:
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"
Example response:

Enroll Contact in Sequence.

POST
https://api.surecontact.com
/api/v1/public/sequences/{automation_uuid}/enroll
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

automation_uuid
string
required

UUID of the sequence.

Example:
7c9e6679-7425-40de-944b-e07fc1f90ae7

Body Parameters

Example request:
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]\"
}"
Example response:
{
    "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]"
        }
    }
}
{
    "success": false,
    "message": "The specified automation is not a sequence.",
    "errors": null
}
{
    "success": false,
    "message": "Automation must be active to enroll contacts",
    "errors": null
}

Unenroll Contact from Sequence.

POST
https://api.surecontact.com
/api/v1/public/sequences/{automation_uuid}/unenroll
requires authentication

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.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

automation_uuid
string
required

UUID of the sequence.

Example:
7c9e6679-7425-40de-944b-e07fc1f90ae7

Body Parameters

Example request:
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]\"
}"
Example response:
{
    "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]"
        }
    }
}

Tag Management

APIs for managing tags within a workspace. Tags can be applied to contacts for categorization and segmentation purposes.

List Tags.

GET
https://api.surecontact.com
/api/v1/public/tags
requires authentication

Get all tags for the current workspace with optional search and sorting.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

search
string

Search tags by name or slug.

Example:
newsletter
archived
string

Filter by archive status: "false" (default, active only), "true" (archived only), "all" (both).

Example:
false
sort
string

Sort field. Allowed: name, slug, usage_count, created_at, updated_at.

Example:
name
direction
string

Sort direction: asc or desc. Default: asc.

Example:
asc
per_page
integer

Number of items per page. Default: 15.

Example:
20
Example request:
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"
Example response:
{
    "data": [
        {
            "uuid": "550e8400-e29b-41d4-a716-446655440000",
            "name": "Newsletter",
            "slug": "newsletter",
            "color": "#3B82F6",
            "description": "Subscribed to newsletter",
            "usage_count": 150,
            "archived_at": null,
            "created_at": "2025-01-01T00:00:00+00:00"
        }
    ],
    "links": {},
    "meta": {
        "current_page": 1,
        "per_page": 15,
        "total": 10
    }
}

Get Tag.

GET
https://api.surecontact.com
/api/v1/public/tags/{tag_uuid}
requires authentication

Get details of a specific tag.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

tag_uuid
string
required

The UUID of the tag.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "VIP Customer",
        "slug": "vip-customer",
        "color": "#10B981",
        "description": "High-value customers",
        "usage_count": 25,
        "archived_at": null,
        "created_at": "2025-01-01T00:00:00+00:00"
    }
}
{
    "success": false,
    "message": "Resource not found"
}

Get Tag Contacts.

GET
https://api.surecontact.com
/api/v1/public/tags/{tag_uuid}/contacts
requires authentication

Get all contacts that have this tag applied.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

tag_uuid
string
required

The UUID of the tag.

Example:
550e8400-e29b-41d4-a716-446655440000

Query Parameters

per_page
integer

Number of items per page. Default: 15.

Example:
20
Example request:
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"
Example response:
{
    "data": [
        {
            "uuid": "660e8400-e29b-41d4-a716-446655440001",
            "email": "[email protected]",
            "first_name": "John",
            "last_name": "Doe",
            "full_name": "John Doe",
            "phone": "+1234567890",
            "company": "Acme Inc",
            "job_title": "Manager",
            "source": "manual",
            "source_label": "Manual",
            "status": "active",
            "email_status": "valid",
            "created_at": "2025-01-01T00:00:00+00:00"
        }
    ],
    "links": {},
    "meta": {
        "current_page": 1,
        "per_page": 15,
        "total": 50
    }
}
{
    "success": false,
    "message": "Resource not found"
}

Create Tag.

POST
https://api.surecontact.com
/api/v1/public/tags
requires authentication

Create a new tag in the current workspace.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
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\"
}"
Example response:
{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "VIP Customer",
        "slug": "vip-customer",
        "color": "#10B981",
        "description": "High-value customers",
        "usage_count": 0,
        "archived_at": null,
        "created_at": "2025-01-15T10:30:00+00:00"
    }
}
{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "The name field is required."
        ]
    }
}

Update Tag.

PUT
https://api.surecontact.com
/api/v1/public/tags/{tag_uuid}
requires authentication

Update an existing tag's details.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

tag_uuid
string
required

The UUID of the tag.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
}"
Example response:
{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "Premium Customer",
        "slug": "premium-customer",
        "color": "#F59E0B",
        "description": "Premium tier customers",
        "usage_count": 25,
        "archived_at": null,
        "created_at": "2025-01-01T00:00:00+00:00"
    }
}

Add Contacts to Tag.

POST
https://api.surecontact.com
/api/v1/public/tags/{tag_uuid}/contacts/add
requires authentication

Add multiple contacts to a tag. Contacts that already have the tag will be skipped. Maximum 10,000 contacts per request.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

tag_uuid
string
required

The UUID of the tag.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
    ]
}"
Example response:
{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "VIP Customer",
        "slug": "vip-customer",
        "color": "#10B981",
        "description": "High-value customers",
        "usage_count": 27,
        "archived_at": null,
        "created_at": "2025-01-01T00:00:00+00:00"
    }
}
{
    "success": false,
    "message": "Resource not found"
}
{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "contact_uuids": [
            "At least one contact UUID is required."
        ]
    }
}

Remove Contacts from Tag.

POST
https://api.surecontact.com
/api/v1/public/tags/{tag_uuid}/contacts/remove
requires authentication

Remove multiple contacts from a tag. Contacts that don't have the tag will be skipped. Maximum 10,000 contacts per request.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

tag_uuid
string
required

The UUID of the tag.

Example:
550e8400-e29b-41d4-a716-446655440000

Body Parameters

Example request:
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\"
    ]
}"
Example response:
{
    "data": {
        "uuid": "550e8400-e29b-41d4-a716-446655440000",
        "name": "VIP Customer",
        "slug": "vip-customer",
        "color": "#10B981",
        "description": "High-value customers",
        "usage_count": 23,
        "archived_at": null,
        "created_at": "2025-01-01T00:00:00+00:00"
    }
}
{
    "success": false,
    "message": "Resource not found"
}
{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "contact_uuids": [
            "At least one contact UUID is required."
        ]
    }
}

Delete Tag.

DELETE
https://api.surecontact.com
/api/v1/public/tags/{tag_uuid}
requires authentication

Permanently delete a tag. This will remove the tag from all contacts.

Headers

X-API-Key
Example:
{YOUR_API_KEY}
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

tag_uuid
string
required

The UUID of the tag.

Example:
550e8400-e29b-41d4-a716-446655440000
Example request:
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"
Example response:
[Empty response]
{
    "success": false,
    "message": "Resource not found"
}