All docs

Companies

List, update, and delete companies and their contacts in your workspace

Manage companies in your graph8 workspace — your first-party CRM data.

Companies arrive in your workspace automatically when contacts are saved, enriched, or imported — you don’t need to create them manually. Each contact is linked to a company, and company records are created or updated as contacts flow in. These endpoints give you full read/write access at no credit cost.


List Companies

GET /companies

Returns a paginated list of companies.

Query Parameters

ParameterTypeDefaultDescription
pageinteger1Page number (1-indexed)
limitinteger50Items per page (1-200)
domainstringFilter by domain (exact match)
industrystringFilter by industry (partial match, case-insensitive)
namestringFilter by company name (partial match, case-insensitive)
employee_count_minintegerMinimum employee count
employee_count_maxintegerMaximum employee count
countrystringFilter by country (exact match)
statestringFilter by state (exact match)
citystringFilter by city (partial match, case-insensitive)
descriptionstringFilter by company description (partial match, case-insensitive)
revenue_minintegerMinimum annual revenue
revenue_maxintegerMaximum annual revenue
founded_year_minintegerMinimum founding year
founded_year_maxintegerMaximum founding year
linkedin_followers_minintegerMinimum LinkedIn followers
linkedin_followers_maxintegerMaximum LinkedIn followers
include_custom_fieldsbooleanfalseWhen true, each company gains a custom_fields object of its custom column values keyed by column slug (name from GET /fields/companies). Default false keeps the legacy shape and adds no extra query.

All filters are optional and can be combined. When multiple filters are provided, results must match all of them (AND logic).

Example

cURL

# Filter by industry
curl "https://be.graph8.com/api/v1/companies?industry=Technology&limit=10" \
  -H "Authorization: Bearer $API_KEY"

# Search by company name with employee count range
curl "https://be.graph8.com/api/v1/companies?name=acme&employee_count_min=100&employee_count_max=1000" \
  -H "Authorization: Bearer $API_KEY"

# Search by company description (useful for ICP identification)
curl "https://be.graph8.com/api/v1/companies?description=enterprise%20software" \
  -H "Authorization: Bearer $API_KEY"

# Filter by revenue range and founding year
curl "https://be.graph8.com/api/v1/companies?revenue_min=1000000&revenue_max=50000000&founded_year_min=2015" \
  -H "Authorization: Bearer $API_KEY"

# Filter by LinkedIn followers (social presence)
curl "https://be.graph8.com/api/v1/companies?linkedin_followers_min=1000&industry=SaaS" \
  -H "Authorization: Bearer $API_KEY"

Python

# Filter by industry
response = requests.get(
    f"{BASE_URL}/companies",
    headers=HEADERS,
    params={"industry": "Technology", "limit": 10}
)
companies = response.json()

# Search by name with employee count range
response = requests.get(
    f"{BASE_URL}/companies",
    headers=HEADERS,
    params={"name": "acme", "employee_count_min": 100, "employee_count_max": 1000}
)

# Filter by revenue range and founding year
response = requests.get(
    f"{BASE_URL}/companies",
    headers=HEADERS,
    params={"revenue_min": 1000000, "revenue_max": 50000000, "founded_year_min": 2015}
)

TypeScript

// Filter by industry
const response = await fetch(
  `${BASE_URL}/companies?industry=Technology&limit=10`,
  { headers: { Authorization: `Bearer ${API_KEY}` } }
);
const companies = await response.json();

// Search by name with employee count range
const filtered = await fetch(
  `${BASE_URL}/companies?name=acme&employee_count_min=100&employee_count_max=1000`,
  { headers: { Authorization: `Bearer ${API_KEY}` } }
);

// Filter by revenue range and founding year
const revenueFiltered = await fetch(
  `${BASE_URL}/companies?revenue_min=1000000&revenue_max=50000000&founded_year_min=2015`,
  { headers: { Authorization: `Bearer ${API_KEY}` } }
);

Response

