Topolo Docs Topolo Platform
Open workspace

Create prospect contact

Create one manual prospect contact without enrolling or messaging it.

Outcome

Create one manual prospect contact without enrolling or messaging it.

Before you start

  • Verify the environment, credential, authorized organization and the published action permission workspace:write.
  • Discover an accessible Engage workspace and bind resourceType=workspace and its resourceId separately from action input. Fixture identifiers grant no access.
  • Approve the exact mutation and its effects before CLI --confirm or MCP confirm:true. This documentation does not authorize outreach.

Discover the target

  • Select the authorized workspace and review the intended email and profile. Use contacts.resolve first to check whether the normalized address already belongs to a contact.
topolo whoami --json
topolo actions get app_topolo_engage.contacts.create --json
topolo workspaces list topolo-engage --json

Input fields

FieldRequiredMeaning and constraints
emailYesRequired intended email address, trimmed 3–254 characters; runtime normalization can still refuse an invalid address.
firstNameNoOptional trimmed profile text up to 120 characters; null or blank clears the field.
lastNameNoOptional trimmed profile text up to 120 characters; null or blank clears the field.
companyNoOptional trimmed text up to 200 characters; null or blank clears.
titleNoOptional trimmed text up to 200 characters; null or blank clears.
websiteNoOptional trimmed text up to 500 characters; null or blank clears.
countryNoOptional trimmed text up to 80 characters; null or blank clears.
timezoneNoOptional trimmed text up to 80 characters; null or blank clears.
customNoOptional object with trimmed keys of 1–64 characters and string values up to 1,000 characters. On update, supplied keys merge into retained custom fields; this action has no delete-key input.

Validate, plan and execute

Set ENGAGE_WORKSPACE_ID to the identifier of your selected workspace. Prepare payload.json from the current input schema and discovered identifiers. Use the same payload for validation, planning and execution.

: "${ENGAGE_WORKSPACE_ID:?Set ENGAGE_WORKSPACE_ID to your selected workspace identifier}"
topolo actions validate app_topolo_engage.contacts.create --data @payload.json --json
topolo actions plan app_topolo_engage.contacts.create --resource-type workspace --resource-id "$ENGAGE_WORKSPACE_ID" --data @payload.json --confirm --json

Review the plan and obtain approval for the exact effects before executing the unchanged request.

: "${ENGAGE_WORKSPACE_ID:?Set ENGAGE_WORKSPACE_ID to your selected workspace identifier}"
topolo actions call app_topolo_engage.contacts.create --resource-type workspace --resource-id "$ENGAGE_WORKSPACE_ID" --data @payload.json --confirm --json

For MCP, use topolo_get_action, topolo_validate_action, topolo_plan_action and topolo_call_action. Pass the selected resource context separately; confirm:true is required for mutations.

