Skip to content

Link a contact to a company

POST
/v1/contacts/{id}/companies
curl --request POST \
--url https://api.threadkite.app/v1/contacts/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/companies \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "companyId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "companyName": "Acme Fleet Services", "role": "Fleet manager", "jobTitle": "Head of Transport", "isPrimary": true }'

A company by id, or by name (the one with that name, or a new one). Primary when they have no primary company, unless isPrimary says otherwise. Linking a company they left makes it current again. Sends contact.updated with a companies change.

id
required
string format: uuid
Media typeapplication/json
object
companyId

The company. Give this or companyName.

string format: uuid
companyName

A company by name: the one with that name (ignoring case, punctuation and Ltd), or a new one. Give this or companyId.

string
>= 1 characters <= 200 characters

Example

Acme Fleet Services
role
string
nullable <= 80 characters

Example

Fleet manager
jobTitle
string
nullable <= 120 characters

Example

Head of Transport
isPrimary

Make it their primary company. Left out: primary when they have no primary company

boolean
Media typeapplication/json
object
company
required
object
id
required
string format: uuid
name
required
string
avatarUrl
required

The company’s picture (uploaded, or its website’s icon); null when none

string
nullable
status
required

As the register gives it (active, dissolved, liquidation…); null when not known

string
nullable
role
required

What they do for the company, in your words: Director, Accounts…

string
nullable
jobTitle
required
string
nullable
isPrimary
required

Their main company (at most one); shown first and with their name

boolean
source
required

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

string
Allowed values: manual domain form lead import api integration assistant
endedAt
required

When they left the company; kept for history, not current

string format: date-time
nullable
createdAt
required
string format: date-time

Example

{
"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"
}
Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Missing or invalid API key

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

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)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
feature
required

The feature that needs Pro

string
nullable
Allowed values: extraSeats connections aiAssistant aiReplies rules fullReports api inboxes bulkMessages videoMessages
upgradePath
required

Where to upgrade or pay, in the web app

string

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)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}
Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Rate limit reached

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
retryAfter
required

Seconds until another request will be accepted

number

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
}