Qualified Bulk API
Submit batches of writes for asynchronous processing.
Submit batches of writes for asynchronous processing.
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-bulk-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 Bulk 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: Bulk
description: Submit batches of writes for asynchronous processing.
paths:
/v2/bulk:
post:
summary: Submit a bulk job
operationId: createBulkJob
description: 'Submits a batch of write operations (up to 500 items) for asynchronous processing. Returns `202` with the job; poll `/v2/bulk/{id}` for status and per-item results.
**Scope:** `bulk_job:manage`'
tags:
- Bulk
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- items
properties:
items:
type: array
description: 1–500 operations to process.
items:
type: object
required:
- entity
- action
- data
- request_id
properties:
entity:
type: string
enum:
- lead
- company
description: Target entity. Only `lead` and `company` are supported.
action:
type: string
enum:
- POST
description: Operation to perform. Only `POST` (create-or-update) is supported, for both `lead` and `company`.
data:
type: object
description: The upsert payload, the same body you would send to `POST /v2/leads` (`email` plus `fields`) or `POST /v2/companies` (`domain`, optional `name`, and `fields`).
request_id:
type: string
description: Caller-supplied id echoed back in the result for correlation.
responses:
'202':
description: Job accepted for processing.
content:
application/json:
schema:
type: object
properties:
job:
$ref: '#/components/schemas/BulkJob'
'400':
$ref: '#/components/responses/BulkBadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'422':
$ref: '#/components/responses/BulkInvalidItems'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
/v2/bulk/{id}:
get:
summary: Get a bulk job
operationId: getBulkJob
description: 'Returns the status and per-item results of a bulk job.
A finished job (`completed` or `failed`) is retained for at least 24 hours after it
finishes and is then deleted, after which this endpoint returns `404`, so fetch your
results within that window. Jobs still `enqueued` or `processing` are never removed.
Inspect `failedRecords` for the number of items that failed, and read the `errors` on each entry in the `result` array for per-item detail.
**Scope:** `bulk_job:view`'
tags:
- Bulk
parameters:
- name: id
in: path
required: true
description: Encoded bulk job id.
schema:
type: string
responses:
'200':
description: The bulk job.
content:
application/json:
schema:
type: object
properties:
job:
$ref: '#/components/schemas/BulkJob'
'400':
$ref: '#/components/responses/BulkBadRequest'
'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:
schemas:
BulkJob:
type: object
description: An asynchronous batch of write operations.
properties:
id:
type: string
description: Encoded job identifier.
status:
type: string
enum:
- enqueued
- processing
- completed
- failed
description: Current job status.
totalRecords:
type: integer
description: Total number of items in the batch.
processedRecords:
type: integer
description: Items processed so far.
failedRecords:
type: integer
description: Items that failed processing.
result:
type: array
description: Per-item outcomes, each correlating to a submitted `request_id`.
items:
type: object
properties:
requestId:
type: string
description: 'The caller-supplied id from the request. Note the asymmetry: you send `request_id` in the request body and read `requestId` back here.'
status:
type: string
description: 'Outcome for this item: `completed` or `failed`.'
operation:
type: string
description: The operation that was performed.
errors:
type: array
items:
type: string
description: Error messages, if the item failed.
createdAt:
type: string
format: date-time
description: When the job was created.
updatedAt:
type: string
format: date-time
description: When the job was last updated.
ErrorResponse:
type: object
properties:
error:
type: string
description: Human-readable error message.
CodeErrorResponse:
type: object
properties:
code:
type: string
description: Machine-readable error code.
message:
type: string
description: Human-readable error message.
responses:
InternalServerError:
description: Unexpected server error.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal server error
BulkBadRequest:
description: Malformed bulk request.
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: bad_request
message: Invalid request
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'
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
BulkInvalidItems:
description: The batch was rejected, for example `items` is missing, not an array, or outside the 1–500 range.
content:
application/json:
schema:
$ref: '#/components/schemas/CodeErrorResponse'
example:
code: invalid_items
message: items must be an array with size 1..500
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