Worked requests and responses

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: inbound replies thread into the inbox > creates the thread on the first reply with an SLA, the message and its sender hash, and alerts the campaign creator. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical",
  "title": "CTO",
  "custom": {
    "LinkedIn": "https://www.linkedin.com/in/ada",
    "Phone": "+44 20 0000"
  }
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": "CTO",
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {
      "LinkedIn": "https://www.linkedin.com/in/ada",
      "Phone": "+44 20 0000"
    },
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: task steps in sequences > stores linkedin_task and call_task steps with instructions and a due offset, and copies them into a new version. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "grace@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: the run ledger > records a scheduled pass: the heartbeat and one row per workspace touched. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "alan@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "alan@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: reply inbox actions > threads.list and threads.get > lists the queue with counts, overdue first, and filters it. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "bob@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "bob@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: engagement analytics > reports first-touch rates by campaign: each contact once, bounced never replied, test campaigns excluded. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "cy@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "cy@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: engagement analytics > reports first-touch rates by campaign: each contact once, bounced never replied, test campaigns excluded. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "eve@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "eve@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: engagement analytics > reports first-touch rates by campaign: each contact once, bounced never replied, test campaigns excluded. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "dee@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_5",
    "email": "dee@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: engagement analytics > reports first-touch rates by campaign: each contact once, bounced never replied, test campaigns excluded. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "tess@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_6",
    "email": "tess@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: engagement analytics > reports first-touch rates by campaign: each contact once, bounced never replied, test campaigns excluded. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "lastName": "Lovelace"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": "Lovelace",
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: the runner on a WhatsApp template step > skips the step (not the enrollment) without a phone, without an opt-in, after a revoke and with an unresolved variable. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@acme.io",
  "firstName": "Grace",
  "company": "Navy"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "grace@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Grace",
    "lastName": null,
    "company": "Navy",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: runDueSends > hold order > global cap first: holds once the workspace reached its daily cap, until the next day's window. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "dan@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "dan@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: Notify webhook receiver > resolves the message by idempotency key, then X-Entity-Ref-ID, then email message id, then RFC Message-ID. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada",
  "company": "Analytical",
  "timezone": "America/New_York"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": null,
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": "America/New_York",
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: runDueSends > hold order > then the recipient-local window, then the warm-up cap. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada",
  "timezone": "Asia/Tokyo"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": "Asia/Tokyo",
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: the runner on a WhatsApp template step > holds for quiet hours in the contact's time zone until they end. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: runDueSends > skips a message with an unresolved merge field and never sends it empty. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "zed@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_7",
    "email": "zed@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-07T08:30:00.000Z",
    "updatedAt": "2026-10-07T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: engagement analytics > refreshes one enrollment, drops its fact when it was never sent, and never lets analytics stop a send. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "company": "Acme",
  "title": "CTO"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Acme",
    "title": "CTO",
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: ICP filters over the published actions > contacts.list filter > filters by ICP fields over GET, backward compatible without one. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "bob@acme.io",
  "company": "Acme",
  "title": "Sales Manager"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "bob@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Acme",
    "title": "Sales Manager",
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: ICP filters over the published actions > contacts.list filter > filters by ICP fields over GET, backward compatible without one. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "cy@globex.com",
  "company": "Globex",
  "title": "VP Marketing"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "cy@globex.com",
    "domain": "globex.com",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Globex",
    "title": "VP Marketing",
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: ICP filters over the published actions > contacts.list filter > filters by ICP fields over GET, backward compatible without one. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "Ada@Acme.IO",
  "firstName": "Ada",
  "lastName": "",
  "company": "Analytical",
  "custom": {
    "tier": "a"
  }
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": null,
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {
      "tier": "a"
    },
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > creates, reads, searches, edits and archives a manual contact. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "sales@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "sales@acme.io",
    "domain": "acme.io",
    "addressType": "role",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > classifies role and generic addresses. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "mailto:<Info@Example.org>"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "info@example.org",
    "domain": "example.org",
    "addressType": "generic",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > classifies role and generic addresses. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "postmaster@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "postmaster@acme.io",
    "domain": "acme.io",
    "addressType": "generic",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > classifies role and generic addresses. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > returns 409 with the existing id for a duplicate address, archived or not. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p00@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "p00@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p01@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "p01@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p02@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "p02@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p03@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "p03@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p04@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_5",
    "email": "p04@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p05@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_6",
    "email": "p05@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p06@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_7",
    "email": "p06@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p07@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_8",
    "email": "p07@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p08@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_9",
    "email": "p08@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p09@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_10",
    "email": "p09@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p10@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_11",
    "email": "p10@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p11@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_12",
    "email": "p11@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p12@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_13",
    "email": "p12@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p13@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_14",
    "email": "p13@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p14@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_15",
    "email": "p14@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p15@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_16",
    "email": "p15@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p16@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_17",
    "email": "p16@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p17@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_18",
    "email": "p17@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p18@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_19",
    "email": "p18@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p19@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_20",
    "email": "p19@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p20@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_21",
    "email": "p20@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p21@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_22",
    "email": "p21@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p22@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_23",
    "email": "p22@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p23@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_24",
    "email": "p23@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p24@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_25",
    "email": "p24@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p25@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_26",
    "email": "p25@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p26@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_27",
    "email": "p26@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p27@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_28",
    "email": "p27@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p28@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_29",
    "email": "p28@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p29@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_30",
    "email": "p29@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p30@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_31",
    "email": "p30@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p31@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_32",
    "email": "p31@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p32@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_33",
    "email": "p32@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p33@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_34",
    "email": "p33@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p34@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_35",
    "email": "p34@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p35@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_36",
    "email": "p35@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p36@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_37",
    "email": "p36@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p37@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_38",
    "email": "p37@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p38@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_39",
    "email": "p38@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p39@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_40",
    "email": "p39@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p40@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_41",
    "email": "p40@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p41@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_42",
    "email": "p41@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p42@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_43",
    "email": "p42@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p43@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_44",
    "email": "p43@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-05T09:00:00.000Z",
    "updatedAt": "2026-10-05T09:00:00.000Z",
    "archivedAt": null
  }
}

