Contacts
Contacts are recipients. They live inside a ContactImport and can be enrolled in one or more campaigns (subject to the Outreach dedup rules).
Show a contact
Section titled “Show a contact”GET /contacts/:idAuthorization: Bearer <key>{ "id": "...", "email": "ada@example.com", "first_name": "Ada", "last_name": "Lovelace", "company": "Widgets Inc", "unsubscribed_at": null, "created_at": "...", "enrollments": [ { "id": "...", "campaign_id": "...", "status": "sent", "batch_number": 1, "sent_at": "..." } ]}Update a contact
Section titled “Update a contact”PATCH /contacts/:idAuthorization: Bearer <key>Content-Type: application/json
{ "contact": { "first_name": "Augusta", "company": "Acme" } }Updatable: email, first_name, last_name, company. unsubscribed_at is set only via the unsubscribe link or webhook flow.
Delete a contact
Section titled “Delete a contact”DELETE /contacts/:idCascades to all the contact’s enrollments (across every campaign).
List contacts in an import
Section titled “List contacts in an import”GET /contact_imports/:contact_import_id/contacts(Documented under Contact imports.)
Unsubscribes
Section titled “Unsubscribes”Contacts unsubscribe one of two ways:
- One-click unsubscribe — every email includes a
List-Unsubscribeheader (RFC 8058) and a footer link signed with a per-contact token. Click → contact is marked unsubscribed; future sends to that contact (including already-scheduled step 2/3) skip the SMTP transaction. - SMTP2GO inbound webhook — when a recipient marks an email as spam or unsubscribes via the provider, the inbound webhook sets
unsubscribed_at.
Both paths emit an enrollment.unsubscribed outbound webhook (one per active enrollment for that contact).
Errors
Section titled “Errors”| Status | Code | When |
|---|---|---|
| 404 | contact_not_found | Unknown id or another account’s. |
| 404 | contact_import_not_found | Listing under an unknown import. |
| 422 | validation_failed | Invalid email, duplicate email, etc. |