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

ParameterTypeDescription
domainstringExact domain match, such as acme.com. Returns at most one company.
qstringMatches the name or domain.
tagstringOnly companies carrying this tag.
ownerIdstringOnly companies owned by this user.
limitnumberPage size, 1 to 100. Default 50.
cursorstringThe 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

StatusMeaning
404No 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

FieldTypeDescription
namerequiredstringThe company name. Used for matching when no domain is given.
domainstring | nullBare domain such as acme.com. A full URL is reduced to its host.
websitestring | nullAlternative to domain; the host is extracted.
linkedinUrlstring | nullNormalised to a linkedin.com company URL.
tagsstring[]
fieldsobjectCustom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields.
ownerIdstring | nullThe member who owns this company.

Responses

StatusMeaning
201Created. Body: { company, created: true }.
200Matched 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

FieldTypeDescription
namestring
domainstring | null
linkedinUrlstring | nullNormalised to a linkedin.com company URL.
tagsstring[]
fieldsobjectCustom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields.
ownerIdstring | nullThe member who owns this company.

Responses

StatusMeaning
200Body: { company }.
404No 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

StatusMeaning
200Body: { deleted: true }.
404No 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
}