Source test: render ahead for approval > queues a message due tomorrow today, sends it in the window once approved, and never renders twice. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p44@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_45",
    "email": "p44@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p45@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_46",
    "email": "p45@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p46@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_47",
    "email": "p46@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p47@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_48",
    "email": "p47@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p48@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_49",
    "email": "p48@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p49@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_50",
    "email": "p49@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p50@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_51",
    "email": "p50@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > pages newest first with an opaque cursor. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > returns 404 for a contact in another workspace or organization. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts > returns 404 for a contact in another workspace or organization. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "custom": {
    "crm_contact_id": "crm_1"
  }
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {
      "crm_contact_id": "crm_1"
    },
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > contacts.resolve > finds a contact by normalised email or CRM id for a reader, and never creates one. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "grace@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > lists > creates, lists, edits and archives a list. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > imports > updates changed contacts, matches unchanged ones and adds both to the list under a new key. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@acme.io",
  "firstName": "Grace"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "grace@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Grace",
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > imports > updates changed contacts, matches unchanged ones and adds both to the list under a new key. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "old@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "old@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > imports > updates changed contacts, matches unchanged ones and adds both to the list under a new key. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "lastName": "Lovelace"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": "Lovelace",
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-05T09:00:00.000Z",
    "updatedAt": "2026-10-05T09:00:00.000Z",
    "archivedAt": null
  }
}

Source test: render ahead for approval > fails closed: an incomplete footer or an unresolved merge field is held with its reason, never queued. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@navy.mil",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "grace@navy.mil",
    "domain": "navy.mil",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.export > exports a contact that was never enrolled with empty dependent kinds. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T12:00:00.000Z",
    "updatedAt": "2026-10-01T12:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contactability routes > ledger > records blocks idempotently and resolves the contact status. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@navy.mil"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "grace@navy.mil",
    "domain": "navy.mil",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T12:00:00.000Z",
    "updatedAt": "2026-10-01T12:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contactability routes > ledger > blocks an address across workspaces of one organization but not across organizations. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@navy.mil"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "grace@navy.mil",
    "domain": "navy.mil",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T12:00:00.000Z",
    "updatedAt": "2026-10-01T12:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contactability routes > ledger > blocks an address across workspaces of one organization but not across organizations. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "grace@navy.mil"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "grace@navy.mil",
    "domain": "navy.mil",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T12:00:00.000Z",
    "updatedAt": "2026-10-01T12:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contactability routes > ledger > blocks an address across workspaces of one organization but not across organizations. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "company": "Acme"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Acme",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T09:00:00.000Z",
    "updatedAt": "2026-10-01T09:00:00.000Z",
    "archivedAt": null
  }
}

