Qualified Leads API
Create, update, and read lead (person) records and their custom field values.
Create, update, and read lead (person) records and their custom field values.
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-leads-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 Leads 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: Leads
description: Create, update, and read lead (person) records and their custom field values.
paths:
/v2/leads:
get:
summary: List leads
operationId: listLeads
description: 'Returns known, emailed leads, newest first, with their custom field values. Window with `updated_after`/`updated_before` to catch new and changed leads, or `created_after`/`created_before` for new leads only. Pass `email` to look one person up by address. Anonymous (email-less) people are not returned here; their activity carries a `visitorId`, which joins to a lead through `visitorIds` once they are identified. Leads become available in this list 30 minutes after they are created.
**Scope:** `lead:view`'
tags:
- Leads
parameters:
- $ref: '#/components/parameters/After'
- $ref: '#/components/parameters/Before'
- $ref: '#/components/parameters/CreatedAfter'
- $ref: '#/components/parameters/CreatedBefore'
- $ref: '#/components/parameters/UpdatedAfter'
- $ref: '#/components/parameters/UpdatedBefore'
- $ref: '#/components/parameters/Email'
responses:
'200':
description: A page of leads.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Lead'
pageInfo:
$ref: '#/components/schemas/PageInfo'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
post:
summary: Create or update a lead
operationId: upsertLead
description: 'Creates a lead or updates the existing one matched by `email`. Only the field values you send are written; others are left untouched. Returns the lead.
Note: the upsert response returns the lead object at the top level, not wrapped in a `data` envelope.
**Scope:** `lead:manage`'
tags:
- Leads
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- email
properties:
email:
type: string
description: Lead email address. Used to match an existing lead.
fields:
type: object
description: Custom field values keyed by field API name.
responses:
'200':
description: Existing lead updated.
content:
application/json:
schema:
$ref: '#/components/schemas/Lead'
'201':
description: New lead created.
content:
application/json:
schema:
$ref: '#/components/schemas/Lead'
'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/leads/fields:
get:
summary: List lead fields
operationId: listLeadFields
description: 'Returns the custom field definitions for leads (person category), so you can map API names to types when ingesting the `fields` object.
**Scope:** none beyond a valid token.'
tags:
- Leads
responses:
'200':
description: Lead 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'
/v2/leads/{id}:
get:
summary: Get a lead
operationId: getLead
description: 'Returns a single lead by id. Lead ids come from `/v2/leads`, from an email''s `leadId`, or from matching an activity''s `visitorId` against a lead''s `visitorIds`. Only identified people have leads. See Identity.
**Scope:** `lead:view`'
tags:
- Leads
parameters:
- name: id
in: path
required: true
description: Encoded lead id.
schema:
type: string
responses:
'200':
description: The lead.
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/Lead'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
components:
responses:
InternalServerError:
description: Unexpected server error.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
BadRequest:
description: Malformed request, such as an invalid date or cursor.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Forbidden:
description: The token lacks the required OAuth scope.
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: insufficient_scope
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
NotFound:
description: The record was not found, or the id could not be decoded.
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/ErrorResponse'
- $ref: '#/components/schemas/CodeErrorResponse'
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
parameters:
CreatedAfter:
name: created_after
in: query
required: false
description: Return records created at or after this time. Accepts an ISO-8601 timestamp, interpreted as UTC unless it carries an offset. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day.
schema:
type: string
Email:
name: email
in: query
required: false
description: Return only the lead with this email address. Exact match, case-insensitive, with surrounding whitespace ignored.
schema:
type: string
UpdatedAfter:
name: updated_after
in: query
required: false
description: Return records updated at or after this time. Interpreted as UTC unless an offset is given. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day.
schema:
type: string
After:
name: after
in: query
required: false
description: Cursor for forward pagination. Pass the `endCursor` from the previous response.
schema:
type: string
Before:
name: before
in: query
required: false
description: Cursor for backward pagination. Pass the `startCursor` from the previous response.
schema:
type: string
UpdatedBefore:
name: updated_before
in: query
required: false
description: Return records updated at or before this time. Interpreted as UTC unless an offset is given. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day, so pass the next day's date to include a whole day.
schema:
type: string
CreatedBefore:
name: created_before
in: query
required: false
description: Return records created at or before this time. Accepts an ISO-8601 timestamp, interpreted as UTC unless it carries an offset. A bare date (`YYYY-MM-DD`) means midnight UTC at the start of that day, so pass the next day's date to include a whole day.
schema:
type: string
schemas:
CodeErrorResponse:
type: object
properties:
code:
type: string
description: Machine-readable error code.
message:
type: string
description: Human-readable error message.
PageInfo:
type: object
description: Cursor-based pagination metadata.
properties:
hasNextPage:
type: boolean
description: Whether more results exist after `endCursor`.
hasPreviousPage:
type: boolean
description: Whether more results exist before `startCursor`.
startCursor:
type:
- string
- 'null'
description: Cursor for the first item on this page.
endCursor:
type:
- string
- 'null'
description: Cursor for the last item on this page.
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.
Lead:
type: object
description: A lead (person) record, keyed on email, with its custom field values.
properties:
id:
type: string
description: Encoded lead identifier.
email:
type: string
description: Lead email address.
fields:
type: object
description: 'Custom field values keyed by field API name. Includes fields hidden in the Qualified UI. Values are typed by field: booleans for checkboxes, numbers for numeric fields, arrays of strings for multi-select fields, otherwise strings. An unset field is `null`.
'
additionalProperties: true
createdAt:
type: string
format: date-time
description: When the lead was created.
updatedAt:
type: string
format: date-time
description: When the lead was last updated. Advances on email changes, custom field-value changes, when a new visitor is associated with the lead, and when a company write changes an account-level field this lead inherits.
visitorIds:
type: array
items:
type: string
description: Encoded ids of the visitors that belong to this lead, one per browser or device the person has been seen on. This is how sessions, conversations, and meetings resolve to a person. Match an activity's `visitorId` against this array, which also attaches activity recorded before the visitor was identified. Returned as an empty array (never null) when there are none.
salesforceLeadId:
type:
- string
- 'null'
description: Salesforce Lead ID, returned verbatim (not encoded). Sourced from the lead's most recent session attributes; may briefly lag the source system.
salesforceContactId:
type:
- string
- 'null'
description: Salesforce Contact ID, returned verbatim.
pardotProspectId:
type:
- string
- 'null'
description: Pardot Prospect ID, returned verbatim.
marketoLeadId:
type:
- string
- 'null'
description: Marketo Lead ID, returned verbatim.
hubspotContactId:
type:
- string
- 'null'
description: HubSpot Contact ID, returned verbatim.
eloquaContactId:
type:
- string
- 'null'
description: Eloqua Contact ID, returned verbatim.
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
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