smartchat

Create contact export

Stores a copy of the contacts that match the filters (names, numbers, emails) for 24 hours, ready when the call returns; read the rows with get_contact_export. Sends nothing and changes no contact. Needs an Idempotency-Key header.

POST /v1/contact-exports

Permissioncontacts:read (all permissions)
RiskWrite (no outside effect)
Idempotency-KeyRequired (how it works)
Safe to repeatSafe to repeat with the same Idempotency-Key: the first answer comes back and nothing is done twice.
Rate limit classbulk (120 requests per minute per key)
ConfirmationNone
MCP toolexport_contacts
Since version2026-10-25

#What it does

  • Changes data in your account. It does not send messages to contacts.
  • Safe to repeat with the same Idempotency-Key.

#Request

Header

NameRequiredDescription
AuthorizationyesBearer <key>
Idempotency-KeyyesA unique value for this operation, for example a UUID (1 to 255 visible ASCII characters).

Body (JSON)

NameTypeRequiredDescription
querystringnoName, phone number or email, or part of it. Case does not matter. up to 100 characters
tagstringnoOnly contacts with this tag. Case does not matter. up to 60 characters
optin_whatsappstringnoOnly contacts with this WhatsApp opt-in status. one of: none, pending, confirmed, opted_out
created_afterstringnoOnly contacts created after this time (ISO 8601). up to 40 characters; format date-time
created_beforestringnoOnly contacts created before this time (ISO 8601). up to 40 characters; format date-time

#Examples

curl -X POST "https://api.smartchat.marketing/v1/contact-exports" \
  -H "Authorization: Bearer $SMARTCHAT_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "tag": "vip"
}'
import os
import uuid
import requests

response = requests.post(
    "https://api.smartchat.marketing/v1/contact-exports",
    headers={
        "Authorization": "Bearer " + os.environ["SMARTCHAT_API_KEY"],
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "tag": "vip",
    },
)
response.raise_for_status()
print(response.json())
const response = await fetch("https://api.smartchat.marketing/v1/contact-exports", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SMARTCHAT_API_KEY}`,
    "Idempotency-Key": crypto.randomUUID(),
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "tag": "vip"
  }),
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());

Response (201):

{
  "object": "contact_export",
  "id": "exp_4d5e6f7a8b9c40d1e2f3a4b5c6d7e8f9",
  "status": "completed",
  "row_count": 1,
  "truncated": false,
  "columns": [
    "id",
    "name",
    "phone",
    "email",
    "status",
    "tags",
    "created_at"
  ],
  "created_at": "2026-10-25T09:41:07Z",
  "expires_at": "2026-10-26T09:41:07Z"
}

#Response

Status 201. Every response has the headers Request-Id, SmartChat-Version and X-RateLimit-*.

NameTypeDescription
objectstringAlways "contact_export". always contact_export
idstringExport ID.
statusstringState of the export. Exports are ready when the call returns. one of: completed
row_countintegerNumber of contacts in the export. 0 to 1000000
truncatedbooleanTrue if more contacts matched than one export holds (50,000). Narrow the filters and export again.
columnsarray of stringFields of each row. up to 20 items
created_atstringWhen the export was created. up to 40 characters; format date-time
expires_atstringWhen the export is removed (24 hours after creation). up to 40 characters; format date-time

#Errors

CodeStatusWhen
bad_request400The request could not be read.
idempotency_key_invalid400The 'Idempotency-Key' header must be 1 to 255 visible ASCII characters.
idempotency_key_required400This call needs an 'Idempotency-Key' header.
missing_parameter400A required field is missing.
unknown_parameter400A field is not known.
api_key_expired401This API key has expired.
api_key_invalid401This API key is not valid.
api_key_revoked401This API key was revoked.
authentication_required401No API key was sent. Send 'Authorization: Bearer <key>'.
account_blocked403This account is blocked.
insufficient_scope403This key lacks a required permission.
ip_not_allowed403This IP address is not allowed for this key.
idempotency_in_progress409A request with this idempotency key is still running.
idempotency_key_reused422This idempotency key was already used with a different request.
validation_failed422A field is not valid.
rate_limited429Too many requests. Wait and try again.
internal_error500Something went wrong on our side.
service_unavailable503The service is temporarily unavailable.

All errors use one format.