Source test: sourcing workflows over the published actions > creates, lists, gets, updates and deletes a workflow with audited writes. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "bob@acme.io",
  "company": "Acme"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "bob@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Acme",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T09:00:00.000Z",
    "updatedAt": "2026-10-01T09:00:00.000Z",
    "archivedAt": null
  }
}

Source test: sourcing workflows over the published actions > creates, lists, gets, updates and deletes a workflow with audited writes. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "cy@acme.io",
  "company": "Acme"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "cy@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Acme",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T09:00:00.000Z",
    "updatedAt": "2026-10-01T09:00:00.000Z",
    "archivedAt": null
  }
}

Source test: sourcing workflows over the published actions > creates, lists, gets, updates and deletes a workflow with audited writes. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "dee@globex.com",
  "company": "Globex"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "dee@globex.com",
    "domain": "globex.com",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Globex",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T09:00:00.000Z",
    "updatedAt": "2026-10-01T09:00:00.000Z",
    "archivedAt": null
  }
}

Source test: sourcing workflows over the published actions > creates, lists, gets, updates and deletes a workflow with audited writes. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "opt.out@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "opt.out@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T12:00:00.000Z",
    "updatedAt": "2026-10-01T12:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contactability routes > ledger > stops outreach after a global unsubscribe. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "old@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "old@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases only archived contacts past the period in workspaces that set one, and they stay suppressed. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "recent@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "recent@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases only archived contacts past the period in workspaces that set one, and they stay suppressed. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "active@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "active@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases only archived contacts past the period in workspaces that set one, and they stay suppressed. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "else@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "else@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases only archived contacts past the period in workspaces that set one, and they stay suppressed. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ok@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ok@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: enrollment routes > enrolls a list and reports every contact it skipped and why. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "blocked@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "blocked@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: enrollment routes > enrolls a list and reports every contact it skipped and why. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "gone@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "gone@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: enrollment routes > enrolls a list and reports every contact it skipped and why. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "alan@turing.org"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "alan@turing.org",
    "domain": "turing.org",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T12:00:00.000Z",
    "updatedAt": "2026-10-01T12:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contactability routes > eligibility > checks recipients: eligible, blocked, undeliverable and without a contact point. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "old@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_5",
    "email": "old@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases only archived contacts past the period in workspaces that set one, and they stay suppressed. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p0@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "p0@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p1@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "p1@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p2@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "p2@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p3@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "p3@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p4@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_5",
    "email": "p4@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p5@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_6",
    "email": "p5@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p6@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_7",
    "email": "p6@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p7@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_8",
    "email": "p7@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p8@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_9",
    "email": "p8@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p9@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_10",
    "email": "p9@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p10@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_11",
    "email": "p10@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p11@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_12",
    "email": "p11@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p12@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_13",
    "email": "p12@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p13@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_14",
    "email": "p13@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p14@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_15",
    "email": "p14@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p15@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_16",
    "email": "p15@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p16@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_17",
    "email": "p16@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p17@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_18",
    "email": "p17@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p18@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_19",
    "email": "p18@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p19@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_20",
    "email": "p19@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p20@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_21",
    "email": "p20@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p21@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_22",
    "email": "p21@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p22@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_23",
    "email": "p22@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p23@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_24",
    "email": "p23@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p24@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_25",
    "email": "p24@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p25@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_26",
    "email": "p25@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: archived contact retention > erases at most one batch per workspace per run. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada",
  "lastName": "Lovelace",
  "company": "Analytical"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "company": "Analytical",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-06T08:30:00.000Z",
    "updatedAt": "2026-10-06T08:30:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.erase > keeps the same email suppressed for every purpose when it is added again as a new contact. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "ada@acme.io",
  "firstName": "Ada",
  "company": "Acme",
  "title": "CTO",
  "country": "UK",
  "custom": {
    "industry": "Fintech"
  }
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "ada@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": "Ada",
    "lastName": null,
    "company": "Acme",
    "title": "CTO",
    "website": null,
    "country": "UK",
    "timezone": null,
    "source": "manual",
    "custom": {
      "industry": "Fintech"
    },
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > scores the given contacts as the person, stores the latest result and audits counts and the brief hash only. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "good@acme.io",
  "company": "Good"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "good@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Good",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > isolates per-contact failures: unusable replies and upstream errors fail only that contact; unknown and archived ones are skipped. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "junk@acme.io",
  "company": "Junk"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "junk@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Junk",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > isolates per-contact failures: unusable replies and upstream errors fail only that contact; unknown and archived ones are skipped. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "flaky@acme.io",
  "company": "Flaky"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "flaky@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": "Flaky",
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > isolates per-contact failures: unusable replies and upstream errors fail only that contact; unknown and archived ones are skipped. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "gone@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "gone@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > isolates per-contact failures: unusable replies and upstream errors fail only that contact; unknown and archived ones are skipped. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p0@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "p0@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p1@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "p1@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p2@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "p2@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p3@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "p3@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p4@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_5",
    "email": "p4@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p5@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_6",
    "email": "p5@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p6@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_7",
    "email": "p6@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p7@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_8",
    "email": "p7@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p8@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_9",
    "email": "p8@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "p9@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_10",
    "email": "p9@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > qualifies a list's first unqualified or stale active members, bounded to 25. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "a@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_1",
    "email": "a@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > stops the run when Nexus refuses the person or the organization, auditing nothing. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "b@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_2",
    "email": "b@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > stops the run when Nexus refuses the person or the organization, auditing nothing. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "c@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_3",
    "email": "c@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > stops the run when Nexus refuses the person or the organization, auditing nothing. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 201

