API

Contacts API

Ingest, list, update, export, and erase contacts.

Upsert people with a stable id from your product. Do not use email as the only identity if users can change it.

Endpoints: ingestContacts, listProjectContacts, getProjectContact, updateProjectContact, eraseProjectContact, exportProjectContacts, createContactImport

Scope: write for ingest and update; read for list/get/export; erasure is a deliberate write (and is audited).

Ingest

POST /v1/projects/{projectId}/contact_ingestion

Up to 5,000 contacts per request. Prefer a few hundred per batch.

JSON
{
  "contacts": [{
    "externalId": "user_42",
    "email": "amelia@example.com",
    "locale": "en",
    "properties": { "plan": "pro", "first_name": "Amelia" }
  }]
}

externalId makes retries safe. Properties use schema keys. Do not put marketing consent in properties — use createConsentEvent.

curl -X POST "$AUDRYO_API_BASE/projects/$PROJECT_ID/contact_ingestion" \
  -H "Authorization: Bearer $AUDRYO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contacts":[{"externalId":"user_42","email":"amelia@example.com","properties":{"plan":"pro"}}]}'

List and get

GET /v1/projects/{projectId}/contacts is cursor-paginated (page[after], see API introduction).

GET /v1/projects/{projectId}/contacts/{contactId} returns the profile, including properties Audryo stored.

Update and erase

Patch properties with updateProjectContact. Erase (eraseProjectContact) removes personal data and takes the person off the contact list. An anonymous hold remains so the same address is not mailed again.

CSV import API

createContactImport starts the same job as Data → Import. Poll listContactImports until it finishes.