List companies
GET/api/v1/companies
Companies in the workspace, most recently updated first, with contact and deal counts. Filter by domain, free text, tag or owner.
Query parameters
| Parameter | Type | Description |
|---|---|---|
domain | string | Exact domain match, such as acme.com. Returns at most one company. |
q | string | Matches the name or domain. |
tag | string | Only companies carrying this tag. |
ownerId | string | Only companies owned by this user. |
limit | number | Page size, 1 to 100. Default 50. |
cursor | string | The nextCursor from the previous page. |
Example request
curl "https://crowdstack.org/api/v1/companies?q=acme" \
-H "Authorization: Bearer $CROWDSTACK_API_KEY"Example response
{
"companies": [
{
"id": "cmf3k2x9a0002abcd",
"name": "Acme",
"domain": "acme.com",
"linkedinUrl": "https://linkedin.com/company/acme",
"tags": [
"enterprise"
],
"fields": {
"industry": "SaaS"
},
"owner": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"counts": {
"contacts": 4,
"deals": 1,
"notes": 2
},
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z"
}
],
"nextCursor": null
}Get a company
GET/api/v1/companies/:id
One company by id, including up to 50 of its contacts and its open deals.
Responses
| Status | Meaning |
|---|---|
| 404 | No company with that id. |
Example request
curl "https://crowdstack.org/api/v1/companies/cmf3k2x9a0001abcd" \
-H "Authorization: Bearer $CROWDSTACK_API_KEY"Example response
{
"company": {
"id": "cmf3k2x9a0002abcd",
"name": "Acme",
"domain": "acme.com",
"linkedinUrl": "https://linkedin.com/company/acme",
"tags": [
"enterprise"
],
"fields": {
"industry": "SaaS"
},
"owner": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"counts": {
"contacts": 4,
"deals": 1,
"notes": 2
},
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z",
"contacts": [
{
"id": "cmf3k2x9a0001abcd",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@acme.com",
"jobTitle": "Head of Growth"
}
],
"deals": [
{
"id": "cmf3k2x9a0080abcd",
"name": "Acme renewal",
"amount": "12000.00",
"currency": "GBP",
"stage": {
"id": "cmf3k2x9a0061abcd",
"name": "Proposal"
}
}
]
}
}Create or update a company
POST/api/v1/companies
Creates a company, or updates the existing one that matches. Matching tries the domain first (from domain or website), then a case-insensitive name match. Keys you leave out are left alone on an update; tags are added to the existing set.
Request body
| Field | Type | Description |
|---|---|---|
namerequired | string | The company name. Used for matching when no domain is given. |
domain | string | null | Bare domain such as acme.com. A full URL is reduced to its host. |
website | string | null | Alternative to domain; the host is extracted. |
linkedinUrl | string | null | Normalised to a linkedin.com company URL. |
tags | string[] | — |
fields | object | Custom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields. |
ownerId | string | null | The member who owns this company. |
Responses
| Status | Meaning |
|---|---|
| 201 | Created. Body: { company, created: true }. |
| 200 | Matched and updated. Body: { company, created: false }. |
Example request
curl -X POST https://crowdstack.org/api/v1/companies \
-H "Authorization: Bearer $CROWDSTACK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Acme",
"website": "https://acme.com",
"tags": [
"enterprise"
]
}'Example response
{
"created": true,
"company": {
"id": "cmf3k2x9a0002abcd",
"name": "Acme",
"domain": "acme.com",
"linkedinUrl": "https://linkedin.com/company/acme",
"tags": [
"enterprise"
],
"fields": {
"industry": "SaaS"
},
"owner": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"counts": {
"contacts": 4,
"deals": 1,
"notes": 2
},
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z"
}
}Update a company
PATCH/api/v1/companies/:id
Change a company's fields by id. Only keys you send are changed; null clears a value. tags replaces the set.
Request body
| Field | Type | Description |
|---|---|---|
name | string | — |
domain | string | null | — |
linkedinUrl | string | null | Normalised to a linkedin.com company URL. |
tags | string[] | — |
fields | object | Custom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields. |
ownerId | string | null | The member who owns this company. |
Responses
| Status | Meaning |
|---|---|
| 200 | Body: { company }. |
| 404 | No company with that id. |
Example request
curl -X PATCH https://crowdstack.org/api/v1/companies/cmf3k2x9a0001abcd \
-H "Authorization: Bearer $CROWDSTACK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tags": [
"enterprise",
"renewal"
]
}'Example response
{
"company": {
"id": "cmf3k2x9a0002abcd",
"name": "Acme",
"domain": "acme.com",
"linkedinUrl": "https://linkedin.com/company/acme",
"tags": [
"enterprise",
"renewal"
],
"fields": {
"industry": "SaaS"
},
"owner": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"counts": {
"contacts": 4,
"deals": 1,
"notes": 2
},
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z"
}
}Delete a company
DELETE/api/v1/companies/:id
Permanently deletes a company and its notes. Contacts and deals at the company are kept and unlinked.
Responses
| Status | Meaning |
|---|---|
| 200 | Body: { deleted: true }. |
| 404 | No company with that id. |
Example request
curl -X DELETE https://crowdstack.org/api/v1/companies/cmf3k2x9a0001abcd \
-H "Authorization: Bearer $CROWDSTACK_API_KEY"Example response
{
"deleted": true
}