Action input

{
  "email": "d@acme.io"
}

Actual local response

{
  "contact": {
    "id": "contact_4",
    "email": "d@acme.io",
    "domain": "acme.io",
    "addressType": "person",
    "verificationStatus": "unknown",
    "firstName": null,
    "lastName": null,
    "company": null,
    "title": null,
    "website": null,
    "country": null,
    "timezone": null,
    "source": "manual",
    "custom": {},
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: contacts.qualify > stops the run when Nexus refuses the person or the organization, auditing nothing. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Effects and response meaning

  • Normalizes the email, classifies person/role/generic, and atomically stores a manual-source contact and primary email point. Returns contact with HTTP 201. This does not verify the address, enroll the contact or send outreach.
  • An address held by an active or archived contact in this workspace returns duplicate_contact with details.contactId. No idempotency key is accepted; email uniqueness prevents a second record for the same normalized address.

Verify the result

  • Read contacts.get with returned contact.id in the same workspace and compare normalized email, intended profile and custom values. Inspect archivedAt when resolving a duplicate.

Recover

After an uncertain response, call contacts.resolve for the exact intended email and then contacts.get. Compare the retained record before retrying; a duplicate refusal is not proof the original payload matches. Do not replace the email to bypass uniqueness. If an unwanted contact was created, archiving is a separate approved mutation and retains its address reservation.

Refused responses

Captured contacts.create · HTTP 503

Refused input; do not execute

{}

Actual local response

{
  "error": {
    "code": "address_hashing_unconfigured",
    "message": "Contact storage is unavailable: the address hashing secret is not configured."
  }
}

Source test: audience routes > fails closed with 503 when the address hashing secret is missing. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 409

Action input

{
  "email": "ADA@acme.io"
}

Actual local response

{
  "error": {
    "code": "duplicate_contact",
    "message": "A contact with this email already exists in this workspace.",
    "details": {
      "contactId": "contact_1"
    }
  }
}

Source test: audience routes > contacts > returns 409 with the existing id for a duplicate address, archived or not. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 422

Action input

{
  "email": "no-at-sign"
}

Actual local response

{
  "error": {
    "code": "invalid_email",
    "message": "The email address is not valid.",
    "details": {
      "reason": "missing_at"
    }
  }
}

Source test: audience routes > contacts > returns 422 for an invalid email and for input the contract refuses. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 422

Refused input; do not execute

{
  "firstName": "x"
}

Actual local response

{
  "error": {
    "code": "invalid_action_input",
    "message": "Input for contacts.create is invalid.",
    "details": [
      {
        "expected": "string",
        "code": "invalid_type",
        "path": [
          "email"
        ],
        "message": "Invalid input: expected string, received undefined"
      }
    ]
  }
}

Source test: audience routes > contacts > returns 422 for an invalid email and for input the contract refuses. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 403

Refused input; do not execute

{}

Actual local response

{
  "error": {
    "code": "permission_denied",
    "message": "The credential lacks workspace:write.",
    "details": {
      "requiredPermission": "workspace:write"
    }
  }
}

Source test: audience routes > permissions > allows reads with workspace:read and refuses writes without workspace:write. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 409

Action input

{
  "email": "ada@acme.io"
}

Actual local response

{
  "error": {
    "code": "duplicate_contact",
    "message": "A contact with this email already exists in this workspace.",
    "details": {
      "contactId": "contact_1"
    }
  }
}

Source test: audience routes > contacts > returns 409 with the existing id for a duplicate address, archived or not. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 422

Refused input; do not execute

{
  "email": "a@b.co",
  "workspaceId": "ws_2"
}

Actual local response

{
  "error": {
    "code": "invalid_action_input",
    "message": "Input for contacts.create is invalid.",
    "details": [
      {
        "code": "unrecognized_keys",
        "keys": [
          "workspaceId"
        ],
        "path": [],
        "message": "Unrecognized key: \"workspaceId\""
      }
    ]
  }
}

Source test: audience routes > contacts > returns 422 for an invalid email and for input the contract refuses. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured contacts.create · HTTP 422

Refused input; do not execute

{}

Actual local response

{
  "error": {
    "code": "invalid_action_input",
    "message": "Input for contacts.create is invalid.",
    "details": []
  }
}

Source test: audience routes > contacts > returns 422 for an invalid email and for input the contract refuses. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Error recovery

  • HTTP 403 permission_denied: Stop and inspect the permission required by this action in the current credential. Do not broaden permissions or switch organization automatically.
  • HTTP 422 invalid_action_input: Correct the request against the current input schema and validate it again before planning.
  • HTTP 503 address_hashing_unconfigured: Stop and report the missing address-hashing configuration to the application operator. This read cannot provision it; do not switch context or modify credentials to bypass the refusal.
  • HTTP 409 duplicate_contact: Use the returned details.contactId or contacts.resolve for the normalized email in the same workspace, then contacts.get. Compare the existing record before deciding whether any separate edit is needed; never treat a duplicate as a new creation.
  • HTTP 422 invalid_email: Correct the address according to the email normalization refusal, then validate again. Do not guess a replacement address or silently change the intended recipient.

Evidence and limits

  • contracts/audience.mjs

  • contracts/audience-filter.mjs

  • apps/api/src/audience/audience-routes.ts

  • apps/api/src/audience/contacts-handlers.ts

  • apps/api/src/audience/contact-search.ts

  • apps/api/src/audience/contacts-repository.ts

  • apps/api/src/audience/lists-handlers.ts

  • apps/api/src/audience/lists-repository.ts

  • apps/api/src/audience/filter-source.ts

  • apps/api/test/audience-routes.test.ts

  • apps/api/test/segments-routes.test.ts

  • Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

  • Widget/bootstrap use actual app handler but mocked worker runtime and app identity.

  • No gateway execution, live permissions, external delivery or deployed proof.

The examples are local route captures with synthetic context and simulated providers. They do not prove live authorization, CLI/MCP gateway execution, production state or delivery.