One contact
const url = 'https://api.threadkite.app/v1/contacts/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.threadkite.app/v1/contacts/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”object
As given
E.164
Their picture, uploaded by your team; null when none
The companies they work for now, their primary company first (see /v1/contacts/{id}/companies for past ones)
object
object
The company’s picture (uploaded, or its website’s icon); null when none
As the register gives it (active, dissolved, liquidation…); null when not known
What they do for the company, in your words: Director, Accounts…
Their main company (at most one); shown first and with their name
How the link was made: manual (your team), domain (their email address is at one of the company’s domains), form, lead, import, api, integration or assistant
When they left the company; kept for history, not current
Email bounced or is not valid
The number failed or is not valid
Set when this contact was merged into another
When the contact and their data were deleted (an erasure): what’s left is only kept so counts and reports add up
object
The other system, e.g. my-dms
The contact’s id there
The installed partner app this id belongs to (its integration is the app slug)
The contact in that app (from the app’s contact address), for Open in …
object
Where the latest decision came from, in short: form, api, staff, stop_reply, unsubscribe, import, complaint, assistant, connection, merge or system. The full story (who, how, the wording shown) is in the consent history.
A contact form asked to opt them back in after they opted out. Not applied: anyone can type an address into a form.
Channels on which this person asked not to receive marketing: their email address or number is on the marketing suppression list (someone with it opted out and their data was deleted). Marketing opt-ins there are kept as pending and marketing sends are refused; replies and service messages are unaffected
The contact’s most recent live thread you can see, if any (a contact has one thread per inbox)
The contact’s live threads you can see, one per inbox, most recent first
Example
{ "name": "Sarah Turner", "email": "sarah.turner@example.co.uk", "phone": "07911 123456", "phoneE164": "+447911123456", "avatarUrl": "https://api.threadkite.com/avatars/9b0d….jpg", "companies": [ { "company": { "name": "Acme Fleet Services Ltd", "avatarUrl": "https://api.threadkite.com/avatars/6c1f….png", "status": "active" }, "role": "Fleet manager", "jobTitle": "Head of Transport", "source": "manual" } ], "externalIds": [ { "integration": "my-dms", "externalId": "CUST-10442", "appName": "Northern DMS", "url": "https://dms.example/customers/CUST-10442" } ], "consents": [ { "channel": "email", "status": "opted_in", "source": "stop_reply" } ], "attributes": { "finance_end_date": "2027-01-03", "budget": 15000 }, "marketingSuppressed": [ "email" ]}Missing or invalid API key
object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}The organisation is on the Free plan (code upgrade_required)
object
Stable machine-readable reason
The feature that needs Pro
Where to upgrade or pay, in the web app
Example
{ "statusCode": 402, "code": "upgrade_required", "message": "Connections are part of Pro. Upgrade to connect texts, calls and more.", "feature": "extraSeats", "upgradePath": "/settings/billing"}The key does not have the scope (or the person the permission)
object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}object
Stable machine-readable reason
With code invalid: every problem with the request, by field (message is the first)
object
Dotted path inside the item, e.g. attributes.price.amountMinor
Example
{ "statusCode": 403, "code": "forbidden", "message": "You do not have permission to do that.", "errors": [ { "message": "Enter the make" } ]}Rate limit reached
object
Stable machine-readable reason
Seconds until another request will be accepted
Example
{ "statusCode": 429, "code": "rate_limited", "message": "Too many requests. Each key can make 120 requests a minute; try again in 12 seconds.", "retryAfter": 12}