{
  "data": [
    {
      "id": 42,
      "name": "Acme Inc",
      "description": "Enterprise software company specializing in cloud solutions",
      "domain": "acme.com",
      "website": "https://acme.com",
      "industry": "Technology",
      "employee_count": "500",
      "revenue": "25000000",
      "founded_year": 2015,
      "city": "San Francisco",
      "state": "CA",
      "country": "US",
      "linkedin_url": "https://linkedin.com/company/acme",
      "linkedin_followers": "12500",
      "logo_url": "https://logo.clearbit.com/acme.com",
      "owner_id": "user_x",
      "owner_name": "John",
      "custom_fields": null
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 1,
    "has_next": false
  }
}

Get Company

GET /companies/{company_id}

Returns detailed information about a single company.

Path Parameters

ParameterTypeDescription
company_idintegerCompany ID

Query Parameters

ParameterTypeDefaultDescription
include_custom_fieldsbooleanfalseWhen true, adds a custom_fields object of custom column values keyed by column slug (same shape as the list endpoint).

Example

cURL

curl "https://be.graph8.com/api/v1/companies/42" \
  -H "Authorization: Bearer $API_KEY"

Python

response = requests.get(f"{BASE_URL}/companies/42", headers=HEADERS)
company = response.json()["data"]

TypeScript

const response = await fetch(`${BASE_URL}/companies/42`, {
  headers: { Authorization: `Bearer ${API_KEY}` }
});
const { data: company } = await response.json();

Response

{
  "data": {
    "id": 42,
    "name": "Acme Inc",
    "description": "Enterprise software company",
    "domain": "acme.com",
    "website": "https://acme.com",
    "logo_url": "https://logo.clearbit.com/acme.com",
    "phone": "+1-555-0200",
    "address": "123 Market St",
    "city": "San Francisco",
    "state": "CA",
    "country": "US",
    "zip": "94105",
    "founded_year": 2015,
    "employee_count": "500",
    "revenue": "25000000",
    "industry": "Technology",
    "industry_group": "Software",
    "linkedin_url": "https://linkedin.com/company/acme",
    "linkedin_followers": "12500",
    "facebook_url": null,
    "twitter_url": "https://twitter.com/acme",
    "crunchbase_url": null,
    "meta_data": null,
    "contact_count": 15,
    "custom_fields": null,
    "created_at": "2026-01-10T08:00:00Z",
    "updated_at": "2026-02-20T16:45:00Z"
  }
}

Errors

StatusMeaning
404Company not found

Get Company Contacts

GET /companies/{company_id}/contacts

Returns contacts associated with a company.

Path Parameters

ParameterTypeDescription
company_idintegerCompany ID

Query Parameters

ParameterTypeDefaultDescription
limitinteger100Items per page (1-200)
offsetinteger0Offset for pagination

Example

cURL

curl "https://be.graph8.com/api/v1/companies/42/contacts?limit=50" \
  -H "Authorization: Bearer $API_KEY"

Python

response = requests.get(
    f"{BASE_URL}/companies/42/contacts",
    headers=HEADERS,
    params={"limit": 50}
)
contacts = response.json()["data"]

TypeScript

const response = await fetch(`${BASE_URL}/companies/42/contacts?limit=50`, {
  headers: { Authorization: `Bearer ${API_KEY}` }
});
const { data: contacts } = await response.json();

Response

{
  "data": [
    {
      "id": 1,
      "first_name": "Jane",
      "last_name": "Smith",
      "full_name": "Jane Smith",
      "work_email": "[email protected]",
      "job_title": "VP of Engineering",
      "seniority_level": "VP",
      "direct_phone": "+1-555-0100",
      "linkedin_url": "https://linkedin.com/in/janesmith",
      "city": "San Francisco",
      "state": "CA",
      "country": "US"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 15,
    "has_next": false
  }
}

Update Company

PATCH /companies/{company_id}

Update one or more fields on a company. Only include the fields you want to change.

Path Parameters

ParameterTypeDescription
company_idintegerCompany ID

Request Body

All fields are optional. Include only the fields to update.

FieldTypeDescription
namestringCompany name
domainstringPrimary domain
websitestringWebsite URL
phonestringPhone number
addressstringStreet address
citystringCity
statestringState or province
countrystringCountry
zipstringZIP or postal code
industrystringIndustry
employee_countintegerNumber of employees
linkedin_urlstringLinkedIn company page URL

Example

cURL

curl -X PATCH "https://be.graph8.com/api/v1/companies/42" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"industry": "Enterprise Software", "employee_count": 550}'

Python

response = requests.patch(
    f"{BASE_URL}/companies/42",
    headers=HEADERS,
    json={"industry": "Enterprise Software", "employee_count": 550}
)

TypeScript

const response = await fetch(`${BASE_URL}/companies/42`, {
  method: "PATCH",
  headers: {
    Authorization: `Bearer ${API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ industry: "Enterprise Software", employee_count: 550 })
});

Response

{
  "data": {
    "updated": 1
  }
}

Errors

StatusMeaning
400No fields provided to update
404Company not found

Upsert Company

PUT /companies/assert

Create or update a company by domain, then by LinkedIn URL. If a company with the given domain (or linkedin_url) already exists it is updated; otherwise a new record is created and added to the specified list.

Request Body

FieldTypeRequiredDescription
list_idintegerYesTarget list to add the company to
domainstringNo*Company domain (e.g. acme.com). At least one of domain or linkedin_url is required.
linkedin_urlstringNo*LinkedIn company page URL. At least one of domain or linkedin_url is required.
namestringNoCompany name
industrystringNoIndustry
employee_countintegerNoNumber of employees
annual_revenuestringNoAnnual revenue
citystringNoCity
statestringNoState or province
countrystringNoCountry
websitestringNoWebsite URL
descriptionstringNoCompany description

Example

cURL

curl -X PUT "https://be.graph8.com/api/v1/companies/assert" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "list_id": 12345,
    "domain": "acme.com",
    "name": "Acme Inc",
    "industry": "Technology",
    "employee_count": 100,
    "annual_revenue": "5000000",
    "city": "San Francisco",
    "state": "CA",
    "country": "US",
    "website": "https://acme.com",
    "description": "Enterprise software provider"
  }'

Python

response = requests.put(
    f"{BASE_URL}/companies/assert",
    headers=HEADERS,
    json={
        "list_id": 12345,
        "domain": "acme.com",
        "name": "Acme Inc",
        "industry": "Technology",
        "employee_count": 100
    }
)
result = response.json()["data"]

TypeScript

const response = await fetch(`${BASE_URL}/companies/assert`, {
  method: "PUT",
  headers: {
    Authorization: `Bearer ${API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    list_id: 12345,
    domain: "acme.com",
    name: "Acme Inc",
    industry: "Technology",
    employee_count: 100
  })
});
const { data: result } = await response.json();

Response

{
  "data": {
    "action": "created",
    "count": 1
  }
}

The action field is either "created" or "updated" depending on whether a matching company already existed.


List Company Columns

GET /companies/columns

Returns the list of columns (fields) defined for companies in a given list. Equivalent to the contacts columns endpoint but scoped to companies.

Query Parameters

ParameterTypeDefaultDescription
list_idintegerFilter columns by list

Example

cURL

curl "https://be.graph8.com/api/v1/companies/columns?list_id=12345" \
  -H "Authorization: Bearer $API_KEY"

Python

response = requests.get(
    f"{BASE_URL}/companies/columns",
    headers=HEADERS,
    params={"list_id": 12345}
)
columns = response.json()

TypeScript

const response = await fetch(`${BASE_URL}/companies/columns?list_id=12345`, {
  headers: { Authorization: `Bearer ${API_KEY}` }
});
const columns = await response.json();

Response

[
  {
    "id": 1,
    "title": "Verified Domain",
    "name": "verified_domain",
    "data_type": "string",
    "is_global": false
  }
]

Create Company Column

POST /companies/columns/create → 201

Create a custom column for companies. Accepts the same body as POST /contacts/columns/create, including the optional enrichment block (strongly recommended for enrichable columns). Column slug (name) values are company-scoped (e.g. verified_domain). Pass enrichment.field_to_enrich (e.g. "company.domain") when you want the waterfall to write to a field other than the column itself.

Request Body

FieldTypeRequiredDescription
list_idintegerYesList to attach the column to
titlestringYesDisplay title for the column
namestringYesColumn slug (must be unique within the org, company-scoped)
data_typestringYesData type (e.g. string, number, boolean, date)
enrichmentobjectNoOptional enrichment config. Include field_to_enrich (e.g. "company.domain") to route waterfall writes to a specific field. Strongly recommended for enrichable columns.

Example

cURL

curl -X POST "https://be.graph8.com/api/v1/companies/columns/create" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "list_id": 12345,
    "title": "Verified Domain",
    "name": "verified_domain",
    "data_type": "string",
    "enrichment": {
      "field_to_enrich": "company.domain"
    }
  }'

