Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Argorant Enrich API
version: 1.0.0
summary: 'Argorant is a complete B2B outreach platform that a script or an AI agent can run from start to finish: find the right people, get their checked work emails and phone numbers, find one email from a name and a company domain, check your own lists, run campaigns with a personal line for each contact, answer replies in the same thread, and order new sending mailboxes on new domains.'
description: 'Argorant is a complete B2B outreach platform that a script or an AI agent can run from start to finish. Find the companies and people that fit your offer among 630.7M+ contacts in 202 countries. Get their work emails, checked right before you receive them, and their phone numbers. Find one person''s email from a name and a company domain. Check the emails on your own lists. Write a campaign with a personal line for every contact, send it from your own Google Workspace or Microsoft 365 mailboxes or from new mailboxes we set up on new domains for you, and answer the replies in the same thread.
The REST API, the command line tool (`npx argorant`) and the MCP server for AI agents (`https://mcp.argorant.com/mcp`) share one account, one credit balance and the same rules, so anything you do here works the same in a script, a pipeline or a chat with Claude, ChatGPT or Codex.
**The cheapest way to get validated contacts.** Argorant is the cheapest way to get validated B2B contacts. With pay as you go, 100,000 credits cost $499, which is under half a cent per validated contact. On Hyperscale, 200,000 credits a month cost $649, about a third of a cent each. An email that fails the check costs nothing. Compare the prices on our comparison pages, for example against ZoomInfo, Cognism, Hunter and LeadIQ.
**What it costs.** Searching, counting and previewing are free. One credit buys one validated contact; an email that does not pass the check is left out and costs nothing. Checking an email from your own list costs half a credit. A phone number costs 10 credits and only when one is returned. Finding one email costs 1 credit when found and 0.25 when nothing is found. Campaign emails come with your plan and never use credits. Pay as you go from $17.50 for 500 credits to $499 for 100,000, or pick a plan from $99 a month.
**How to start.** Create an API key at app.argorant.com/profile and send it as `Authorization: Bearer `. Call `GET /api/v1/account` to see your plan, credits and limits. Every answer carries an `X-Request-Id`; every error has the same shape with a stable `error.code`.
**Limits.** Each key may send a set number of requests a minute: Starter $99 a month (5,000 credits, 100,000 campaign emails, 60 requests a minute); Pro $249 a month (25,000 credits, 300,000 campaign emails, 240 requests a minute); Scale $449 a month (100,000 credits, 600,000 campaign emails, 600 requests a minute); Hyperscale $649 a month (200,000 credits, 1,000,000 campaign emails, 1200 requests a minute). The 7-day trial and pay-as-you-go accounts get 30 a minute (60 through an AI assistant). On a plan there are no daily limits apart from the email finder. During the trial the account has daily limits that reset at midnight UTC: 500 counts and 500 preview rows (1000 and 1000 through an AI assistant), and each key 100 revealed people and 50,000 export rows. For bigger numbers use saved lists, exports and campaigns. Pay-as-you-go packs: 500 credits for $17.50, 5,000 credits for $69, 25,000 credits for $199, 100,000 credits for $499, valid 365 days.
**Errors.** Every error has the same shape: `{"error": {"code", "message", "details"}, "request_id", "detail"}`. The code is stable; the message is a plain sentence. Every answer carries `X-Request-Id`, and answers to key calls carry `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`.
**Retries and pages.** Send an `Idempotency-Key` header on any write and a retry within 24 hours returns the first answer instead of doing the work twice. Lists take `limit` and `cursor` (or `offset`) and answer with `total`, `next_cursor` and `has_more`.'
contact:
name: Argorant support
url: https://help.argorant.com
termsOfService: https://argorant.com/terms
servers:
- url: https://app.argorant.com
description: Production
security:
- BearerAuth: []
tags:
- name: Enrich
description: 'Fill in one record you already have: an email, a name at a company, or a company domain.'
paths:
/api/v1/enrich:
post:
tags:
- Enrich
operationId: enrich
summary: Enrich an email, a name or a domain
description: 'Three ways in. Send `email` to get the person behind it. Send `name` and `domain` to find that person at the company and get their checked work email. Send `domain` alone to get the company profile. The person ways cost 1 credit for a match whose email passes the check; the same person again is free, and a miss costs nothing. The company way is free.
The company way needs only the argorant:read_counts scope.
| Cost | What it does | Key scopes |
| --- | --- | --- |
| 1 credit per person found whose email passes the check; the same person again, misses and companies are free | Spends credits | `argorant:unlock_contacts` |'
parameters:
- $ref: '#/components/parameters/IdempotencyKey'
- $ref: '#/components/parameters/RequestId'
responses:
'200':
description: Person found or Company or No match
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
type: object
properties:
found:
type: boolean
type:
type: string
person_id:
type: string
person:
type: object
properties:
record_id:
type: string
first_name:
type: string
last_name:
type: string
full_name:
type: string
title:
type: string
seniority:
type: string
departments:
type: array
items:
type: string
company:
type: string
company_normalized:
type: string
company_domain:
type: string
email:
type: string
email_status:
type: string
linkedin_url:
type: string
city:
type: string
state:
type:
- string
- 'null'
country:
type: string
industry:
type: string
industries:
type: array
items:
type: string
charged:
type: integer
already_revealed:
type: boolean
deliverable:
type: boolean
verification:
type: string
examples:
example1:
summary: Person found
value:
found: true
type: person
person_id: p_8d4ba3d46cc885007c38e437
person:
record_id: p_8d4ba3d46cc885007c38e437
first_name: Alex
last_name: Schneider
full_name: Alex Schneider
title: VP of Sales
seniority: VP
departments:
- Sales
company: Evenito AG
company_normalized: Evenito
company_domain: evenito.com
email: alex@evenito.com
email_status: valid
linkedin_url: https://www.linkedin.com/in/alexschneider
city: Zurich
state: null
country: Switzerland
industry: Software Development
industries:
- Software
- Software Development
charged: 1
already_revealed: false
deliverable: true
verification: valid
example2:
summary: Company
value:
found: true
type: company
charged: 0
company:
company: Evenito AG
company_normalized: Evenito
company_domain: evenito.com
industry: Software Development
city: Zurich
country: Switzerland
example3:
summary: No match
value:
found: false
type: person
charged: 0
'400':
description: 400 Bad request. `invalid_request` when neither email, name with domain, nor domain was sent.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
examples:
invalid_request:
summary: invalid_request (neither email, name with domain, nor domain was sent)
value:
error:
code: invalid_request
message: Neither email, name with domain, nor domain was sent.
details: {}
request_id: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail: Neither email, name with domain, nor domain was sent.
'401':
description: 401 Unauthorized. `unauthorized` when the API key is missing, wrong or revoked.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
examples:
unauthorized:
summary: unauthorized (the API key is missing, wrong or revoked)
value:
error:
code: unauthorized
message: The API key is missing, wrong or revoked.
details: {}
request_id: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail: The API key is missing, wrong or revoked.
'402':
description: 402 Payment required. `insufficient_credits` when no credit left for a match.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
examples:
insufficient_credits:
summary: insufficient_credits (no credit left for a match)
value:
error:
code: insufficient_credits
message: No credit left for a match.
details: {}
request_id: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail: No credit left for a match.
'403':
description: 403 Forbidden. `scope_missing` when the key lacks argorant:unlock_contacts.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
examples:
scope_missing:
summary: scope_missing (the key lacks argorant:unlock_contacts)
value:
error:
code: scope_missing
message: The key lacks argorant:unlock_contacts.
details: {}
request_id: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail: The key lacks argorant:unlock_contacts.
'409':
description: 409 Conflict. `idempotency_conflict` when the Idempotency-Key was used with another body.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
examples:
idempotency_conflict:
summary: idempotency_conflict (the Idempotency-Key was used with another body)
value:
error:
code: idempotency_conflict
message: The Idempotency-Key was used with another body.
details: {}
request_id: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail: The Idempotency-Key was used with another body.
'422':
description: 422 Validation error. `validation_error` when a field has the wrong type or is missing.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
examples:
validation_error:
summary: validation_error (a field has the wrong type or is missing)
value:
error:
code: validation_error
message: A field has the wrong type or is missing.
details: {}
request_id: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail: A field has the wrong type or is missing.
'429':
description: 429 Too many requests. `rate_limited` when too many requests this minute.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
Retry-After:
$ref: '#/components/headers/Retry-After'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorEnvelope'
examples:
rate_limited:
summary: rate_limited (too many requests this minute)
value:
error:
code: rate_limited
message: Too many requests this minute.
details: {}
request_id: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail: Too many requests this minute.
x-cost: 1 credit per person found whose email passes the check; the same person again, misses and companies are free
x-side-effect: spends credits
x-scopes:
- argorant:unlock_contacts
x-idempotent: true
x-paginated: false
requestBody:
required: true
content:
application/json:
schema:
type: object
required: []
properties:
email:
type: string
format: email
description: A work email to look up.
example: alex@evenito.com
name:
type: string
description: A person's full name, together with domain.
example: Alex Schneider
domain:
type: string
description: A company website domain. Alone it returns the company.
example: evenito.com
anyOf:
- required:
- email
- required:
- name
- domain
- required:
- domain
example:
email: alex@evenito.com
components:
schemas:
ErrorCode:
type: string
description: Stable error code. New codes may be added; treat unknown codes by their HTTP status.
enum:
- invalid_request
- launch_blocked
- unauthorized
- api_key_required
- plan_required
- insufficient_credits
- scope_missing
- permission_missing
- forbidden
- not_found
- route_not_found
- method_not_allowed
- conflict
- idempotency_conflict
- idempotency_in_progress
- gone
- quote_expired
- validation_error
- access_key_activation_required
- rate_limited
- daily_limit_reached
- internal_error
- unavailable
- confirmation_required
- invalid_webhook_url
- phones_not_in_plan
- card_not_charged
- owner_only
- quote_not_found
- charge_in_progress
- not_enough_names
- not_paid
- reason_required
- not_connected
- unsupported_tool
- tool_key_rejected
- price_mismatch
- quote_other_session
- export_failed
- sign_in_failed
ErrorEnvelope:
type: object
required:
- error
- request_id
properties:
error:
$ref: '#/components/schemas/Error'
request_id:
type: string
description: The id of this request, also in the X-Request-Id header. Quote it when you contact support.
example: req_8f2c1d9e0b7a4c3e9f1a2b3c4d5e6f70
detail:
description: The older error field, kept for clients written before the envelope. Read error instead.
Error:
type: object
required:
- code
- message
properties:
code:
$ref: '#/components/schemas/ErrorCode'
message:
type: string
description: One plain sentence that says what happened and what to do.
details:
type: object
description: Extra facts for this error, for example needed and balance for insufficient_credits, fields for validation_error, blockers for launch_blocked.
additionalProperties: true
headers:
Retry-After:
description: Seconds to wait before the next try.
schema:
type: integer
X-Request-Id:
description: The id of this request. Quote it when you contact support.
schema:
type: string
X-RateLimit-Remaining:
description: Requests left in the current minute.
schema:
type: integer
X-RateLimit-Limit:
description: Requests this key may send per minute.
schema:
type: integer
X-RateLimit-Reset:
description: Seconds until the minute window starts again.
schema:
type: integer
parameters:
IdempotencyKey:
name: Idempotency-Key
in: header
required: false
description: 'Any unique text up to 128 characters. A retry with the same key and the same body within 24 hours returns the first answer (with the header Idempotent-Replayed: true) instead of doing the work twice. The same key with another body answers 409 idempotency_conflict.'
schema:
type: string
maxLength: 128
example: 6f1c2e7a-run-42
RequestId:
name: X-Request-Id
in: header
required: false
description: Your own id for this request, 8 to 64 letters, digits, dot, dash or underscore. Returned as X-Request-Id; one is made for you when you send none.
schema:
type: string
pattern: ^[A-Za-z0-9._-]{8,64}$
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: ag_live_...
description: 'Your API key from app.argorant.com/profile, sent as `Authorization: Bearer <key>`. A connector sign-in token (ag_mcp_...) works the same way.'
externalDocs:
description: Guides, the CLI and the MCP server for AI agents
url: https://docs.argorant.com/docs