Qualified Companies API
Create and update accounts by domain. Companies cannot be read back.
Create and update accounts by domain. Companies cannot be read back.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/qualified-com-companies-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Qualified Enterprise Companies API
version: '2.0'
description: '# Overview
_Last updated: August 9, 2026_
The Qualified Enterprise API connects your Qualified data to your warehouse, CDP, and downstream systems.'
servers:
- url: https://api.qualified.com
description: Production
security:
- bearerToken: []
tags:
- name: Companies
description: Create and update accounts by domain. Companies cannot be read back.
paths:
/v2/companies:
post:
summary: Create or update a company
operationId: upsertCompany
description: 'Creates a company or updates the one matched by `domain`. Sets account-level field values on the company; every lead on that domain inherits them when read, and a lead''s own person-level fields are never modified. Only account-category fields are accepted, and only the fields you send are updated. A write that changes a value advances `updatedAt` on every lead on that domain, so those leads resurface on your next `updated_after` pull. Returns the company at the top level, not wrapped in a `data` envelope.
**Scope:** `company:manage`'
tags:
- Companies
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- domain
properties:
domain:
type: string
description: Company domain. Used to match an existing company.
name:
type: string
description: Company name.
fields:
type: object
description: Account-category custom field values keyed by field API name.
responses:
'200':
description: Existing company updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Company'
'201':
description: New company created.
content:
application/json:
schema:
$ref: '#/components/schemas/Company'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'422':
$ref: '#/components/responses/UnprocessableEntity'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
/v2/companies/fields:
get:
summary: List company fields
operationId: listCompanyFields
description: 'Returns the custom field definitions for companies (account category).
**Scope:** none beyond a valid token.'
tags:
- Companies
responses:
'200':
description: Company field definitions.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Field'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
components:
schemas:
Field:
type: object
description: A custom field definition.
properties:
id:
type: string
description: Encoded field identifier.
label:
type: string
description: Human-readable field label.
type:
type: string
description: 'Field data type: `string`, `text`, `decimal`, `boolean`, `email`, `phone`, `name`, `company`, `picklist`, `multi_picklist`, or `text_array`. Numeric fields are `decimal` — there is no `number` type. `multi_picklist` and `text_array` are returned only for teams with multi-select fields enabled.'
name:
type: string
description: Field API name, the key used in the `fields` object.
options:
type: array
description: Picklist options. Present only when `type` is `picklist`.
items:
type: object
properties:
value:
type: string
description: Stored option value.
label:
type: string
description: Option display label.
createdAt:
type: string
format: date-time
description: When the field was created.
updatedAt:
type: string
format: date-time
description: When the field was last updated.
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error message.
ValidationErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error message.
details:
type: object
description: Structured context identifying what was rejected, for example the offending field under `failed_field`. Keys vary by failure.
additionalProperties: true
CodeErrorResponse:
type: object
properties:
code:
type: string
description: Machine-readable error code.
message:
type: string
description: Human-readable error message.
Company:
type: object
description: A company (account) record. Returned only from the upsert response.
properties:
id:
type: string
description: Encoded company identifier.
domain:
type: string
description: Normalized company domain.
name:
type:
- string
- 'null'
description: Company name.
fields:
type: object
description: Account-category custom field values keyed by field API name.
additionalProperties: true
createdAt:
type: string
format: date-time
description: When the company was created.
updatedAt:
type: string
format: date-time
description: When the company was last updated.
responses:
BadRequest:
description: Malformed request, such as an invalid date or cursor.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
InternalServerError:
description: Unexpected server error.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
UnprocessableEntity:
description: The write was rejected, for example an unknown field, an invalid value, or a malformed batch.
content:
application/json:
schema:
$ref: '#/components/schemas/ValidationErrorResponse'
Unauthorized:
description: Missing or invalid token, or the API is not enabled for the team.
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: invalid_token
TooManyRequests:
description: A rate limit was exceeded. The three time-window limits set a `Retry-After` header; the concurrency limit does not, so treat its absence as "retry once an in-flight request finishes".
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: rate_limited
message: Enterprise API rate limit exceeded
Forbidden:
description: The token lacks the required OAuth scope.
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: insufficient_scope
securitySchemes:
bearerToken:
type: http
scheme: bearer
bearerFormat: Token
x-tagGroups:
- name: Write APIs
tags:
- Leads
- Companies
- Bulk
- name: Activity APIs
tags:
- Sessions
- Conversations
- Messages
- Meetings
- Emails
- name: Utility APIs
tags:
- Cancel Meeting
- GDPR
- name: Legacy Reporting API
tags:
- Bot Conversations
- Rep Conversations