Python

response = requests.post(
    f"{BASE_URL}/companies/columns/create",
    headers=HEADERS,
    json={
        "list_id": 12345,
        "title": "Verified Domain",
        "name": "verified_domain",
        "data_type": "string",
        "enrichment": {"field_to_enrich": "company.domain"}
    }
)
column = response.json()

TypeScript

const response = await fetch(`${BASE_URL}/companies/columns/create`, {
  method: "POST",
  headers: {
    Authorization: `Bearer ${API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    list_id: 12345,
    title: "Verified Domain",
    name: "verified_domain",
    data_type: "string",
    enrichment: { field_to_enrich: "company.domain" }
  })
});
const column = await response.json();

Delete Company

DELETE /companies/{company_id}

Soft-delete a company. The company is marked as deleted but not permanently removed.

Path Parameters

ParameterTypeDescription
company_idintegerCompany ID

Example

cURL

curl -X DELETE "https://be.graph8.com/api/v1/companies/42" \
  -H "Authorization: Bearer $API_KEY"

Python

response = requests.delete(f"{BASE_URL}/companies/42", headers=HEADERS)

TypeScript

const response = await fetch(`${BASE_URL}/companies/42`, {
  method: "DELETE",
  headers: { Authorization: `Bearer ${API_KEY}` }
});

Response

{
  "data": {
    "deleted": true
  }
}

Errors

StatusMeaning
404Company not found
Build with graph8