Skip to main content
Glama

AIsa Apollo

Server Details

Your agent needs B2B contacts and the pipeline objects around them — find the company, find the person, get the email, then write it back where your team works.

What you can ask for • "Find heads of engineering at Series-B SaaS companies in the Nordics, with emails." • "Enrich these companies with headcount, industry and funding." • "What roles is this company hiring for right now?" • "Create an account and a contact, then log this opportunity." • "Search our sequences for messages sent to this domain."

How to use it Point any MCP client at https://mcp.aisa.one/apollo/mcp and sign in with OAuth — there is no key to create or paste. 54 tools: people and organisation search and enrichment, job postings, accounts, contacts, opportunities and their stages, custom fields, labels, notes, users, email accounts, sequence messages and phone-call search — reads and writes.

Why this rather than the source The full object model, not just a search endpoint, so an agent can finish the job rather than hand you a CSV.

It is also a door to the rest The same login reaches 26 sources and 580+ operations. Find the person here, then ask the same agent what their company's traffic looks like or what they rank for — without adding a second server.

What it costs Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident.

Where else it reaches https://mcp.aisa.one/sales/mcp adds Similarweb and creator discovery around it.

Ownership verified
Status
Healthy
Uptime
94.1% over 43 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

C2.7/5.0

Scored across 61 tools

Disambiguation3/5

Most Apollo tools map to a distinct resource+action, so an agent can usually pick correctly. But there are real collisions: `get_apollo_fields` and `post_apollo_fields` are both described as 'Get a list of fields', the three `patch_*` tools reuse the 'View ... by ID' copy from their `get_*` twins, and the deprecated `use` sits alongside `batch_use`, `batch_quote` and `batch_get_schema`.

Naming Consistency3/5

The Apollo group consistently uses an HTTP-verb prefix plus the upstream REST path (get_/post_/patch_/put_), which is readable but verbose. The router-level tools break that pattern entirely with bare names (`account`, `search`, `use`, `list_categories`), and path placeholders vary inconsistently (`_accounts_id` vs `_contacts_contact_id` vs `_sequence_id_abort`).

Tool Count2/5

61 tools is far past the point where an agent can hold the surface in view, and most of the bulk is a near-literal transcription of Apollo's REST endpoints rather than curated capabilities. The 5-6 router/billing/meta tools are fine; the ~55 endpoint mirrors make selection and quoting burden heavy.

Completeness3/5

Coverage of the Apollo CRM domain is broad — search, enrich, bulk operations, sequences, tasks, calls, reports and usage stats are all present. However there are no delete/destroy operations anywhere, and notes, labels and custom fields are read-only, leaving lifecycle dead ends an agent will hit when cleaning up records.

Available Tools

61 tools
accountShow account and usageA
Read-only
Inspect

Who am I, what can I use, how much can I spend: the key, the account balance, the Go-to-Market wallet when one is active, and usage for today, 7 days and 30 days. Free; needs the Authorization header. Call it to verify a new connection or to explain a 402. ok is true only when the balance was read; otherwise each entry of errors says what to do in next_step.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the readOnlyHint/openWorldHint/destructiveHint annotations: the call is free, it requires the Authorization header, and it discloses result semantics ('ok is true only when the balance was read; otherwise each entry of errors says what to do in next_step'). That tells an agent how to interpret partial failure, which annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with what the agent gets, followed by cost/auth, then call triggers, then result interpretation. No sentence is redundant and none could be dropped without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with an output schema already present, the description covers the remaining gaps: cost, auth requirement, invocation triggers, and the ok/errors/next_step contract. Nothing an agent needs to call or interpret it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the description has nothing parameter-level to compensate for, and the schema is fully covered. A 4 rather than 5 reflects that it adds no input-syntax detail, though none is possible here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete resource set (identity/key, account balance, Go-to-Market wallet, usage over 1/7/30 days) rather than restating the name. It is clearly distinguishable from every sibling, which are all Reddit, batch, or search tools. An agent knows exactly what it will learn by calling it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit triggering conditions are given: 'Call it to verify a new connection or to explain a 402.' That is a strong when-to-use statement. It stops short of 5 because it names no alternative tool or a when-not condition, though the sibling list offers no obvious competing diagnostic.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_get_schemaGet AIsa tool schemas in one batchA
Read-onlyIdempotent
Inspect

Retrieve schemas for 1 to 20 exact tool names from search. Build arguments from successful schemas, then call batch_quote. Do not call batch_use yet. Use tool names exactly as search returns them, without a client prefix such as mcp__aisa__. Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.

NameRequiredDescriptionDefault
toolsYesExact tool names returned by search whose complete contracts are needed. Never invent tool names.
session_idNoReuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.
include_documentationNoReturn the complete immutable public OpenAPI operation, referenced declarations, provenance and scoped completeness. Documentation does not change execution support.
include_response_schemaNoReturn the complete response_schema. Defaults to false.
include_arguments_schemaNoReturn the complete arguments_schema. Defaults to true.

Output Schema

NameRequiredDescription
toolsYes
session_idYesReuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.
error_countYes
total_countYes
success_countYes
next_steps_guidanceYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description is not required to restate it. It adds genuine operational context: the batch_use prohibition, exact-name/prefix requirements, and session reuse semantics. It does not cover failure handling when names are invalid, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and size limit, and every sentence carries workflow value. The session_id sentence duplicates the schema's own parameter description, which is minor redundancy rather than bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only batch retrieval tool with an output schema, the description supplies the orchestration context an agent needs (source of names, next steps, session handling) without needing to explain return values. Nothing essential to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds real meaning beyond the schema by constraining names to those returned by search and warning against a client prefix such as mcp__aisa__, which is not encoded in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieve schemas for 1 to 20 exact tool names') and pins the source of those names to search. This clearly separates it from siblings like search (finds tools), batch_quote, and batch_use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly sequences the workflow: build arguments from successful schemas, then call batch_quote, and 'Do not call batch_use yet.' This is an explicit when-to-use and when-not-to-use instruction naming the alternative siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_quoteQuote published AIsa tools without executing themA
Read-onlyIdempotent
Inspect

Obtain AIsaServices cost quotes for 1 to 20 published tools without executing them. Same input as batch_use: exact tool names and schema-valid arguments. Never falls back to execution. The response reports auto_execute_eligible and auto_execute_threshold_micros_usd. auto_execute_eligible waives only the extra cost-confirmation step and does not override a user prohibition on execution, a narrower scope, or a tighter budget limit. Quotes are price observations, not authorization grants. Use tool names exactly as search returns them, without a client prefix such as mcp__aisa__. Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.

NameRequiredDescriptionDefault
callsYes
search_idNoOptional search correlation identifier returned by search.
session_idNoReuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.

Output Schema

NameRequiredDescription
resultsYes
batch_idYes
session_idYesReuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.
error_countYes
total_countYes
success_countYes
next_steps_guidanceYesDeterministic next-step instructions derived from this result. Not an authorization grant.
auto_execute_eligibleNoTrue when the worst-known total of successful USD quotes is at or below auto_execute_threshold_micros_usd. A non-USD successful quote makes the batch ineligible. Present on quote responses.
auto_execute_threshold_micros_usdNoConfigured auto-execute threshold in micro-USD. 0 disables automatic execution. Present on quote responses.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnly/idempotent annotations by explaining that quotes are price observations rather than authorization grants, and precisely delimiting what auto_execute_eligible does and does not waive (user prohibition, narrower scope, tighter budget). It also guarantees no execution fallback, which is the key behavioral risk for this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and most sentences carry distinct rules (no fallback, eligibility limits, naming, session reuse). It is on the long side and the argument-shape constraint is stated twice in spirit, but little is truly wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation isn't required, yet the description still flags the two response fields that matter for a downstream decision. Combined with session and naming guidance, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 67% schema coverage the schema already documents each parameter, so the description earns credit only for added meaning: exact-name rules for 'tool', session_id reuse semantics, and the 1-to-20 argument-shape parallel with batch_use. It doesn't clarify search_id beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Obtain AIsaServices cost quotes for 1 to 20 published tools') plus the crucial scope qualifier 'without executing them.' It is immediately distinguishable from the sibling batch_use, which executes rather than quotes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the parallel sibling ('Same input as batch_use') and draws the boundary ('Never falls back to execution'). It also gives operational conditions: use names exactly as search returns them, strip any mcp__aisa__ prefix, and reuse session_id from Search for the task.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_useExecute published AIsa toolsA
Destructive
Inspect

Billable API calls can incur substantial charges. Never call before a successful batch_quote for the same tools and arguments. Execute only when that quote response reports auto_execute_eligible=true for these calls, or when explicit user authorization covers that cost and risk. auto_execute_eligible waives only the extra cost-confirmation step; it does not override a user prohibition on execution, a narrower scope, or a tighter budget limit. Re-quote if tools, arguments, or scope change. Execute 1 to 20 independent published-tool calls; never silently retry. A missing or failed quote is not free. Use tool names exactly as search returns them, without a client prefix such as mcp__aisa__. Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.

NameRequiredDescriptionDefault
callsYes
search_idNoOptional search correlation identifier returned by search.
session_idNoReuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.

Output Schema

NameRequiredDescription
resultsYes
batch_idYes
session_idYesReuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.
error_countYes
total_countYes
success_countYes
next_steps_guidanceYesDeterministic next-step instructions derived from this result. Not an authorization grant.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover mutability, destructiveness, and open-world behavior. The description adds critical business logic: billable calls, quote dependency, the meaning of auto_execute_eligible (waives only cost confirmation, not user prohibitions), and no silent retry. It doesn't detail rate limits or return format, but with an output schema present, that's acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and front-loads the cost warning, but it packs many separate instructions into one block, making it less scannable. Some sentences like 'A missing or failed quote is not free' add value, but the overall flow could be better structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the destructive, open-world annotations and the presence of an output schema, the description covers the essential preconditions and behavioral constraints. It could mention error handling or partial failure behavior, but the core guidance is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and the description adds important semantics: tool names must be exact without client prefix, session_id reuse guidance, and 1-20 call limit. It doesn't explain search_id, but the schema description for search_id is already clear enough.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Execute 1 to 20 independent published-tool calls', and the title matches. It distinguishes itself from batch_quote by requiring a quote first, but doesn't explicitly contrast with the singular 'use' sibling, though that's implied by 'batch'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use conditions: only after a successful batch_quote with auto_execute_eligible=true or explicit user authorization. It also states re-quote conditions and prohibits silent retries, leaving little ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_accounts_idView an AccountA
Read-onlyIdempotent
Inspect

View an account by ID. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
idYesAccount ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, openWorld and non-destructive, so the bar is lower; the description still adds two genuinely useful facts not in annotations: the master API key requirement and the per-request price. It stops short of 5 because it says nothing about rate limits or failure modes for a privileged read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operative text is two front-loaded sentences with zero waste. The embedded pricing HTML block is boilerplate rather than explanatory content, which slightly dilutes an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and the description covers auth and cost. What is missing is routing context against the many sibling account tools, which is the main gap for an agent deciding whether to call this one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single documented 'Account ID' parameter, so the schema already carries the semantics. The description only restates 'by ID' and adds no format, source, or lookup guidance beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('View an account by ID'), which clearly separates it from the write siblings like patch_apollo_accounts_account_id and post_apollo_accounts_search. It does not explicitly name an alternative, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is the prerequisite 'Requires a master API key'. There is no indication of when to use this versus post_apollo_accounts_search or the other account-related siblings, and no exclusions or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_account_stagesList Account StagesA
Read-onlyIdempotent
Inspect

List account stages. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds the non-obvious 'Requires a master API key' constraint, which is genuinely useful behavioral context beyond the annotations, though it omits any rate-limit or pagination notes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional content is front-loaded in one short sentence. The mandated pricing block inflates the text but is boilerplate inject rather than author prose, so it does not materially hurt structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema carrying return-value detail and no input parameters, the description only needs to cover purpose, auth, and scope. Purpose and auth are present; the one real gap is sibling differentiation, which is minor for such a simple read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline for a parameterless schema is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List account stages'), so the operation is unambiguous. However, it does not distinguish itself from close siblings like get_apollo_contact_stages and get_apollo_opportunity_stages, leaving the agent to infer scope from the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance and no mention of alternatives, even though three near-identical stage-listing siblings exist. The agent must infer selection criteria from tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_contacts_contact_idUpdate or View ContactA
Read-onlyIdempotent
Inspect

View a contact by ID. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
contact_idYesContact ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new operational context the annotations do not: the master API key authorization requirement and the per-request cost of $0.012 for successful calls, both of which affect whether an agent should call it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operative content is front-loaded in two short sentences with zero waste. The embedded pricing comment block is boilerplate policy noise rather than tool guidance, but it is clearly delimited and does not obscure the primary instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover the safety profile; the description supplies the missing auth and cost context. For a one-parameter lookup tool this is close to complete, with only the sibling-routing guidance absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter (contact_id) documented at 100% schema coverage, so the schema carries the semantics. "by ID" merely restates the parameter in prose and adds no format, sourcing, or validation detail beyond the schema's "Contact ID" description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"View a contact by ID" states a specific verb and resource, and the identifier-based lookup is unambiguous. However, the title ("Update or View Contact") contradicts the read-only framing and the description never distinguishes this tool from the sibling patch_apollo_contacts_contact_id, which is the write path for the same resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the natural usage (direct lookup by a known ID) and states the master API key prerequisite, which is a real gate. But it gives no when-to-use/when-not guidance versus siblings such as post_apollo_contacts_search (find by criteria) or patch_apollo_contacts_contact_id (modify), so routing relies on inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_contact_stagesList Contact StagesA
Read-onlyIdempotent
Inspect

List contact stages. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds one useful non-annotation fact (master API key requirement) and a pricing note, but nothing about rate limits, pagination, or scope of the returned stages.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional sentence is short and front-loaded, with the auth requirement immediately following. The injected pricing block adds bulk but is required boilerplate rather than author bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and there are no parameters to document. The auth requirement is stated; the only real omission is disambiguation from the sibling stage-listing tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the rubric the baseline is 4. The description adds nothing parameter-related, but none is needed since the schema is empty.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb+resource (list contact stages), so an agent knows what it retrieves. However, it does nothing to distinguish itself from the near-identical siblings get_apollo_account_stages and get_apollo_opportunity_stages, which is exactly the ambiguity that matters for selection here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Requires a master API key" is a genuine precondition, which is more than many definitions offer. But there is no guidance on when to choose this over the account/opportunity stage siblings, nor any exclusion or context for use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_email_accountsGet a List of Email AccountsA
Read-onlyIdempotent
Inspect

Get a list of email accounts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds one piece of non-annotation context, the master API key requirement, but says nothing about pagination, filtering, or result scope. Modest added value beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operative description is a single efficient sentence with the purpose front-loaded. The appended pricing comment block is injected boilerplate that adds length without aiding tool selection, which slightly dilutes the otherwise tight structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and rich annotations cover the behavioral profile. For a zero-parameter read tool, stating purpose plus the auth requirement is sufficient, though a hint about result scope (e.g., all accounts vs. paged) would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is an empty object, so there is nothing for the description to disambiguate. Baseline 4 applies; no parameter syntax or defaults are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get a list of email accounts.' An agent can immediately tell this is a read that lists email accounts. However, there are no sibling tools with overlapping naming (no other 'email_accounts' tool), so no explicit differentiation is offered or needed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description supplies a prerequisite ('Requires a master API key') but gives no when-to-use/when-not guidance and names no alternatives. Usage is only implied by the tool's name and the plural 'list' framing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_emailer_messages_id_activitiesCheck Email StatsB
Read-onlyIdempotent
Inspect

Check email stats for a specific outreach email. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
idYesEmailer message ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false. The description still adds two pieces of non-annotation context an agent needs: it requires a master API key, and it costs $0.012 per successful request, which affects invocation decisions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional sentence is short and front-loaded, with the auth requirement following immediately. The embedded pricing comment block is boilerplate that consumes roughly half the text but is at least clearly demarcated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the single-parameter read operation is otherwise straightforward. Still, the description never characterizes the scope of 'stats' or positions the tool against its emailer siblings, leaving a gap for an agent choosing among many get_/post_ apollo tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single, fully-documented 'id' parameter, so the baseline is 3. The phrase 'specific outreach email' adds only light framing and no format, source, or ID-resolution guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Check email stats for a specific outreach email'), which is clear enough to act on. It does not, however, differentiate itself from the sibling get_apollo_emailer_messages_search or explain what 'stats' actually covers, and the tool name's 'activities' is not reflected in the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance is given, and no alternative is named despite several emailer-related siblings. The only conditional information is the auth prerequisite ('Requires a master API key').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_fieldsGet a List of Fields + Create a Custom FieldB
Read-onlyIdempotent
Inspect

Get a list of fields. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds the master API key requirement, which is useful context, but it does not describe field scope, listing behavior, or how it differs from the sibling create/typed-field tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The useful content is front-loaded in two short sentences, and the pricing block is boilerplate rather than explanation. It is appropriately sized overall, though the HTML pricing comment is noise for tool selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has an output schema, and is covered by annotations, so the description is close to sufficient. However, it omits sibling routing and leaves the title's 'Create a Custom Field' claim unresolved, which could confuse an agent choosing between get_apollo_fields and post_apollo_fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so the schema already fully defines the call shape and no parameter semantics are needed. The baseline for a zero-parameter tool is 4; the description adds no parameter detail but does not need to compensate for any schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Get a list of fields.' It does not, however, distinguish this tool from siblings such as post_apollo_fields or get_apollo_typed_custom_fields. The title's '+ Create a Custom Field' also introduces ambiguity that the description itself does not resolve.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is the prerequisite 'Requires a master API key.' There is no explanation of when to use this tool versus siblings like post_apollo_fields for creation or get_apollo_typed_custom_fields for typed custom fields.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_labelsGet a List of All ListsA
Read-onlyIdempotent
Inspect

Get a list of all lists (labels). Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds a genuinely useful operational constraint not present in structured data: a master API key is required. It stops short of noting rate limits or result-size behavior, but for a read-only lookup this is solid added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional content is a single front-loaded sentence with the auth caveat immediately after, which is efficient. The injected pricing block adds length that does not help tool selection, though it is an appended artifact rather than authored prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and with zero parameters the schema burden is nil. Purpose plus the master-key requirement covers what an agent needs to invoke this correctly; only when-to-use routing to siblings is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to clarify beyond confirming the call is unfiltered. No syntax or format detail is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete verb and resource ("Get a list of all lists (labels)") and the parenthetical disambiguates that 'labels' and 'lists' are the same object. It is clear enough to act on, though the phrasing is slightly circular and it never contrasts itself with any sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this versus alternatives; the only conditional statement is an auth prerequisite ("Requires a master API key"). The agent must infer the use case (discovering label/list IDs) entirely on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_notesGet a List of NotesB
Read-onlyIdempotent
Inspect

Get a list of notes. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
pageNoPage number (when supported). At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
per_pageNoResults per page (when supported). At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
account_idNoFilter by an account ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
contact_idNoFilter by a contact ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
start_dateNoOnly include notes created on/after this date (when supported). At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
contact_idsNoFilter by contact IDs. At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
opportunity_idNoFilter by an opportunity ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
conversation_idNoFilter by a conversation ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
conversation_idsNoFilter by conversation IDs. At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".
calendar_event_idNoFilter by a calendar event ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 "At least one argument is required".

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower. The description adds one genuinely useful non-annotation fact — a master API key is required — plus pricing context, but omits the behavioral trap that unfiltered calls fail with HTTP 400.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no wasted prose; the auth requirement is stated immediately. The injected pricing comment block adds bulk but is boilerplate rather than authored content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the schema carries the filter requirement. Still, for a 10-parameter retrieval endpoint with several near-identical siblings, the description is thin — it never mentions filtering, pagination, or how it differs from neighboring search tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 10 parameters, so the schema already documents each filter and the at-least-one-filter rule. The description contributes no parameter meaning beyond that, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a list of notes'), which is clear on its own. It does not, however, distinguish this tool from the many other Apollo list/retrieval siblings (e.g. get_apollo_emailer_messages_search, get_apollo_users_search), so an agent cannot tell from the text alone why it would pick this one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives, and no hint about the most important usage constraint: that at least one filter argument is required. The only guidance an agent gets is buried in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_opportunities_opportunity_idView or Update DealA
Read-onlyIdempotent
Inspect

View a deal (opportunity) by ID. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
opportunity_idYesOpportunity ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds the master-API-key requirement, which is useful operational context beyond the annotations, but says nothing about rate limits, error behavior, or the fact that the title ('View or Update Deal') misleadingly suggests write capability.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and auth requirement are front-loaded in a single tight sentence, which is good. The pricing boilerplate that follows does not help an agent select or invoke the tool and is mildly noisy, but it is delimited and clearly ancillary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-by-ID tool with an output schema and full annotation coverage, the description supplies what the agent needs: what it fetches and the auth prerequisite. Return value details are correctly left to the output schema; only the routing vs. sibling tools is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single opportunity_id parameter, so the baseline of 3 applies. The phrase 'by ID' in the description adds no format, encoding, or sourcing detail beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'View a deal (opportunity) by ID,' which maps cleanly to the get_apollo_opportunities_opportunity_id name. It does not explicitly distinguish itself from get_apollo_opportunities_search or get_apollo_opportunities_opportunity_id's update sibling, but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides the prerequisite 'Requires a master API key,' which tells the agent an auth condition must be met before calling. However, it gives no guidance on when to use this single-record fetch vs. get_apollo_opportunities_search or when to use the patch sibling for updating.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_opportunity_stagesList Deal StagesB
Read-onlyIdempotent
Inspect

List deal stages (opportunity stages). Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds one genuinely useful piece of context — the master API key requirement — but says nothing about scope of the returned stage list or account/workspace dependency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional sentence is front-loaded and wastes no words, but the embedded aisa-pricing block is boilerplate noise that adds length without helping tool selection.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, annotations cover the safety semantics, and there are no parameters. Purpose plus the auth prerequisite is close to sufficient for a simple read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to document; the baseline for a parameterless tool applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List deal stages') and disambiguates the term with the parenthetical '(opportunity stages)', which helps separate it from the nearby account/contact stage tools. It does not, however, explicitly distinguish itself from get_apollo_account_stages or get_apollo_contact_stages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is the auth prerequisite ('Requires a master API key'). There is no statement of when to call this versus the sibling stage-listing tools or the opportunity search/get tools, so selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_organizations_enrichOrganization EnrichmentA
Read-onlyIdempotent
Inspect

Enrich one company by domain. domain is the only parameter and it must be the bare domain (apple.com), not a full URL. Returns an organization object with id, name, website_url, linkedin_url, twitter_url, facebook_url, angellist_url, phone, founded_year, alexa_ranking, publicly_traded_symbol, publicly_traded_exchange and languages. Use it as the entry point when all you have is a domain. For several domains at once use post_apollo_organizations_bulk_enrich; for the full record including funding and technology detail use get_apollo_organizations_id, which needs the Apollo organization id this call returns.

Usage-based billing; Default request estimate: $0.01975 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
domainYesThe domain of the company that you want to enrich. Do not include www., the @ symbol, or similar. Example: apollo.io or microsoft.com

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world, non-destructive behavior, so the safety profile is covered. The description adds real value beyond that: the chaining contract that get_apollo_organizations_id consumes the id this call returns, plus billing context. The return-field enumeration is largely redundant with the output schema, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then alternatives, then chaining guidance. Slightly padded by the long list of return fields that the output schema already defines, plus an injected pricing block, but overall tight and well-ordered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what it does, when to use it, its two alternatives, and the id hand-off to the detail sibling. With an output schema present, return values need not be documented, and nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reinforces the single-parameter contract and adds a caveat beyond the schema ('must be the bare domain (apple.com), not a full URL'), which sharpens the format requirement rather than merely restating it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Enrich one company by domain'), and explicitly names the siblings it is not (post_apollo_organizations_bulk_enrich, get_apollo_organizations_id). An agent can select it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: 'Use it as the entry point when all you have is a domain,' bulk for 'several domains at once,' and get_apollo_organizations_id for 'the full record including funding and technology detail.' Conditions for choosing alternatives are all spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_organizations_idGet Complete Organization InfoA
Read-onlyIdempotent
Inspect

The complete Apollo record for one company, by Apollo organization id (not by domain). Returns an organization object carrying everything enrichment returns plus the deeper fields: funding history, technology stack, department headcounts and related organizations. Get the id from get_apollo_organizations_enrich or post_apollo_mixed_companies_search first — this endpoint cannot take a domain.

Usage-based billing; Default request estimate: $0.01975 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
idYesThe Apollo ID for the organization that you want to research. To find organization IDs, call the Organization Search endpoint and identify the organizaton_id value for the organization. Example: 5e66b6381e05b4008c8331b8

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description still adds useful substance by contrasting the payload with enrichment ('everything enrichment returns plus the deeper fields') and by disclosing usage-based billing. It stops short of rate limits or quota behavior, but that is a minor gap against the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The substantive content is two tight sentences with the id-first constraint front-loaded before the supporting detail. Only the auto-injected pricing block bulks it out, so the prose itself earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the return shape need not be re-explained, and annotations carry the safety profile. What remains — how to get the id, what extra fields to expect, and that domains are unsupported — is all supplied, so nothing needed for a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter is documented with an example, so the baseline is 3. The description goes further by clarifying the identifier's origin and warning that a domain will not work, which materially reduces the chance of a wrong-value call.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — the complete Apollo record for one company — and immediately scopes it to being looked up by Apollo organization id rather than domain. That scoping distinguishes it cleanly from the enrichment and search siblings, so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent how to obtain the required id (via get_apollo_organizations_enrich or post_apollo_mixed_companies_search) and states the exclusion plainly: 'this endpoint cannot take a domain.' Both the positive path and the anti-pattern are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_organizations_organization_id_job_postingsOrganization Job PostingsA
Read-onlyIdempotent
Inspect

Live job postings for one company, by Apollo organization id. Each posting carries its title, location, posted date and source URL. Useful as a hiring signal — which functions a company is expanding, and where. Get the organization id from get_apollo_organizations_enrich first. This reads Apollo's job board data, not the company's own careers page, so absence of postings is not proof a company is not hiring.

Usage-based billing; Default request estimate: $0.01975 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
pageNoThe page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4
per_pageNoThe number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10
organization_idYesThe organization ID of the company for which you want to find job postings. Each company in the Apollo database is assigned a unique ID. To find IDs, call the Organization Search endpoint and identify the values for organization_id. Example: 5e66b6381e05b4008c8331b8

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is the data-source disclosure: it reads Apollo's job board, not the company's careers page, so absence of postings is not proof the company isn't hiring. That is a genuinely useful caveat beyond the annotations, though return format and pagination behavior are left to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by payload contents, the sourcing prerequisite, and the honesty caveat in a compact block. The appended pricing blockquote is boilerplate rather than tool guidance, but it is clearly demarcated and does not obscure the useful text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, and it covers purpose, id source, and the interpretive limitation well. Remaining gaps are minor, e.g. no note on pagination limits or how many postings to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so page, per_page and organization_id are already documented in the schema; baseline is 3. The description adds a hint about where to source organization_id, though it points at get_apollo_organizations_enrich while the schema's own organization_id description says to use the Organization Search endpoint, a minor inconsistency rather than added clarity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Live job postings for one company, by Apollo organization id') and enumerates what each posting carries (title, location, posted date, source URL). An agent can distinguish this from sibling organization tools like get_apollo_organizations_id and get_apollo_organizations_enrich without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite ('Get the organization id from get_apollo_organizations_enrich first') and frames the use case as a hiring signal. It does not enumerate when-not-to-use or name a competing sibling, but the workflow context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_apollo_typed_custom_fieldsGet a List of All Custom FieldsA
Read-onlyIdempotent
Inspect

Get a list of all custom fields. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe-read profile (readOnlyHint, idempotentHint, destructiveHint false), so the bar is lower. The description adds a genuinely useful constraint beyond annotations: the operation requires a master API key, which affects whether an agent can call it at all.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operative content is two short sentences with the purpose front-loaded and the auth prerequisite immediately after. The injected pricing comment block is boilerplate noise that pads the text but is not under the tool author's control.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with an output schema (so return values need no explanation) and full annotation coverage, the description covers purpose and the key auth gate. It falls short only on clarifying what 'typed' means versus the sibling fields endpoint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which sets the baseline at 4 per the rubric, and the empty schema means there is no parameter semantics to compensate for. The description rightly spends no words on arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a list of all custom fields'), so the operation is unambiguous. However, it never distinguishes itself from close siblings such as get_apollo_fields or get_apollo_labels, and the 'typed' qualifier in the tool name is left unexplained.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this tool over get_apollo_fields or the other field/label endpoints. The only clause present ('Requires a master API key') is a prerequisite, not a usage condition or alternative comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesBrowse the AIsa catalogueA
Read-only
Inspect

The AIsa catalogue at a glance: categories, the servers in each, tool counts, and the dedicated endpoint to connect if you only need one category. Free. (AIsa-only: tool-router has no equivalent.) Use mcp.aisa.one/mcp?modules=<category> (or mcp.aisa.one/<category>/mcp) to have that category's tools listed directly instead of via search.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a safe, read-only, closed-world operation. The description adds useful context beyond annotations by saying it returns categories, servers, tool counts, and the dedicated endpoint, and that it is free. It omits auth/rate-limit details, but those are less critical given the read-only annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with what the tool returns and is generally efficient. The parenthetical about tool-router and the endpoint URL add some density, but each part contributes usage or content context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, read-only annotations, and an output schema available, the description supplies enough context for correct invocation. It explains the catalogue contents and gives the category-specific endpoint alternative, leaving no critical gap for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so parameter semantics are not a meaningful differentiator. The schema has no properties to explain, and the description does not need to document any inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this tool gives a catalogue overview: categories, servers per category, tool counts, and a dedicated endpoint. The resource is specific and recognizable, though sibling differentiation is only partial because it references 'tool-router' rather than the listed siblings like search/use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear alternative: use the category-specific endpoint if you only need one category, rather than going via search. It also notes the tool is free and AIsa-only, but it does not explicitly state when to call list_categories instead of search or use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patch_apollo_accounts_account_idUpdate an AccountB
Destructive
Inspect

Update fields on an existing account. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes
account_idYesAccount ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is largely covered. The description contributes the master-API-key auth requirement and pricing note, but omits important behavior for a PATCH: that unspecified fields are left untouched, and any error/partial-failure semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action and then the auth requirement, with no redundancy. The injected pricing block adds length but is boilerplate rather than authorial padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover destructiveness, so those need not be restated. Still, for a mutation endpoint with a nested custom-fields object, the description never explains PATCH partial-update behavior or that typed_custom_fields requires pre-fetched field IDs, leaving meaningful operational gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema coverage is 50% (account_id and body), and the description adds no parameter context. However, the nested body properties are documented exhaustively in the schema itself (name, phone, domain, owner_id, raw_address, account_stage_id, typed_custom_fields), so the schema carries the load and a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update fields on an existing account') with clear scope (PATCH semantics implied by 'fields'). However, it does not differentiate from near-siblings such as post_apollo_accounts_bulk_update, post_apollo_accounts_update_owners, or patch_apollo_contacts_contact_id, leaving the agent to infer the distinction from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Adds one concrete prerequisite, 'Requires a master API key,' which is genuine selection context. But it gives no when-to-use vs when-not guidance and no pointer to the bulk-update or update-owners siblings, so routing relies on inference from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patch_apollo_contacts_contact_idUpdate or View ContactD
Destructive
Inspect

View a contact by ID. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes
contact_idYesContact ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

D1.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description says 'View a contact by ID', implying a read, while annotations declare readOnlyHint=false and destructiveHint=true. This directly contradicts the structured safety signal. The one useful addition is the master API key requirement, but the contradiction dominates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional description is a single terse sentence that mischaracterizes the tool, and it is padded with a multi-line pricing boilerplate block that is irrelevant to selecting or invoking the tool. The valuable content (auth requirement) is buried after the core claim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive PATCH tool with a nested update payload and a required body, the description never explains that it mutates a contact, what fields are updatable, or that `label_names` overwrites existing lists. An output schema exists so return values need not be explained, but the mutation semantics are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% and the tool has a nested `body` object with a required but undocumented top-level shape. The description contributes nothing about `contact_id` or the update payload, so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description says only 'View a contact by ID', but the tool is a PATCH endpoint whose required `body` object contains update fields (email, title, name, labels, etc.) and whose title is 'Update or View Contact'. The description captures the read half and omits the mutation half, which is the primary operation, making it misleading rather than merely vague.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus the obvious read sibling `get_apollo_contacts_contact_id`, or versus the bulk update tools like `post_apollo_contacts_bulk_update`. The only condition stated is 'Requires a master API key', which is an auth note, not usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

patch_apollo_opportunities_opportunity_idView or Update DealD
Destructive
Inspect

View a deal (opportunity) by ID. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes
opportunity_idYesOpportunity ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

D1.6/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations declare readOnlyHint=false and destructiveHint=true, but the description says 'View a deal', implying a read-only operation. This contradicts the mutation/destructive nature of the tool and omits what fields are updated, whether changes are reversible, or what gets destroyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loads a functional statement, but that statement is the wrong operation for the tool and is followed by pricing boilerplate rather than necessary update guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive PATCH tool with annotations, nested body parameters, and a required body object, the description is critically incomplete. It omits update semantics entirely and instead describes a read operation, leaving an agent unable to safely invoke the tool from the description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, and the description adds almost no parameter meaning beyond 'by ID'. It does not explain the required body object or any of the update fields, leaving the schema to carry most of the semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a resource and ID lookup ('View a deal (opportunity) by ID'), but the tool is a PATCH update tool. It gives the wrong core verb and fails to distinguish itself from the GET sibling get_apollo_opportunities_opportunity_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It only states an authentication prerequisite ('Requires a master API key') and provides no guidance on when to use this PATCH tool versus the GET tool or other update endpoints. The only usage signal it gives is misleading because it frames the operation as viewing rather than updating.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_accountsCreate an AccountA
Destructive
Inspect

Create a new account. Duplicate domains are not allowed. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true), so the bar is lower. The description still adds genuinely non-annotation context: the master-API-key requirement and the duplicate-domain rejection rule. It omits failure behavior and does not restate anything the annotations already cover, but adds no more.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short front-loaded sentences: action, constraint, prerequisite. The pricing block is boilerplate but separate and ignorable. No wasted text in the substantive portion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need no explanation, and the nested schema fully documents inputs. What remains for the description—auth requirement and domain constraint—is covered, leaving only failure modes unstated for a destructive create.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The top-level `body` param carries no description (reported coverage 0%), but the nested body schema documents each field extensively (name, domain, owner_id, account_stage_id, typed_custom_fields), so the schema itself carries parameter semantics. The description contributes only the domain-uniqueness constraint, adding marginal value beyond the schema; baseline 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a new account') in the first sentence, and the singular 'an account' distinguishes it from post_apollo_accounts_bulk_create and from patch_apollo_accounts_account_id. An agent can place it correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description supplies prerequisites ('Requires a master API key') and a hard constraint ('Duplicate domains are not allowed'), which implies the create use case, but it never names an alternative such as bulk create or the patch endpoint, nor states when not to call it. Usage is implied rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_accounts_bulk_createBulk Create AccountsB
Destructive
Inspect

Bulk create accounts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the write/safety profile is covered. The description adds two genuinely useful non-schema facts — the master API key requirement and per-request pricing — but says nothing about partial-failure behavior, duplicate handling, or the all-or-nothing nature of a batch mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two front-loaded sentences carry the core action and the auth prerequisite with no wasted prose. The embedded pricing marker block is boilerplate noise but is clearly delineated and does not bury the substance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. Still missing for a destructive batch mutation: the 100-item limit, whether validation failures abort the whole batch, and what a duplicate match returns — all of which the agent needs before invoking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description mentions no parameters at all; its only structured reference is the word "bulk". Reported schema description coverage is 0% at the top level, and the highest-leverage parameter semantics (run_dedupe behavior, the 100-account cap, append_label_names applying to ALL accounts) live only in the nested schema, leaving the description to compensate and it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource ("Bulk create accounts"), and "bulk" implicitly distinguishes it from the singular post_apollo_accounts and from post_apollo_accounts_bulk_update. It never names those siblings explicitly, so differentiation is inferable rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only usage-relevant statement is the prerequisite "Requires a master API key". There is no guidance on when to prefer this over post_apollo_accounts (single create), bulk_update, or how to decide on dedupe behavior, and no exclusions or failure conditions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_accounts_bulk_updateBulk Update AccountsB
Destructive
Inspect

Bulk update accounts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description does add one genuinely useful non-annotation fact — the master API key requirement — but says nothing about what is overwritten, whether partial updates are possible, or the semantics of async processing beyond what the schema states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The authored content is two short, front-loaded sentences with no filler. The injected aisa-pricing block adds length but is machine-appended boilerplate rather than authorial verbosity, so it is only a minor deduction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover the destructive/idempotency profile. What is missing for a nested-object mutation is the two-mode usage model and any guidance on selecting between uniform and per-account updates, which an agent cannot infer from the wrapper schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is reported at 0% for the single top-level 'body' parameter, so the description carries the burden and does not meet it. It never explains the critical account_ids vs account_attributes duality, the async constraint, or the per-account versus uniform-update distinction that determines how the call must be shaped.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (bulk update accounts) and the 'bulk' qualifier correctly scopes it against the single-record sibling patch_apollo_accounts_account_id. It does not, however, explicitly name or distinguish itself from post_apollo_accounts_bulk_create, post_apollo_accounts_update_owners, or post_apollo_contacts_bulk_update, which share the same bulk-mutation pattern.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is 'Requires a master API key.' There is no statement of when to use this versus the single-record PATCH, the bulk_create, or the update_owners/update_stages variants, and no mention that two mutually exclusive update modes exist inside the body.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_accounts_searchSearch for AccountsB
Read-onlyIdempotent
Inspect

Search for accounts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so safety is covered. The description adds two genuinely non-annotated traits: the master API key auth requirement and a per-request cost ($0.012 per successful request), which an agent weighing cost/credentials needs. It stops short of 5 because it says nothing about result volume or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, purpose front-loaded, no filler. The embedded pricing comment block is boilerplate but is at least clearly delimited and does not obscure the purpose line.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the nested schema covers all filters and pagination. Against that real complexity (seven filter/sort parameters on a nested body), the description is thin: it never summarizes that this is a filtered/paginated list search or how it relates to the parallel contact and mixed-company search endpoints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description contributes zero parameter meaning, and the top-level 'body' parameter has no description (0% coverage by the stated metric), so per the rubric the description should compensate but does not. In practice the nested body properties are documented thoroughly with examples and enum semantics, which keeps this at the baseline 3 rather than lower.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a clear verb+resource ('Search for accounts'), which an agent can distinguish from the sibling create/patch account tools and from get_apollo_accounts_id. However, it offers no differentiation against the other search endpoints (post_apollo_contacts_search, post_apollo_mixed_companies_search), so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is a prerequisite ('Requires a master API key'), which is auth information rather than a when-to-use statement. Nothing tells the agent when to prefer this over get_apollo_accounts_id, post_apollo_mixed_companies_search, or the create/patch siblings, and there are no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_accounts_update_ownersUpdate Account Owner for Multiple AccountsB
Destructive
Inspect

Update account owner for multiple accounts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
owner_idYesNew owner ID
account_idsYesAccount IDs

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds genuinely new context beyond the structured fields: it requires a master API key, an auth escalation the agent would not otherwise know about. It stops short of saying whether existing owners are replaced or how partial failures are handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional content is two tightly written sentences, front-loaded with the action and followed by the prerequisite. The injected pricing block consumes more words than the actual description, though it is machine-generated boilerplate rather than authorial bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the master API key requirement is a useful addition. However, for a destructive, non-idempotent bulk mutation, the description gives no indication of overwrite semantics or partial-success behavior, leaving a meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with only two self-documenting parameters (owner_id, account_ids), so the schema carries the load. The description adds no syntax, format, or cardinality guidance beyond what the schema already states, making 3 the correct baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (update account owner) and adds the scope qualifier 'for multiple accounts', which distinguishes it from the single-record sibling patch_apollo_accounts_account_id. It does not, however, contrast itself against the other near-identical bulk siblings such as post_apollo_accounts_bulk_update or post_apollo_contacts_update_owners.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no named alternatives, and no exclusions. The 'multiple accounts' phrasing only weakly implies this is the batch variant; an agent must infer from the name which of several bulk-account tools applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_contactsCreate a ContactB
Destructive
Inspect

Create a new contact. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the master API key authentication requirement, which is genuine value beyond the annotations. It does not, however, warn that creating without dedupe can produce duplicates -- that risk is only disclosed inside the run_dedupe property description in the schema, not here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The prose is a single front-loaded sentence followed by the auth prerequisite -- no wasted words. The trailing pricing HTML comment block is boilerplate noise that adds length without helping an agent invoke the tool, which keeps this from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not owed. Still, for a destructive, non-idempotent write tool the description omits the duplicate-creation caveat and any pointer to the bulk or update alternatives, leaving behavioral context thinner than the tool's complexity warrants.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description contributes no parameter information at all; the wrapper 'body' parameter is undocumented in the description. The reported 0% coverage is largely an artifact of only counting top-level parameters, since the 17 nested properties carry rich descriptions and examples (notably run_dedupe). Net effect: the schema does all the work and the description adds nothing, so a middle score is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a new contact.' An agent immediately knows this creates one contact record. However, it does nothing to distinguish itself from close siblings such as post_apollo_contacts_bulk_create (creating many) or patch_apollo_contacts_contact_id (updating an existing one), so the agent must infer the distinction from the names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is the prerequisite 'Requires a master API key,' which is useful but not a usage condition. There is no statement of when to use this tool versus bulk_create, the search endpoints, or patch for updates. No alternatives or exclusions are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_contacts_bulk_createBulk Create ContactsB
Destructive
Inspect

Bulk create contacts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds a genuinely useful non-annotation fact - the master API key requirement - but is silent on the 100-contact cap, dedupe/merge semantics, and partial-failure behavior for a destructive bulk write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two functional sentences, front-loaded with the purpose, with no wasted prose. The injected pricing comment block consumes structure without helping tool selection, which is the only blemish on an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and annotations cover the destructive/idempotency profile. Still missing for a destructive batch mutation are the max batch size, what happens on duplicate matches, and whether validation failures are partial or atomic.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% at the parameter level, so the description would normally need to compensate, and it says nothing about the body. The nested schema is nevertheless exhaustive - every contact field, owner_id, run_dedupe, and append_label_names carry their own descriptions - so effective semantics are already available. Baseline 3 reflects a description that adds nothing over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Bulk create contacts'), and the 'bulk' qualifier cleanly separates it from the single-record sibling post_apollo_contacts. It never names that alternative, so the agent must still infer the boundary, which keeps this from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use bulk create versus post_apollo_contacts, post_apollo_contacts_bulk_update, or the dedupe-aware path. The one prerequisite given ('Requires a master API key') is an auth condition rather than selection guidance, so the agent gets no routing help beyond the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_contacts_bulk_updateBulk Update ContactsB
Destructive
Inspect

Bulk update contacts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is covered externally. The description adds a genuinely useful auth requirement ('Requires a master API key') that annotations omit, but it says nothing about overwrite semantics, whether omitted fields are preserved, or the >100-contact async threshold.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional sentence is short and front-loaded with the verb and resource. The injected pricing block adds length but is a mandated boilerplate element rather than authorial bloat, so the core text earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive bulk mutation with a deeply nested, two-mode request body, the description is bare. The output schema removes the need to document return values and the annotations carry the safety profile, but routing between the bulk and single-contact siblings and clarifying the two mutually exclusive update modes are still missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema coverage is 0% (the single 'body' wrapper is undocumented), but its nested properties are exhaustively described with examples, so the schema does most of the heavy lifting. The description contributes nothing about the anyOf union — that contact_ids applies identical values to many contacts while contact_attributes applies individual updates — which is the key semantic an agent needs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

'Bulk update contacts' names a specific verb and resource, and the word 'bulk' implicitly separates it from the single-record sibling patch_apollo_contacts_contact_id. It does not, however, explicitly name an alternative or contrast itself with post_apollo_contacts_bulk_create, so an agent must infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only conditional statement is 'Requires a master API key', which is a prerequisite rather than usage guidance. Nothing says when to prefer this over patch_apollo_contacts_contact_id, post_apollo_contacts_bulk_create, or post_apollo_contacts_update_owners, nor when to choose uniform updates vs per-contact updates.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_contacts_searchSearch for ContactsC
Read-onlyIdempotent
Inspect

Search for contacts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds two genuinely useful non-schema facts, the master API key requirement and the per-request price, but says nothing about result volume, rate limits, or account scoping. Given annotations carry most of the burden, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core content is two tight sentences with the purpose front-loaded. The pricing block is injected boilerplate rather than authored prose, but it is fenced and does not bury the actual intent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the annotations cover the safety profile. What is still missing is routing against the numerous sibling search tools and any hint about the nested body structure, which for a nested-object, open-world search endpoint leaves meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is reported at 0% for the top-level required parameter 'body', and the description says nothing at all about how to shape the body. Although the nested properties carry their own descriptions in the schema, the description contributes zero additional meaning about pagination, keyword search, sorting, or label/stage filters, so it fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a clear verb and resource ('Search for contacts'), so the basic purpose is legible. However, it gives no differentiation from the many sibling contact/search tools (e.g. get_apollo_contacts_contact_id, post_apollo_mixed_people_api_search), leaving the agent to guess which is appropriate. This lands at the minimum-viable level rather than a specific, distinguishing statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Only 'Requires a master API key' is offered, which is a prerequisite rather than guidance on when to use this tool versus alternatives. Nothing tells the agent when this search is preferred over the mixed-people or bulk-match siblings, and there are no exclusions or context cues.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_contacts_update_ownersUpdate Contact Owner for Multiple ContactsB
Destructive
Inspect

Update contact owner for multiple contacts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
owner_idYesNew owner ID
contact_idsYesContact IDs

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds a real behavioral fact in the master API key requirement, but it never explains the destructive effect itself — that existing owner assignments are overwritten — which is the key unknown for an agent calling a destructive bulk mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional sentence and the auth requirement are front-loaded in two short sentences with no redundancy. The injected pricing block is mandated boilerplate rather than authorial waste, but it does dilute the signal slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety and an output schema covering the response, the definition is broadly serviceable. It is still thin for a destructive bulk mutation: no guidance on partial failure, batch limits, or what happens to the previous owner.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters carry descriptions, so the schema fully documents owner_id and contact_ids. The description contributes no additional parameter meaning (no ID format, no batch size ceiling, no behavior for invalid IDs), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: reassigning a contact owner across multiple contacts, which implicitly separates it from the single-record patch_apollo_contacts_contact_id and from post_apollo_contacts_update_stages. It does not explicitly name those siblings, so differentiation is inferred from the 'multiple contacts' scope rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The prerequisite 'Requires a master API key' is a genuine usage constraint that helps an agent decide whether the call is even possible. However, there is no indication of when to prefer this bulk tool over the single-contact patch, nor any exclusion or limit guidance for the contact_ids set.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_contacts_update_stagesUpdate Contact Stage for Multiple ContactsB
Destructive
Inspect

Update contact stage for multiple contacts. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
contact_idsYesContact IDs
contact_stage_idYesNew contact stage ID

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the risk profile is covered structurally. The description adds one genuinely useful behavior beyond them — the master API key requirement — but says nothing about reversibility, what happens to existing stage assignments, or partial-failure behavior on a batch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core sentence is front-loaded and wastes no words. The appended pricing block is templated boilerplate that does not aid tool selection, but it is clearly delimited and does not obscure the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the annotations carry the safety profile, so the description is close to sufficient. It still omits the one thing an agent would want for a destructive batch mutation: whether the change is reversible and how many contacts can be submitted per call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters are required, so contact_ids and contact_stage_id are already documented in the schema. The description adds no format, cardinality, or batching-limit detail beyond what the schema states, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource plainly: 'Update contact stage for multiple contacts', which is unambiguous and clearly a bulk stage mutation. It does not, however, distinguish itself from adjacent siblings such as post_apollo_contacts_bulk_update or patch_apollo_contacts_contact_id, so the agent must infer the difference from the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Other than the requirement of a master API key, there is no when-to-use guidance, no exclusions, and no routing to alternatives like the single-contact patch or the generic bulk update. 'For multiple contacts' implies the batch case but stops short of telling the agent when this tool is the right pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_emailer_campaigns_add_contact_idsAdd Contacts to a SequenceB
Destructive
Inspect

Add contacts to a sequence. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
contact_idsNoContact IDs to add. Provide either contact_ids[] or label_names[] (or both).
label_namesNoLabel names for contacts to add. Provide either label_names[] or contact_ids[] (or both).
sequence_idYesSequence (emailer campaign) ID.
sequence_no_emailNoAllow contacts without email.
emailer_campaign_idYesSequence ID (same as sequence_id).
sequence_job_changeNoAllow contacts with job change.
sequence_unverified_emailNoAllow contacts with unverified email.
send_email_from_email_addressNoOptional from-address alias.
send_email_from_email_account_idYesEmail account ID (or IDs) to send from.
sequence_active_in_other_campaignsNoAllow contacts active in other sequences.
sequence_finished_in_other_campaignsNoAllow contacts finished in other sequences.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the mutation/safety profile is covered structurally. The description adds the auth requirement (master API key) and pricing, which is real context, but it never explains the consequence of the destructive hint (e.g., contacts entering an outbound sequence) that the annotations imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional sentence is front-loaded and waste-free, and the auth requirement follows immediately. The embedded pricing comment block is boilerplate noise but is clearly demarcated and does not obscure the core instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full output schema and 100% parameter coverage, return values and inputs are covered, so the remaining burden is behavioral. For a destructive 11-parameter mutation the description is minimally adequate: it names the auth requirement but omits consequences, conflict conditions with the remove/stop sibling, and how the several 'allow contacts with...' flags interact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all 11 parameters including contact_ids/label_names alternation are documented in the schema itself. The description adds nothing about parameter semantics, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Add contacts to a sequence'), which an agent can map directly to the operation. It does not, however, differentiate itself from the closely named sibling post_apollo_emailer_campaigns_remove_or_stop_contact_ids or explain the contact/label ambiguity that the schema raises.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no conditions distinguishing adding from removing/stopping contacts, and no note on prerequisites beyond 'Requires a master API key.' The agent is left to infer when this tool is the correct choice vs. siblings like the remove/stop variant or sequence approve/abort.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_emailer_campaigns_remove_or_stop_contact_idsUpdate Contact Status in a SequenceC
Destructive
Inspect

Update contact status in a sequence. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
modeYesOne of: mark_as_finished, remove, stop.
contact_idsYesContact IDs.
emailer_campaign_idsYesSequence IDs.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the genuinely useful auth constraint (master API key), but is silent on the behavioral consequences of each mode — removing vs stopping vs marking finished — for a bulk destructive operation, which is exactly the context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operative text is two short sentences and the auth constraint comes early. The injected pricing block is platform boilerplate rather than the author's prose, so it only marginally dilutes an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, but for a destructive bulk mutation with three semantically distinct modes the description leaves the mode effects, scope of impact, and failure behavior entirely unexplained. The definition is too thin for the operation's risk level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (mode, contact_ids, emailer_campaign_ids) are documented in the schema. The description adds no semantics beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Update contact status in a sequence" is essentially a restatement of the title with a different arrangement of the same words. It does not clarify that the tool removes/stops/marks contacts in one or more sequences, nor does it distinguish it from the sibling post_apollo_emailer_campaigns_add_contact_ids. Only the tool name carries the real distinguishing information.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is a prerequisite ("Requires a master API key"); there is no statement of when to prefer this tool over add_contact_ids, nor which of the three modes to choose for a given outcome. The agent must infer the entire decision from the schema's mode list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_emailer_campaigns_searchSearch for SequencesA
Read-onlyIdempotent
Inspect

Search for sequences (emailer campaigns) in your Apollo account. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
pageNoPage number.
q_nameNoKeywords to match sequence names.
per_pageNoResults per page.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower; the description adds a genuinely useful non-annotation detail, the master-API-key authentication requirement. It still does not describe pagination behaviour or result limits, which the annotations do not cover either.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two front-loaded sentences with zero filler; purpose comes first, then the auth prerequisite. The injected pricing block is boilerplate noise relative to tool selection but does not bury the operative information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, full parameter coverage in the schema, and annotations carrying the safety profile, the description needs only purpose and prerequisites, both of which it supplies. A note on paging across the page/per_page pair is the only obvious missing piece.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for all three parameters (page, q_name, per_page), so the schema already carries the semantics. The description adds no syntax, defaults, or guidance about paging or keyword matching, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (sequences / emailer campaigns), and resolves the naming ambiguity created by the 'post_' prefix by making clear this is a read-style lookup. It does not name a sibling to differentiate from, though the parenthetical alias quietly separates it from get_apollo_emailer_messages_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"In your Apollo account" plus "Requires a master API key" gives the prerequisite and a general context, but there is no explicit when-to-use guidance or named alternative for searching messages rather than sequences. The agent must infer the boundary from the resource name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_emailer_campaigns_sequence_id_abortDeactivate a SequenceB
Destructive
Inspect

Deactivate a sequence. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
sequence_idYesSequence ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds the master-API-key authentication requirement, which is real value beyond the annotations, but says nothing about what deactivation actually does to in-flight sequences, enrolled contacts, or how abort differs from archive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The substantive content is two short front-loaded sentences with no padding around the action. The injected pricing block is boilerplate that consumes space without aiding tool selection, keeping it below a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations carrying the safety profile, the description only owes the agent the action and its prerequisites, both of which are present. It falls short of complete because the distinction between deactivating, archiving, and stopping (remove_or_stop_contact_ids) is left for the agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single sequence_id parameter, so the baseline is 3. The description adds no format, sourcing, or semantics for the ID beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Deactivate") and resource ("a sequence"), so the action itself is unambiguous. It does not, however, distinguish itself from the close siblings post_apollo_emailer_campaigns_sequence_id_archive or ..._approve, which an agent reads as adjacent lifecycle operations on the same sequence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no when-not-to-use, and no routing to alternatives such as archive vs abort vs approve. The only actionable instruction is the credential prerequisite ("Requires a master API key"), which is a gate rather than usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_emailer_campaigns_sequence_id_approveActivate a SequenceB
Destructive
Inspect

Activate a sequence. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
sequence_idYesSequence ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered externally. The description's one real addition is 'Requires a master API key' — a genuine auth prerequisite not in the annotations. It says nothing about reversibility or what activation does to in-flight contacts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The functional content is two tight sentences with the auth caveat front-loaded alongside the action. The pricing boilerplate is non-behavioral but is clearly delimited as a comment block.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations carry the destructive/idempotency profile. What is missing is guidance on irreversible activation, which matters for a destructive, non-idempotent mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single parameter, so the baseline is 3. The description adds no format or sourcing detail for sequence_id beyond the schema's 'Sequence ID.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Activate a sequence'), which is much clearer than the name's opaque 'approve' segment. However, it does not differentiate from close siblings like _abort and _archive, so an agent must infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives no when-to-use guidance and names no alternatives, despite siblings _abort and _archive being obvious confusable options for an emailer campaign sequence. The agent gets no routing help.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_emailer_campaigns_sequence_id_archiveArchive a SequenceA
Destructive
Inspect

Archive a sequence (marks it inactive and finishes contacts). Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
sequence_idYesSequence ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real value beyond them: what archiving does to the sequence and its contacts, the master-key auth requirement, and per-request cost. It does not cover reversibility or timing, but given the annotation coverage this is a strong disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operative content is two tight sentences, front-loaded with the action and its effect. The pricing block is boilerplate but is short, clearly delimited, and carries genuine cost information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive single-parameter call with an output schema, the description covers the effect, auth requirement, and cost, so an agent has enough to invoke it correctly. It stops short of stating whether the change is reversible or how in-flight sends are handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (sequence_id) and schema description coverage is 100%, so the schema already carries the parameter meaning. The description adds nothing about the identifier beyond what is structured, which is the expected baseline here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Archive') and resource ('a sequence'), plus a clarifying gloss of what archiving does ('marks it inactive and finishes contacts'). That effect does implicitly distinguish it from the abort sibling, but no sibling is named, so it falls short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an important prerequisite ('Requires a master API key') and describes the outcome, which implies when this is appropriate. However, it never states when to choose archive over the closely related abort or approve endpoints, leaving the agent to infer the distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_fieldsGet a List of Fields + Create a Custom FieldD
Destructive
Inspect

Get a list of fields. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

D1.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, but the description says only "Get a list of fields," implying a read. This contradicts the annotations and hides the destructive write nature. The only useful extra is the master API key requirement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The two real sentences are terse, but a large auto-generated pricing block occupies much of the text and conveys nothing about tool selection or behavior. The minimal information present is also front-loaded around the wrong (read) action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists (so return values need not be described), the definition is incomplete for a destructive write tool: it never states it creates a custom field, never covers the required body parameters, and its stated action conflicts with the annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% at the top level and the description mentions no parameters at all. It adds nothing about the nested body fields (type, label, modality, meta) that drive field creation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description only says "Get a list of fields," but the tool name (post_), the title ("Get a List of Fields + Create a Custom Field"), and the body schema with type/label/modality all indicate the primary action is creating a custom field. The description omits the create function entirely and is therefore partial/misleading about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not, or alternative guidance is given. Siblings get_apollo_fields and get_apollo_typed_custom_fields appear to be the pure read routes, yet the description does not distinguish this mutating tool from them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_mixed_companies_searchOrganization SearchA
Read-onlyIdempotent
Inspect

Find companies matching criteria: name, domain, headcount, industry, location, funding stage and technologies in use. Returns organizations and accounts side by side — organizations are Apollo's global database, accounts are records that already exist in this Apollo workspace — plus pagination and breadcrumbs echoing the filters that were applied. Use it to build a target list. When you already know the domain, get_apollo_organizations_enrich answers directly and costs less.

Usage-based billing; Default request estimate: $0.01975 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
pageNoThe page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4
per_pageNoThe number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10
organization_idsNoThe Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, identify the values for organization_id when you call this endpoint. Example: 5e66b6381e05b4008c8331b8
revenue_range_maxNoSearch for organizations based on their revenue. Use this parameter to set the upper range of organization revenue. Use the revenue_range[min] parameter to set the lower range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 50000000
revenue_range_minNoSearch for organizations based on their revenue. Use this parameter to set the lower range of organization revenue. Use the revenue_range[max] parameter to set the upper range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 300000
q_organization_nameNoFilter search results to include a specific company name. If the value you enter for this parameter does not match with a company's name, the company will not appear in search results, even if it matches other parameters. Partial matches are accepted. For example, if you filter by the value marketing, a company called NY Marketing Unlimited would still be eligible as a search result, but NY Market Analysis would not be eligible. Example: apollo or mining
organization_locationsNoThe location of the company headquarters. You can search across cities, US states, and countries. If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, any Boston-based companies will not appearch in your search results, even if they match other parameters.. To exclude companies based on location, use the organization_not_locations parameter. Examples: texas; tokyo; spain
total_funding_range_maxNoThe maximum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[min] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000
total_funding_range_minNoThe minimum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[max] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000
q_organization_job_titlesNoThe job titles that are listed in active job postings at the company. Examples: sales manager; research analyst
organization_job_locationsNoThe locations of the jobs being actively recruited by the company. Examples: atlanta; japan
organization_not_locationsNoExclude companies from search results based on the location of the company headquarters. You can use cities, US states, and countries as locations to exclude. This parameter is useful for ensuring you do not prospect in an undesirable territory. For example, if you use ireland as a value, no Ireland-based companies will appear in your search results. Examples: minnesota; ireland; seoul
q_organization_domains_listNoThe domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. This parameter accepts up to 1,000 domains in a single request. Examples: apollo.io; microsoft.com
q_organization_keyword_tagsNoFilter search results based on keywords associated with companies. For example, you can enter mining as a value to return only companies that have an association with the mining industry. Examples: mining; sales strategy; consulting
latest_funding_date_range_maxNoThe latest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[min] to set a date range for when the company received its most recent funding round. Example: 2025-09-25
latest_funding_date_range_minNoThe earliest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[max] to set a date range for when the company received its most recent funding round. Example: 2025-07-25
latest_funding_amount_range_maxNoThe maximium amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[min] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000
latest_funding_amount_range_minNoThe minimum amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[max] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000
organization_num_jobs_range_maxNoThe maximum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500
organization_num_jobs_range_minNoThe minimum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500
organization_num_employees_rangesNoThe number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results. Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma. Examples: 1,10; 250,500; 10000,20000
organization_job_posted_at_range_maxNoThe latest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25
organization_job_posted_at_range_minNoThe earliest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25
currently_using_any_of_technology_uidsNoFind organizations based on the technologies they currently use. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower. The description adds genuine value beyond them: the dual organizations/accounts return shape, the echoed pagination/breadcrumbs, and a cost signal ($0.01975 estimated request). It stops short of noting rate limits or result caps, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with purpose, then output shape, then the routing decision. The appended pricing block is boilerplate but is genuine cost information, and nothing else is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter, zero-required, open-world search with 100% schema coverage and an output schema, the description supplies everything an agent needs: what it searches, what comes back, and when to prefer the cheaper alternative. No critical invocation detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 24 parameters, making 3 the baseline. The description names broad filter categories (headcount, funding stage, technologies) that map onto schema properties but adds no syntax or format detail the schema does not already provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Find companies matching criteria') and enumerates the filterable dimensions (name, domain, headcount, industry, location, funding stage, technologies). It also distinguishes the result sets (organizations = Apollo global DB, accounts = existing workspace records), so an agent can tell it apart from sibling enrich tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('Use it to build a target list') and an explicit alternative with a selection condition and cost rationale ('When you already know the domain, get_apollo_organizations_enrich answers directly and costs less'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_mixed_people_api_searchPeople API SearchA
Read-onlyIdempotent
Inspect

Use the People API Search endpoint to find net new people in the Apollo database. Several filters are available to help narrow your search. This endpoint is optimized for API usage and does not consume credits. This endpoint is primarily designed for prospecting net new people. This endpoint does not return email addresses or phone numbers. Use the People Enrichment or Bulk People Enrichment endpoints to enrich data. This endpoint requires a master API key. Refer to Create API Keys to learn how to create a master API key. To protect Apollo's performance for all users, this endpoint has a display limit of 50,000 records (100 records per page, up to 500 pages). Add more filters to narrow your search results as much as possible. This limitation does not restrict your access to Apollo's database; you just need to access the data in batches.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
pageNoThe page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4
per_pageNoThe number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10
q_keywordsNoA string of words over which we want to filter the results.
person_titlesNoJob titles held by the people you want to find. For a person to be included in search results, they only need to match 1 of the job titles you add. Adding more job titles expands your search results. Results also include job titles with the same terms, even if they are not exact matches. For example, searching for marketing manager might return people with the job title content marketing manager. Use this parameter in combination with the person_seniorities[] parameter to find people based on specific job functions and seniority levels. Examples: sales development representative; marketing manager; research analyst
organization_idsNoThe Apollo IDs for the companies (employers) you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, call the Organization Search endpoint and identify the values for organization_id. Example: 5e66b6381e05b4008c8331b8
person_locationsNoThe location where people live. You can search across cities, US states, and countries. To find people based on the headquarters locations of their current employer, use the organization_locations parameter. Examples: california; ireland; chicago
revenue_range_maxNoThe maximum revenue the person's current employer generates. Use this parameter in combination with revenue_range[min] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000
revenue_range_minNoThe minimum revenue the person's current employer generates. Use this parameter in combination with revenue_range[max] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000
person_senioritiesNoThe job seniority that people hold within their current employer. This enables you to find people that currently hold positions at certain reporting levels, such as Director level or senior IC level. For a person to be included in search results, they only need to match 1 of the seniorities you add. Adding more seniorities expands your search results. Searches only return results based on their current job title, so searching for Director-level employees only returns people that currently hold a Director-level title. If someone was previously a Director, but is currently a VP, they would not be included in your search results. Use this parameter in combination with the person_titles[] parameter to find people based on specific job functions and seniority levels. The following options can be used for this parameter: owner founder c_suite partner vp head director manager senior entry intern
contact_email_statusNoThe email statuses for the people you want to find. You can add multiple statuses to expand your search. The statuses you can search include: verified unverified likely to engage unavailable
include_similar_titlesNoThis parameter determines whether people with job titles similar to the titles you define in the person_titles[] parameter are returned in the response. Set this parameter to false when using person_titles[] to return only strict matches for job titles.
organization_locationsNoThe location of the company headquarters for a person's current employer. You can search across cities, US states, and countries. If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, people that work for the Boston-based company will not appear in your results, even if they match other parameters. To find people based on their personal location, use the person_locations parameter. Examples: texas; tokyo; spain
q_organization_job_titlesNoThe job titles that are listed in active job postings at the person's current employer. Examples: sales manager; research analyst
organization_job_locationsNoThe locations of the jobs being actively recruited by the person's employer. Examples: atlanta; japan
q_organization_domains_listNoThe domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. This parameter accepts up to 1,000 domains in a single request. Examples: apollo.io; microsoft.com
organization_num_jobs_range_maxNoThe maximum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500
organization_num_jobs_range_minNoThe minimum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500
organization_num_employees_rangesNoThe number range of employees working for the person's current company. This enables you to find people based on the headcount of their employer. You can add multiple ranges to expand your search results. Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma. Examples: 1,10; 250,500; 10000,20000
organization_job_posted_at_range_maxNoThe latest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25
organization_job_posted_at_range_minNoThe earliest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25
currently_using_all_of_technology_uidsNoFind people based on all of the technologies their current employer uses. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org
currently_using_any_of_technology_uidsNoFind people based on any of the technologies their current employer uses. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org
currently_not_using_any_of_technology_uidsNoExclude people from your search based on any of the technologies their current employer uses. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/open-world, and the description adds substantial non-obvious behavior: no credit consumption, master API key requirement, a 50,000-record display limit (100/page, 500 pages), and guidance to narrow with filters. This is exactly the extra context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and key exclusions are front-loaded, but there is mild redundancy from the repeated 'This endpoint...' construction across consecutive sentences. It is appropriately sized for a 23-parameter tool, just slightly repetitive.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full annotation coverage, the description still supplies everything an agent needs to call it correctly: auth requirement, credit behavior, pagination ceiling, and enrichment alternatives. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across 23 parameters, so the schema already documents each filter in depth. The description adds no per-parameter syntax or pairing guidance beyond the pagination limit note, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('find net new people in the Apollo database') and explicitly contrasts the tool with People Enrichment / Bulk People Enrichment, so an agent can distinguish it from siblings like post_apollo_people_match without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the primary use case (prospecting net new people), the explicit exclusion ('does not return email addresses or phone numbers'), and names the alternative endpoints to use for enrichment. This is an explicit when/when-not/alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_news_articles_searchNews Articles SearchA
Read-onlyIdempotent
Inspect

News coverage for specific companies. organization_ids[] is required — omitting it returns HTTP 422 with "organization_ids is required", so resolve the companies first with get_apollo_organizations_enrich or post_apollo_mixed_companies_search. Narrow further with categories[] (funding, hires, launches and similar), published_at[min], published_at[max], and page with page and per_page. Returns news_articles and pagination. Use it to catch a trigger event before reaching out.

Usage-based billing; Default request estimate: $0.01975 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
pageNoThe page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4
per_pageNoThe number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10
categoriesNoFilter your search to include only certain categories or sub-categories of news. Use the News search filter for companies within Apollo to uncover all possible categories and sub-categories. Examples: hires; investment; contract
organization_idsYesThe Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, call the Organization Search endpoint and identify the values for organization_id. Example: 5e66b6381e05b4008c8331b8
published_at_maxNoSet the upper bound of the date range you want to search. Use this parameter in combination with the published_at[min] parameter. This date should fall after the published_at[min] date. The date should be formatted as YYYY-MM-DD. Example: 2025-05-15
published_at_minNoSet the lower bound of the date range you want to search. Use this parameter in combination with the published_at[max] parameter. This date should fall before the published_at[max] date. The date should be formatted as YYYY-MM-DD. Example: 2025-02-15

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower. The description adds real behavioral context beyond them: the exact failure mode (HTTP 422 with 'organization_ids is required') when the required param is omitted, and the response shape (news_articles, pagination). No auth, rate-limit, or cost caveats beyond the injected pricing block.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense, front-loaded, and every sentence carries a distinct instruction: required param, how to resolve it, available filters, return fields, and use case. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be explained, and the annotations cover the safety profile. Given the description covers the required parameter, its error behavior, the prerequisite chain, filter options, and a use case, an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning on top: it flags organization_ids as required and explains why (and how to obtain values), and gives category examples (funding, hires, launches) plus the date-range and paging parameters as a coherent filtering story. Some overlap with schema text, but the required-param rationale is genuine added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("News coverage for specific companies") and immediately distinguishes itself from siblings by naming the prerequisite tools (get_apollo_organizations_enrich, post_apollo_mixed_companies_search) rather than describing itself in isolation. An agent can identify the tool's domain without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite (resolve organization_ids first, with two named alternatives) and a concrete motivating use case ("catch a trigger event before reaching out"). It stops short of stating when NOT to use this tool versus other news/social sources in the sibling list, so it is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_opportunitiesCreate DealB
Destructive
Inspect

Create a deal (opportunity). Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false and openWorldHint=true, so the mutation profile is covered. The description adds the auth requirement (master API key), which annotations do not convey, but says nothing about creation side effects, duplicate handling, or required related entities.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the key precondition, with no wasted prose. The injected pricing comment block is boilerplate noise rather than description content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation tool with a required nested body object and no annotation-level detail about creation semantics; an output schema exists so return values need not be explained. The description covers only the action and auth, leaving the agent to infer prerequisite IDs and creation behavior entirely from the nested schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema description coverage is 0% (the single 'body' parameter is undescribed), and the description contributes no parameter meaning at all. The nested body properties are in fact richly documented in the schema, which limits the damage, but the description itself does nothing to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Create a deal (opportunity)') and usefully disambiguates the API's 'opportunity' terminology as a 'deal'. It does not differentiate itself from siblings like patch_apollo_opportunities or get_apollo_opportunities_search, but the create action is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is an authentication prerequisite ('Requires a master API key'), which is a precondition rather than a when-to-use rule. There is no mention of when to create a deal versus updating one, or of what pre-existing entities (stage, account, owner) must be resolved first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_organizations_bulk_enrichBulk Organization EnrichmentA
Read-onlyIdempotent
Inspect

Enrich up to 10 companies in one call. Body takes domains, an array of bare domains. Returns the enriched organizations alongside status, total_requested_domains, unique_domains, unique_records and unique_enriched_records — compare the requested and enriched counts rather than assuming every domain resolved. For one domain get_apollo_organizations_enrich is a plain GET.

Usage-based billing; Default request estimate: $0.1975 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
domainsYesThe domain of each company that you want to enrich. Do not include www., the @ symbol, or similar. Example: apollo.io and microsoft.com

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the 10-company cap and the warning that not every domain may resolve, advising the caller to compare requested vs enriched counts rather than assume success.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and cap, then the parameter, then the return caveat, then the sibling pointer. Well ordered and mostly waste-free, though the appended pricing boilerplate inflates length relative to the actionable content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description helpfully calls out the key response fields and, more importantly, the semantic caveat that counts may not all match. Together with the sibling routing and the 10-domain limit, an agent has everything needed to call and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the domains array, bare-domain format, and www/@ exclusion. The description reinforces the 'array of bare domains' shape but adds no syntax or format detail the schema lacks, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (enrich) and resource (organizations/companies) with scope (up to 10 in one call). Explicitly distinguishes itself from the sibling get_apollo_organizations_enrich by noting that the single-domain case is a plain GET, so an agent can choose between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear routing rule: use this for multiple domains (up to 10), use get_apollo_organizations_enrich for one domain. That covers the primary selection decision, though it doesn't state exclusions such as what to do beyond 10 domains or rate-limit behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_people_bulk_matchBulk People EnrichmentA
Read-onlyIdempotent
Inspect

Enrich up to 10 people in one call. Body takes details, an array of the same identifier objects post_apollo_people_match accepts. Returns matches alongside status, total_requested_enrichments, unique_enriched_records, missing_records and credits_consumed — read missing_records rather than assuming every input matched. Costs one credit per record enriched, not per call. Use this over a loop of single calls: same credits, one round trip. For a single person post_apollo_people_match is simpler.

Usage-based billing; Default request estimate: $1.7775 USD (not a fixed price). Declared unit rate: $0 USD per provider_credit. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes
webhook_urlNoIf you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40
reveal_phone_numberNoSet to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered.
run_waterfall_emailNoSet to true to enable email waterfall enrichment
run_waterfall_phoneNoSet to true to enable phone waterfall enrichment

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/OpenWorld, so the safety profile is covered. The description adds genuinely useful behavior beyond that: credit cost is per record enriched rather than per call, and partial matches are possible so the caller should inspect missing_records rather than assume success. It stops short of rate limits or async timing, so a 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences ordered as purpose, body, return/cost, then routing. No wasted prose; the pricing block is an injected boilerplate section rather than authored description text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid, nested, non-destructive enrichment call with an output schema, the definition covers input shape, cost model, partial-failure semantics, and sibling routing. Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so a baseline of 3 applies. The description adds value by explaining that body.details is an array of the same identifier objects post_apollo_people_match accepts and is capped at 10, linking the nested schema to the sibling's contract rather than just restating field names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (bulk-enrich people), gives the hard cap (up to 10), and explicitly names the sibling it differs from (post_apollo_people_match). An agent can distinguish bulk from single enrichment without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit routing rule: use this over a loop of single calls for the same credits and one round trip, and fall back to post_apollo_people_match for a single person. Both the when-to-use and the when-to-use-something-else conditions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_people_matchPeople EnrichmentA
Read-onlyIdempotent
Inspect

Enrich one person: give whatever identifiers you have and get back Apollo's full record for them. Send identifiers in the JSON request body, not the query string. Accepts email, first_name plus last_name, name, domain, organization_name, linkedin_url or hashed_email — the more you supply, the likelier the match. Returns a person object with id, name, title, headline, linkedin_url, twitter_url, github_url, photo_url, organization_id and an employment_history array, plus a request_id. Personal emails and phone numbers are withheld unless reveal_personal_emails (body) or reveal_phone_number (query) is set, and those cost extra credits. A 200 does not guarantee a match — check whether person actually came back. Use post_apollo_people_bulk_match for up to 10 people in one call; use post_apollo_mixed_people_api_search when you do not have an identifier and need to find candidates first.

Published reference price: $0.01975 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYesIdentify one person. Give at least one identifier; the more you supply, the likelier the match.
webhook_urlNoIf you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40
reveal_phone_numberNoSet to true if you want to enrich the person's data with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the person's phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered.
run_waterfall_emailNoSet to true to enable email waterfall enrichment
run_waterfall_phoneNoSet to true to enable phone waterfall enrichment

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), but the description adds material behavior beyond them: personal emails/phone numbers are withheld by default, revealing them costs extra credits, and a 200 response does not guarantee a match. That last caveat is exactly the kind of non-obvious trait an agent needs. It stops short of noting the async webhook requirement for phone reveals or any rate limiting, so it is not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is long, but front-loaded with the core action and then packed with distinct facts (identifiers, placement, return shape, cost, non-match caveat, alternatives) with no filler sentences. The return-field enumeration is arguably redundant given the output schema, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need no explanation, yet the description still sketches the person object and note fields for orientation. Combined with identifier options, payload placement, cost implications, and sibling alternatives, an agent has everything needed to invoke this correctly on the first attempt.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and every body field is already documented with examples. The description still adds semantic value the schema does not: the identifier list is presented as a preference-ordered set ('the more you supply, the likelier the match'), and it flags that reveal_personal_emails lives in the body while reveal_phone_number is a query parameter — a distinction that is easy to get wrong from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Enrich one person', and immediately bounds scope ('one person' vs bulk). It explicitly names the sibling tools it is not (post_apollo_people_bulk_match, post_apollo_mixed_people_api_search), so an agent can discriminate among the Apollo people tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing rules: use bulk match for up to 10 people in one call, and use mixed_people_api_search when no identifier exists and candidates must be found first. It also states the entry condition (supply whatever identifiers you have, more is better) and the payload-placement rule (body, not query string).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_phone_callsCreate Call RecordsB
Destructive
Inspect

Create call records. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
loggedNoWhether to create an individual record.
statusNoCall status.
user_idNoCaller user IDs.
durationNoDuration in seconds.
end_timeNoISO 8601 end time.
to_numberNoDialed phone number.
account_idNoAccount ID.
contact_idNoContact ID.
start_timeNoISO 8601 start time.
from_numberNoCaller phone number.
phone_call_outcome_idNoOutcome ID.
phone_call_purpose_idNoPurpose ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=false), and the description usefully adds the master-API-key auth requirement and a per-request price. However, it does not disclose side effects, retry/non-idempotency implications, or how duplicate calls are handled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and auth prerequisite are front-loaded in a single tight sentence, and the pricing note is clearly delimited boilerplate. Slightly padded by the pricing comment block but no wasted prose in the functional content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and annotations cover mutation risk. Still, for a 12-parameter mutation tool with zero required fields, the description gives no indication of which fields matter, minimum viable payload, or batching behaviour.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 12 parameters, so the schema already carries the field semantics. The description adds no parameter-level meaning (e.g., the relationship between logged, status, and the ID fields), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb plus resource: 'Create call records.' An agent can distinguish this from get_apollo_phone_calls_search (read) and put_apollo_phone_calls_id (update) by the naming pattern, but the description never explicitly differentiates itself from those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is an authentication prerequisite ('Requires a master API key'). There is no statement of when to use this tool versus the search/get/update phone-call siblings, nor any when-not condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_reports_sync_reportQuery Analytics ReportC
Read-onlyIdempotent
Inspect

Query analytics report. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds one genuinely useful fact not present in structured data — the master API key requirement — plus pricing, but says nothing about result volume, limits, or rate behavior beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the auth requirement; nothing is wasted. The boilerplate pricing block is injected rather than authored, but it is clearly delimited.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a high-complexity tool with a deeply nested required body and a documented output schema, yet the description never mentions the reference-document dependency for valid metric/dimension names, the one-entry limits on group_by/date_ranges, or the custom_range interaction with filters. An agent would have to reverse-engineer all of that from the schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single top-level parameter (body) carries no description, but the nested schema is unusually thorough, documenting metrics, filters, group_by, pivot_group_by, date_ranges, sorts and their constraints. The description adds nothing about any parameter, so it neither compensates for the coverage gap nor contributes value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description says it queries an analytics report, which is a recognizable verb+resource, but it is essentially a restatement of the title and adds no scope detail (e.g. what kind of report, sync vs async). It does not distinguish this tool from siblings such as post_apollo_usage_stats_api_usage_stats or the various search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Requires a master API key" is a prerequisite, not usage guidance. There is no statement of when to use this tool versus the other reporting/search endpoints, and no exclusions or alternatives are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_tasksCreate a TaskB
Destructive
Inspect

Create a task. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the write/safety profile is covered. The description adds the master-API-key auth requirement, which is genuinely beyond the annotations, but says nothing about side effects (e.g. notifying the assigned user), error behavior on invalid user_id/contact_id, or why a create is flagged destructive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The two substantive sentences are front-loaded with the action verb and contain no filler. The trailing aisa-pricing block is injected boilerplate and does not dilute the definition. Brevity is appropriate, though it comes at the cost of the gaps noted elsewhere rather than from trimming genuine value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. What remains missing for a mutation tool with a nested required body object is the wrapper-structure explanation, side effects on the assigned user, and any guidance on single vs. bulk creation. Adequate but clearly incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%: the single top-level parameter 'body' has no description, and the tool description says nothing about parameters. It never explains that all task fields (user_id, contact_id, type, status, due_at, note, title, priority) must be nested inside a body object, which is the one non-obvious structural fact an agent needs. The nested property descriptions are rich, but that is the schema doing the work, not the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a task.' Combined with the title 'Create a Task' this is unambiguous about what the tool does. It does not, however, distinguish itself from the sibling post_apollo_tasks_bulk_create or explain how it relates to post_apollo_tasks_search, so sibling differentiation is left to the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Requires a master API key' gives one concrete prerequisite, which is more than most descriptions offer. There is no guidance on when to choose this over post_apollo_tasks_bulk_create, no note that this creates exactly one task, and no statement of when not to use it, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_tasks_bulk_createBulk Create TasksB
Destructive
Inspect

Bulk create tasks. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false, openWorldHint=true and readOnlyHint=false, so the mutation/write nature is covered without the description. The description adds the master-key auth requirement, which is useful non-schema context. It says nothing about batch-size limits, partial-failure behavior, or reversibility of created tasks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with purpose then requirement, with no author-supplied padding. The trailing pricing comment is injected boilerplate rather than authored content, so it is not heavily penalized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation and annotations cover the safety profile. What remains missing for a bulk mutation tool is whether the batch is atomic, any cap on contact_ids, and the auth scope consequence if the master key is absent — the description stops at naming the requirement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Measured schema description coverage is 0% at the parameter level (the sole top-level 'body' object is undocumented), and the description supplies no parameter information at all, so it fails to compensate. The nested properties do carry rich inline descriptions (examples, ISO 8601 format, enum values), which keeps this from being a 1, but the description itself contributes nothing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Bulk create tasks'), and the 'Bulk' qualifier implicitly separates it from the single-create sibling post_apollo_tasks. It does not name any sibling explicitly, so it lands at clear-but-not-differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The prerequisite 'Requires a master API key' is a genuine usage condition, which is more than most. However, there is no guidance on when to prefer this over post_apollo_tasks or post_apollo_tasks_search, so the when-to-use dimension is only implied by the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_tasks_searchSearch for TasksA
Read-onlyIdempotent
Inspect

Search tasks. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
pageNoPage number.
per_pageNoResults per page.
sort_by_fieldNoSort field.
open_factor_namesNoOptional open factors.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered structurally; the description contributes a genuinely non-annotation detail (master API key required) plus cost-per-request. It does not mention pagination limits or result caps, which would be the next useful disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, front-loaded sentences with no filler; the capability statement comes before the auth requirement. The injected pricing comment block adds markup noise, but the prose itself is tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and 100% param coverage, the description needn't explain return values, and it correctly flags the auth prerequisite. The remaining gap is that a search tool with no obvious query parameter is not clarified, which could confuse an agent about what the tool actually filters on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the four parameters are already documented and the baseline of 3 applies. The description adds no meaning beyond the schema, and notably does not explain what is searched on when no query/filter parameter exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb+resource ('Search tasks'), which correctly identifies the read/search counterpart to the write siblings post_apollo_tasks and post_apollo_tasks_bulk_create. It does not, however, name any sibling or differentiate itself from the other Apollo search endpoints (contacts/accounts/opportunities), so it stops short of full sibling routing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is a prerequisite ('Requires a master API key'); there is no when-to-use, when-not-to-use, or named alternative. Given a large family of *_search siblings, an agent gets nothing to decide between them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

post_apollo_usage_stats_api_usage_statsView API Usage Stats and Rate LimitsA
Read-onlyIdempotent
Inspect

View API usage stats and rate limits. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety is covered. The description contributes beyond them by disclosing the master-API-key authorization prerequisite, a constraint an agent cannot infer from structured fields. It stops short of describing response scope or any rate-limit context of its own.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded single sentence plus a short auth note, both earning their place. The appended aisa-pricing boilerplate is not authored description content and adds noise, but the core text is tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero parameters, an output schema present (so return values need no explanation), and annotations covering the safety profile, the description carries the remaining informational burden adequately by stating the auth requirement. Slightly more context about what stats are returned would be ideal but is not required given the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the documented baseline of 4. There is nothing parameter-wise for the description to compensate for, and schema coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource: view API usage stats and rate limits. This is the only usage/rate-limit tool among the Apollo siblings, so it is distinguishable by resource even though no sibling is named. Clear, though it lacks explicit contrast with lookalike read tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use (checking usage and rate limits) is implied by the resource name, and the prerequisite 'Requires a master API key' is stated. However, there is no explicit when-to-use trigger and no named alternative or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

put_apollo_phone_calls_idUpdate Call RecordsC
Destructive
Inspect

Update call records. Requires a master API key.

Published reference price: $0.012 USD per successful request. Account-specific pricing and final settlement may differ.

NameRequiredDescriptionDefault
idYesCall record ID.
loggedNoWhether to create an individual record.
statusNoCall status.
user_idNoCaller user IDs.
durationNoDuration in seconds.
end_timeNoISO 8601 end time.
to_numberNoDialed phone number.
account_idNoAccount ID.
contact_idNoContact ID.
start_timeNoISO 8601 start time.
from_numberNoCaller phone number.
phone_call_outcome_idNoOutcome ID.
phone_call_purpose_idNoPurpose ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the safety profile is covered. The description contributes one genuinely non-redundant fact — the master API key requirement — but says nothing about what the destructive update replaces, whether omitted fields are cleared or preserved, or PUT replace-vs-merge semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The prose is two short, front-loaded sentences with no filler. The injected pricing HTML comment block is noise, but the authored content itself is tight and not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and all parameters are documented in the schema. However, for a 13-parameter destructive mutation with destructiveHint=true and idempotentHint=false, the description omits partial-vs-full update semantics and any effect of the call, leaving the definition only minimally viable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 13 parameters, so the schema already carries the semantics and the baseline of 3 applies. The description adds no parameter-level meaning (e.g., that only the required id is needed and the rest are optional fields to change), leaving it purely a restatement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Update call records"), which is marginally more informative than the name alone, but it adds no detail beyond the title "Update Call Records" and does not distinguish this mutation endpoint from siblings such as post_apollo_phone_calls or get_apollo_phone_calls_search. It is clear but generic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of alternatives (e.g., post_apollo_phone_calls for creation), and no exclusions. "Requires a master API key" is a prerequisite, not usage guidance, so the agent gets no routing help.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

useRun an AIsa operationC
Destructive
Inspect

deprecated, use batch_use instead

NameRequiredDescriptionDefault
argumentsNoArguments matching input_schema / arguments_schema
search_idNosearch_id from the search that found this operation
operation_idYesoperation_id as returned by search
max_price_usdNoRefuse the call before any spend if its quoted price is above this many USD

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the agent knows this is a state-changing, open-world operation. The description adds only the deprecation status and says nothing about what gets mutated, spend behavior (despite a max_price_usd param), or authorization needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single clause with zero waste; the deprecation notice and the replacement are front-loaded. It is terse by design for a deprecated endpoint, though it is under-specified rather than optimally efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Has an output schema and annotations, which reduces the burden, but a 4-parameter operation tool with a deprecation notice gives no information about what it executes or whether it remains functional. For an agent deciding between this and batch_use, the description is thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters (operation_id, arguments, search_id, max_price_usd) are already documented in the schema. The description adds no parameter meaning on top, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description never states what the tool does — no verb or resource. It only labels the tool as deprecated and points to a replacement, leaving the actual capability ('Run an AIsa operation' from the title) unexplained. An agent must infer the purpose from the title and schema alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent to the alternative ('use batch_use instead'), which is exactly the guidance needed for a deprecated tool. It doesn't explain when, if ever, this tool should still be called (e.g., during a migration window), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 27 tool updates
    • Addedaccount
    • Removedget_details
    • Changedpatch_apollo_accounts_account_id10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / account_stage_id
        Removed value: -{
        -  "description": "Account stage ID",
        -  "type": "string"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "account_stage_id": {
        +      "description": "The Apollo ID for the account stage to which you want to assign the account. Enter a different ID to update the account stage. <br><br>Call the <a href=\"https://docs.apollo.io/reference/list-account-stages\" target=\"_blank\">list account stages endpoint</a> to retrieve a list of all the account stage IDs available in your Apollo account. <br><br>If you do not specify the account stage, Apollo automatically assigns the account to a stage as determined by your team's Apollo account. To change the order of account stages, launch the Apollo product and go to <b>Settings</b> > <b>Objects</b> > <a href=\"https://app.apollo.io/#/settings/accounts/stages\" target=\"_blank\"><b>Accounts</b></a>. Then, access the <b>Triggers</b> tab and change the stage for when an account is created. <br><br>Example: `61b8e913e0f4d2012e3af74e`",
        +      "type": "string"
        +    },
        +    "domain": {
        +      "description": "Update the domain name for the account. Do not include `www.` or similar. <br><br>Example: `apollo.io` or `microsoft.com`",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Update the account's name. This should be a human-readable name. <br><br>Example: `The Fast Irish Copywriters`",
        +      "type": "string"
        +    },
        +    "owner_id": {
        +      "description": "The ID for the account owner within your team's Apollo account. Enter a different ID to update the owner of the account. <br><br>Use the <a href=\"https://docs.apollo.io/reference/get-a-list-of-users\" target=\"_blank\">get a list of users endpoint</a> to retrieve IDs for all of the users within your Apollo account. <br><br>Example: `66302798d03b9601c7934ebf`",
        +      "type": "string"
        +    },
        +    "phone": {
        +      "description": "Update the primary phone number for the account. <br><br>This can be the phone number for the corporate headquarters, a branch location, or a direct dial to the primary point of contact for the account. <br><br>Apollo sanitizes phone numbers, so you can enter them in any format. The sanitized number can be viewed in the endpoint response. <br><br>Examples: `555-555-0133`; `+44 7700 900852`",
        +      "type": "string"
        +    },
        +    "raw_address": {
        +      "description": "Update the corporate location for the account. This can include a city, US state, and country. <br><br>Apollo matches the location you provide to the most applicable pre-defined location. <br><br>Examples: `Belfield, Dublin 4, Ireland`; `Dallas, United States`",
        +      "type": "string"
        +    },
        +    "typed_custom_fields": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Add information to <a href=\"https://knowledge.apollo.io/hc/en-us/articles/4412498754445-Create-Custom-Account-Fields\" target=\"_blank\">custom fields</a> in Apollo. <br><br><b>Your custom fields are unique to your team's Apollo account. This means that the examples in this documentation may not work for your testing purposes.</b> <br><br>To utilize this parameter successfully, call the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint and identify the `id` value for the custom field, as well as the appropriate data type. For example, if a custom field accepts picklist entries, you need to pass the accompanying `id` value for the picklist entry that you want to use as the input value. <br><br><b>Example</b>: When the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint returns an `id` of field: \n * `\"60c39ed82bd02f01154c470a\"` (datetime) \n \n\n then the value passed should be: \n\n `{\"60c39ed82bd02f01154c470a\": \"2025-08-07\"}`",
        +      "example": {
        +        "60c39ed82bd02f01154c470a": "2025-08-07"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / domain
        Removed value: -{
        -  "description": "Account domain",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Account name",
        -  "type": "string"
        -}
      • removedInput schema / properties / owner_id
        Removed value: -{
        -  "description": "Owner ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / phone
        Removed value: -{
        -  "description": "Phone number",
        -  "type": "string"
        -}
      • removedInput schema / properties / raw_address
        Removed value: -{
        -  "description": "Raw address",
        -  "type": "string"
        -}
      • removedInput schema / properties / typed_custom_fields
        Removed value: -{
        -  "description": "Typed custom fields object",
        -  "type": "object"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "account_id"
        -]New value: +[
        +  "account_id",
        +  "body"
        +]
    • Changedpatch_apollo_contacts_contact_id19 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / account_id
        Removed value: -{
        -  "description": "Account ID",
        -  "type": "string"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "account_id": {
        +      "description": "Update the account ID. Example: `63f53afe4ceeca00016bdd2f`",
        +      "type": "string"
        +    },
        +    "contact_stage_id": {
        +      "description": "Update the contact stage ID. Example: `6095a710bd01d100a506d4af`",
        +      "type": "string"
        +    },
        +    "corporate_phone": {
        +      "description": "Work/office phone.",
        +      "type": "string"
        +    },
        +    "direct_phone": {
        +      "description": "Primary phone.",
        +      "type": "string"
        +    },
        +    "email": {
        +      "description": "Update the contact email. Example: `example@email.com`",
        +      "type": "string"
        +    },
        +    "first_name": {
        +      "description": "Update the contact's first name. Example: `Tim`",
        +      "type": "string"
        +    },
        +    "home_phone": {
        +      "description": "Home phone.",
        +      "type": "string"
        +    },
        +    "label_names": {
        +      "description": "Replace lists this contact belongs to. (Passing new values will overwrite existing lists.)",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "last_name": {
        +      "description": "Update the contact's last name. Example: `Zheng`",
        +      "type": "string"
        +    },
        +    "mobile_phone": {
        +      "description": "Mobile phone.",
        +      "type": "string"
        +    },
        +    "organization_name": {
        +      "description": "Update the employer (company) name. Example: `apollo`",
        +      "type": "string"
        +    },
        +    "other_phone": {
        +      "description": "Alternate phone.",
        +      "type": "string"
        +    },
        +    "present_raw_address": {
        +      "description": "Update location (city/state/country). Example: `Atlanta, United States`",
        +      "type": "string"
        +    },
        +    "title": {
        +      "description": "Update the job title. Example: `senior research analyst`",
        +      "type": "string"
        +    },
        +    "typed_custom_fields": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Add information to <a href=\"https://knowledge.apollo.io/hc/en-us/articles/4412498825869-Create-Custom-Contact-Fields\" target=\"_blank\">custom fields</a> in Apollo. <br><br><b>Your custom fields are unique to your team's Apollo account. This means that the examples in this documentation may not work for your testing purposes.</b> <br><br>To utilize this parameter successfully, call the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint and identify the `id` value for the custom field, as well as the appropriate data type. For example, if a custom field accepts picklist entries, you need to pass the accompanying `id` value for the picklist entry that you want to use as the input value. <br><br><b>Example</b>: When the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint returns an `id` of field: \n * `\"60c39ed82bd02f01154c470a\"` (datetime) \n \n\n then the value passed should be: \n\n `{\"60c39ed82bd02f01154c470a\": \"2025-08-07\"}`",
        +      "example": {
        +        "60c39ed82bd02f01154c470a": "2025-08-07"
        +      },
        +      "type": "object"
        +    },
        +    "website_url": {
        +      "description": "Update the employer website URL. Example: `https://www.apollo.io/`",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / contact_stage_id
        Removed value: -{
        -  "description": "Contact stage ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / corporate_phone
        Removed value: -{
        -  "description": "Corporate phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / direct_phone
        Removed value: -{
        -  "description": "Direct phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / email
        Removed value: -{
        -  "description": "Email",
        -  "type": "string"
        -}
      • removedInput schema / properties / first_name
        Removed value: -{
        -  "description": "First name",
        -  "type": "string"
        -}
      • removedInput schema / properties / home_phone
        Removed value: -{
        -  "description": "Home phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / label_names
        Removed value: -{
        -  "description": "Labels to set on the contact",
        -  "type": "string"
        -}
      • removedInput schema / properties / last_name
        Removed value: -{
        -  "description": "Last name",
        -  "type": "string"
        -}
      • removedInput schema / properties / mobile_phone
        Removed value: -{
        -  "description": "Mobile phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / organization_name
        Removed value: -{
        -  "description": "Organization name",
        -  "type": "string"
        -}
      • removedInput schema / properties / other_phone
        Removed value: -{
        -  "description": "Other phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / present_raw_address
        Removed value: -{
        -  "description": "Raw address",
        -  "type": "string"
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Title",
        -  "type": "string"
        -}
      • removedInput schema / properties / typed_custom_fields
        Removed value: -{
        -  "description": "Typed custom fields object",
        -  "type": "object"
        -}
      • removedInput schema / properties / website_url
        Removed value: -{
        -  "description": "Website URL",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "contact_id"
        -]New value: +[
        +  "contact_id",
        +  "body"
        +]
    • Changedpatch_apollo_opportunities_opportunity_id9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / amount
        Removed value: -{
        -  "description": "Amount",
        -  "type": "number"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "amount": {
        +      "description": "The monetary value of the deal. Enter a different value to update the deal amount. <br><br>Do not enter commas or currency symbols for the value. The currency is automatically populated by the settings within your Apollo account. Commas are not accepted and result in the deal amount being left blank. <br><br>Example: `55123478` (results in a deal value of `$55,123,478` if the default currency is USD)",
        +      "type": "string"
        +    },
        +    "closed_date": {
        +      "description": "Update the estimated close date for the deal. This can be a future or past date. <br><br>The date should be formatted as `YYYY-MM-DD`. <br><br>Example: `2025-10-30`",
        +      "format": "date",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Update the name of the deal. This should be a human-readable name. <br><br>Example: `Massive Q3 Deal`",
        +      "type": "string"
        +    },
        +    "opportunity_stage_id": {
        +      "description": "The ID for the deal stage within your team's Apollo account. Enter a different ID to update the deal stage. <br><br>Each deal stage is assigned a unique ID. To find deal stage IDs, call the <a href=\"https://docs.apollo.io/reference/list-deal-stages\" target=\"_blank\">list deal stages endpoint</a> and identify the value for `id` for each stage. <br><br>Example: `6095a710bd01d100a506d4bd`",
        +      "type": "string"
        +    },
        +    "owner_id": {
        +      "description": "The ID for the deal owner within your team's Apollo account. Enter a different ID to update the owner of the deal. <br><br>Use the <a href=\"https://docs.apollo.io/reference/get-a-list-of-users\" target=\"_blank\">get a list of users endpoint</a> to retrieve IDs for all of the users within your Apollo account. <br><br>Example: `66302798d03b9601c7934ebf`",
        +      "type": "string"
        +    },
        +    "typed_custom_fields": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Add information to <a href=\"https://knowledge.apollo.io/hc/en-us/articles/4415062486669-Create-a-Deal\" target=\"_blank\">custom fields</a> in Apollo. <br><br><b>Your custom fields are unique to your team's Apollo account. This means that the examples in this documentation may not work for your testing purposes.</b> <br><br>To utilize this parameter successfully, call the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint and identify the `id` value for the custom field, as well as the appropriate data type. For example, if a custom field accepts picklist entries, you need to pass the accompanying `id` value for the picklist entry that you want to use as the input value. <br><br><b>Example</b>: When the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint returns an `id` of field: \n * `\"60c39ed82bd02f01154c470a\"` (datetime) \n \n\n then the value passed should be: \n\n `{\"60c39ed82bd02f01154c470a\": \"2025-08-07\"}`",
        +      "example": {
        +        "60c39ed82bd02f01154c470a": "2025-08-07"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / closed_date
        Removed value: -{
        -  "description": "Closed date (date string)",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Opportunity name",
        -  "type": "string"
        -}
      • removedInput schema / properties / opportunity_stage_id
        Removed value: -{
        -  "description": "Stage ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / owner_id
        Removed value: -{
        -  "description": "Owner ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / typed_custom_fields
        Removed value: -{
        -  "description": "Typed custom fields object",
        -  "type": "object"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "opportunity_id"
        -]New value: +[
        +  "opportunity_id",
        +  "body"
        +]
    • Changedpost_apollo_accounts7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / account_stage_id
        Removed value: -{
        -  "description": "Account stage ID",
        -  "type": "string"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "account_stage_id": {
        +      "description": "The Apollo ID for the account stage to which you want to assign the account. Call the <a href=\"https://docs.apollo.io/reference/list-account-stages\" target=\"_blank\">list account stages endpoint</a> to retrieve a list of all the account stage IDs available in your Apollo account. <br><br>If you do not specify the account stage, Apollo automatically assigns the account to a stage as determined by your team's Apollo account. To change the order of account stages, launch the Apollo product and go to <b>Settings</b> > <b>Objects</b> > <a href=\"https://app.apollo.io/#/settings/accounts/stages\" target=\"_blank\"><b>Accounts</b></a>. Then, access the <b>Triggers</b> tab and change the stage for when an account is created.<br><br>Example: `6095a710bd01d100a506d4b9`",
        +      "type": "string"
        +    },
        +    "domain": {
        +      "description": "The domain name for the account. <br><br>Do not include `www.` or similar. <br><br>Example: `apollo.io` or `microsoft.com`",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Name the account that you are creating. This should be a human-readable name. <br><br>Example: `The Irish Copywriters`",
        +      "type": "string"
        +    },
        +    "owner_id": {
        +      "description": "The ID for the account owner within your team's Apollo account. <br><br>Use the <a href=\"https://docs.apollo.io/reference/get-a-list-of-users\" target=\"_blank\">get a list of users endpoint</a> to retrieve IDs for all of the users within your Apollo account. <br><br>Example: `66302798d03b9601c7934ebf`",
        +      "type": "string"
        +    },
        +    "phone": {
        +      "description": "The primary phone number for the account. <br><br>This can be the phone number for the corporate headquarters, a branch location, or a direct dial to the primary point of contact for the account. <br><br>Apollo sanitizes phone numbers, so you can enter them in any format. The sanitized number can be viewed in the endpoint response. <br><br>Examples: `555-555-0133`; `+44 7700 900852`",
        +      "type": "string"
        +    },
        +    "raw_address": {
        +      "description": "The corporate location for the account. This can include a city, US state, and country. <br><br>Apollo matches the location you provide to the most applicable pre-defined location. <br><br>Examples: `Belfield, Dublin 4, Ireland`; `Dallas, United States`",
        +      "type": "string"
        +    },
        +    "typed_custom_fields": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Add information to <a href=\"https://knowledge.apollo.io/hc/en-us/articles/4412498754445-Create-Custom-Account-Fields\" target=\"_blank\">custom fields</a> in Apollo. <br><br><b>Your custom fields are unique to your team's Apollo account. This means that the examples in this documentation may not work for your testing purposes.</b> <br><br>To utilize this parameter successfully, call the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint and identify the `id` value for the custom field, as well as the appropriate data type. For example, if a custom field accepts picklist entries, you need to pass the accompanying `id` value for the picklist entry that you want to use as the input value. <br><br><b>Example</b>: When the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint returns an `id` of field: \n * `\"60c39ed82bd02f01154c470a\"` (datetime) \n \n\n then the value passed should be: \n\n `{\"60c39ed82bd02f01154c470a\": \"2025-08-07\"}`",
        +      "example": {
        +        "60c39ed82bd02f01154c470a": "2025-08-07"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / domain
        Removed value: -{
        -  "description": "Account domain",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Account name",
        -  "type": "string"
        -}
      • removedInput schema / properties / owner_id
        Removed value: -{
        -  "description": "Owner ID",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "domain"
        -]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_accounts_bulk_create6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / accounts
        Removed value: -{
        -  "description": "Array of accounts to create",
        -  "type": "string"
        -}
      • removedInput schema / properties / append_label_names
        Removed value: -{
        -  "description": "Label names to append to each created account",
        -  "type": "string"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "accounts": {
        +      "description": "Array of account attribute objects (maximum 100 accounts per request)",
        +      "items": {
        +        "properties": {
        +          "account_stage_id": {
        +            "description": "Account stage/pipeline stage ID (BSON::ObjectId format)",
        +            "example": "507f1f77bcf86cd799439014",
        +            "type": "string"
        +          },
        +          "domain": {
        +            "description": "Company domain (e.g., 'example.com')",
        +            "example": "acme.com",
        +            "type": "string"
        +          },
        +          "facebook_url": {
        +            "description": "Facebook page URL",
        +            "example": "https://facebook.com/acme",
        +            "type": "string"
        +          },
        +          "hubspot_id": {
        +            "description": "HubSpot company ID for CRM integration",
        +            "example": "12345678",
        +            "type": "string"
        +          },
        +          "linkedin_url": {
        +            "description": "LinkedIn company page URL",
        +            "example": "https://linkedin.com/company/acme",
        +            "type": "string"
        +          },
        +          "merged_crm_ids": {
        +            "description": "Additional CRM IDs for deduplication",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "name": {
        +            "description": "Account name",
        +            "example": "Acme Corporation",
        +            "type": "string"
        +          },
        +          "organization_id": {
        +            "description": "Apollo organization ID",
        +            "example": "507f1f77bcf86cd799439012",
        +            "type": "string"
        +          },
        +          "owner_id": {
        +            "description": "Account owner user ID (BSON::ObjectId format). Defaults to current user if not provided",
        +            "example": "507f1f77bcf86cd799439013",
        +            "type": "string"
        +          },
        +          "parent_account_id": {
        +            "description": "Parent account ID for account hierarchy (BSON::ObjectId format)",
        +            "example": "507f1f77bcf86cd799439016",
        +            "type": "string"
        +          },
        +          "phone": {
        +            "description": "Company phone number",
        +            "example": "+1-555-0135",
        +            "type": "string"
        +          },
        +          "phone_status_cd": {
        +            "description": "Phone validation status",
        +            "type": "string"
        +          },
        +          "raw_address": {
        +            "description": "Company address",
        +            "example": "123 Main St, San Francisco, CA 94105",
        +            "type": "string"
        +          },
        +          "salesforce_id": {
        +            "description": "Salesforce account ID for CRM integration",
        +            "example": "001pJNj9pix2idKsfj",
        +            "type": "string"
        +          },
        +          "twitter_url": {
        +            "description": "Twitter profile URL",
        +            "example": "https://twitter.com/acme",
        +            "type": "string"
        +          },
        +          "typed_custom_fields": {
        +            "additionalProperties": {
        +              "type": "string"
        +            },
        +            "description": "Custom field values as key-value pairs where key is the field_id and value is the field_value",
        +            "example": {
        +              "507f1f77bcf86cd799439020": "High Value",
        +              "507f1f77bcf86cd799439021": "Q4 2025"
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "maxItems": 100,
        +      "type": "array"
        +    },
        +    "append_label_names": {
        +      "description": "Array of label names to add to ALL accounts in this request",
        +      "example": [
        +        "Enterprise",
        +        "High Priority"
        +      ],
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "run_dedupe": {
        +      "default": false,
        +      "description": "Enable aggressive deduplication by domain, organization_id, and name. When false (default), only matches by CRM IDs. When true, also matches by domain, organization_id, and name. Existing accounts are returned without modification in both modes",
        +      "example": true,
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "accounts"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / run_dedupe
        Removed value: -{
        -  "description": "Enable deduplication. Default false.",
        -  "type": "boolean"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "accounts"
        -]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_accounts_bulk_update6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / account_attributes
        Removed value: -{
        -  "items": {
        -    "properties": {
        -      "account_stage_id": {
        -        "description": "Account stage ID",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "Account name",
        -        "type": "string"
        -      },
        -      "owner_id": {
        -        "description": "Owner ID",
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / account_ids
        Removed value: -{
        -  "description": "IDs of accounts to update",
        -  "type": "string"
        -}
      • removedInput schema / properties / async
        Removed value: -{
        -  "description": "Run asynchronously. Default false.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "account_attributes": {
        +      "description": "Array of account objects with individual updates. Use this for applying different updates to each account.",
        +      "items": {
        +        "properties": {
        +          "account_stage_id": {
        +            "description": "The Apollo account stage ID",
        +            "example": "6095a710bd01d100a506d4b7",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "The account ID to update",
        +            "example": "66e9abf95ac32901b20d1a0d",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "The account name",
        +            "example": "Acme Corporation",
        +            "type": "string"
        +          },
        +          "owner_id": {
        +            "description": "The Apollo user ID to assign as owner",
        +            "example": "66302798d03b9601c7934ebf",
        +            "type": "string"
        +          },
        +          "typed_custom_fields": {
        +            "additionalProperties": {
        +              "type": "string"
        +            },
        +            "description": "Custom field values as key-value pairs",
        +            "example": {
        +              "60c39ed82bd02f01154c470a": "2025-08-07"
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "account_ids": {
        +      "description": "Array of account IDs to update with the same values. Use this for applying the same updates to multiple accounts.",
        +      "example": [
        +        "66e9abf95ac32901b20d1a0d",
        +        "66e9a4db056fe802d331fb8a"
        +      ],
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "account_stage_id": {
        +      "description": "When using account_ids, apply this account stage to all accounts",
        +      "example": "6095a710bd01d100a506d4b7",
        +      "type": "string"
        +    },
        +    "async": {
        +      "description": "Set to true to process updates asynchronously. Only available when using account_ids. Not supported with account_attributes.",
        +      "example": false,
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "description": "When using account_ids, apply this name to all accounts",
        +      "example": "Updated Account Name",
        +      "type": "string"
        +    },
        +    "owner_id": {
        +      "description": "When using account_ids, apply this owner to all accounts",
        +      "example": "66302798d03b9601c7934ebf",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "account_ids",
        -  "account_attributes"
        -]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_accounts_search10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / account_label_ids
        Removed value: -{
        -  "description": "Filter by account label IDs",
        -  "type": "string"
        -}
      • removedInput schema / properties / account_stage_ids
        Removed value: -{
        -  "description": "Filter by account stage IDs",
        -  "type": "string"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "account_label_ids": {
        +      "description": "The Apollo IDs for the labels that you want to include in your search results. If you add multiple labels, Apollo will include all accounts connected to any of the labels, along with the other parameters, in the search results. Example: `['6095a710bd01d100a506d4ae']`",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "account_stage_ids": {
        +      "description": "The Apollo IDs for the account stages that you want to include in your search results. If you add multiple account stages, Apollo will include all accounts that match any of the stages, along with the other parameters, in the search results. Call the [list account stages endpoint](https://docs.apollo.io/reference/list-account-stages) to retrieve a list of all the account stage IDs available in your Apollo account. Example: `61b8e913e0f4d2012e3af74e`",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "page": {
        +      "description": "The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the `per_page` parameter to make search results navigable and improve the performance of the endpoint. Example: `4`",
        +      "format": "int32",
        +      "type": "integer"
        +    },
        +    "per_page": {
        +      "description": "The number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the `page` parameter to navigate through the different pages of data. Example: `10`",
        +      "format": "int32",
        +      "type": "integer"
        +    },
        +    "q_organization_name": {
        +      "description": "Add keywords to narrow the search of the accounts in your team's Apollo account. Keywords should directly match at least part of an account's name. For example, searching the keyword `marketing` might return the result `NY Marketing Unlimited`, but not `NY Market Analysts`. This parameter only searches account names, not other account fields. Examples: `apollo`; `microsoft`; `marketing`",
        +      "type": "string"
        +    },
        +    "sort_ascending": {
        +      "default": false,
        +      "description": "Set to `true` to sort the matching accounts in ascending order. This parameter must be used with `sort_by_field`. Otherwise, the sorting logic is not applied. Example: `true`",
        +      "type": "boolean"
        +    },
        +    "sort_by_field": {
        +      "description": "Sort the matching accounts by 1 of the following options:\n- `account_last_activity_date`: The most recent activity date recorded first.\n- `account_created_at`: The most recently created first.\n- `account_updated_at`: The most recently updated first.",
        +      "enum": [
        +        "account_last_activity_date",
        +        "account_created_at",
        +        "account_updated_at"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / page
        Removed value: -{
        -  "description": "Page number",
        -  "type": "integer"
        -}
      • removedInput schema / properties / per_page
        Removed value: -{
        -  "description": "Items per page",
        -  "type": "integer"
        -}
      • removedInput schema / properties / q_organization_name
        Removed value: -{
        -  "description": "Organization name query",
        -  "type": "string"
        -}
      • removedInput schema / properties / sort_ascending
        Removed value: -{
        -  "description": "Sort ascending",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / sort_by_field
        Removed value: -{
        -  "description": "Sort field (e.g. account_last_activity_date, account_created_at, account_updated_at)",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_accounts_update_owners3 fields changed
      • addedInput schema / properties / account_ids / description
        Added value: +"Account IDs"
      • removedInput schema / properties / account_ids / items / description
        Removed value: -"Account IDs"
      • changedInput schema / required
        Previous value: -[
        -  "owner_id",
        -  "account_ids"
        -]New value: +[
        +  "account_ids",
        +  "owner_id"
        +]
    • Changedpost_apollo_contacts20 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / account_id
        Removed value: -{
        -  "description": "Account ID",
        -  "type": "string"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "account_id": {
        +      "description": "The Apollo ID for the account. Example: `63f53afe4ceeca00016bdd2f`",
        +      "type": "string"
        +    },
        +    "contact_stage_id": {
        +      "description": "The Apollo ID for the contact stage. Example: `6095a710bd01d100a506d4ae`",
        +      "type": "string"
        +    },
        +    "corporate_phone": {
        +      "description": "The work/office phone number. Example: `+44 7700 900852`",
        +      "type": "string"
        +    },
        +    "direct_phone": {
        +      "description": "The primary phone number. Example: `555-555-0133`",
        +      "type": "string"
        +    },
        +    "email": {
        +      "description": "The email address of the contact. Example: `example@email.com`",
        +      "type": "string"
        +    },
        +    "first_name": {
        +      "description": "The first name of the contact you want to create. Example: `Tim`",
        +      "type": "string"
        +    },
        +    "home_phone": {
        +      "description": "The home phone number. Example: `555-555-0133`",
        +      "type": "string"
        +    },
        +    "label_names": {
        +      "description": "Lists to which the contact belongs.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "last_name": {
        +      "description": "The last name of the contact you want to create. Example: `Zheng`",
        +      "type": "string"
        +    },
        +    "mobile_phone": {
        +      "description": "The mobile phone number. Example: `555-555-0133`",
        +      "type": "string"
        +    },
        +    "organization_name": {
        +      "description": "The name of the contact's employer (company). Example: `apollo`",
        +      "type": "string"
        +    },
        +    "other_phone": {
        +      "description": "Alternative phone number. Example: `555-555-0133`",
        +      "type": "string"
        +    },
        +    "present_raw_address": {
        +      "description": "The personal location for the contact. Example: `Atlanta, United States`",
        +      "type": "string"
        +    },
        +    "run_dedupe": {
        +      "default": false,
        +      "description": "Set to `true` to match against your existing contacts instead of always creating a new one. The default value is `false`. <br><br>When a match is found, Apollo **updates that existing contact in place** with the values you sent and returns it — the `id` in the response belongs to the pre-existing contact, not a new record. Fields you send overwrite the stored values, fields you omit are left untouched, and sending an empty value clears the field. <br><br>Matching is checked in order: `id`, CRM identifiers, `person_id`, `email` (against the contact's primary and additional emails), then name plus company. Because of the last rule, a contact can be matched and updated even when the email differs. <br><br>When deduplication is enabled, performance may be slightly impacted due to the additional matching checks. See the endpoint description for full details.",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "The current job title that the contact holds. Example: `senior research analyst`",
        +      "type": "string"
        +    },
        +    "typed_custom_fields": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Add information to <a href=\"https://knowledge.apollo.io/hc/en-us/articles/4412498825869-Create-Custom-Contact-Fields\" target=\"_blank\">custom fields</a> in Apollo. <br><br><b>Your custom fields are unique to your team's Apollo account. This means that the examples in this documentation may not work for your testing purposes.</b> <br><br>To utilize this parameter successfully, call the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint and identify the `id` value for the custom field, as well as the appropriate data type. For example, if a custom field accepts picklist entries, you need to pass the accompanying `id` value for the picklist entry that you want to use as the input value. <br><br><b>Example</b>: When the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint returns an `id` of field: \n * `\"60c39ed82bd02f01154c470a\"` (datetime) \n \n\n then the value passed should be: \n\n `{\"60c39ed82bd02f01154c470a\": \"2025-08-07\"}`",
        +      "example": {
        +        "60c39ed82bd02f01154c470a": "2025-08-07"
        +      },
        +      "type": "object"
        +    },
        +    "website_url": {
        +      "description": "The corporate website URL. Example: `https://www.apollo.io/`",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / contact_stage_id
        Removed value: -{
        -  "description": "Contact stage ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / corporate_phone
        Removed value: -{
        -  "description": "Corporate phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / direct_phone
        Removed value: -{
        -  "description": "Direct phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / email
        Removed value: -{
        -  "description": "Email",
        -  "type": "string"
        -}
      • removedInput schema / properties / first_name
        Removed value: -{
        -  "description": "First name",
        -  "type": "string"
        -}
      • removedInput schema / properties / home_phone
        Removed value: -{
        -  "description": "Home phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / label_names
        Removed value: -{
        -  "description": "Labels to set on the contact",
        -  "type": "string"
        -}
      • removedInput schema / properties / last_name
        Removed value: -{
        -  "description": "Last name",
        -  "type": "string"
        -}
      • removedInput schema / properties / mobile_phone
        Removed value: -{
        -  "description": "Mobile phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / organization_name
        Removed value: -{
        -  "description": "Organization name",
        -  "type": "string"
        -}
      • removedInput schema / properties / other_phone
        Removed value: -{
        -  "description": "Other phone",
        -  "type": "string"
        -}
      • removedInput schema / properties / present_raw_address
        Removed value: -{
        -  "description": "Raw address",
        -  "type": "string"
        -}
      • removedInput schema / properties / run_dedupe
        Removed value: -{
        -  "description": "Enable deduplication. Default false.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Title",
        -  "type": "string"
        -}
      • removedInput schema / properties / typed_custom_fields
        Removed value: -{
        -  "description": "Typed custom fields object",
        -  "type": "object"
        -}
      • removedInput schema / properties / website_url
        Removed value: -{
        -  "description": "Website URL",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_contacts_bulk_create6 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / append_label_names
        Removed value: -{
        -  "description": "Label names to append to each created contact",
        -  "type": "string"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "append_label_names": {
        +      "description": "Array of label names to add to ALL contacts in this request",
        +      "example": [
        +        "Hot Lead",
        +        "Q1 2024"
        +      ],
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "contacts": {
        +      "description": "Array of contact objects to create (maximum 100 contacts per request)",
        +      "items": {
        +        "properties": {
        +          "account_id": {
        +            "description": "Associated account ID",
        +            "example": "507f1f77bcf86cd799439011",
        +            "type": "string"
        +          },
        +          "contact_emails": {
        +            "description": "Array of email objects with position",
        +            "items": {
        +              "properties": {
        +                "email": {
        +                  "example": "john.doe@example.com",
        +                  "type": "string"
        +                },
        +                "position": {
        +                  "example": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "contact_stage_id": {
        +            "description": "Contact stage ID",
        +            "example": "507f1f77bcf86cd799439014",
        +            "type": "string"
        +          },
        +          "email": {
        +            "description": "Contact's email address",
        +            "example": "john.doe@example.com",
        +            "type": "string"
        +          },
        +          "facebook_url": {
        +            "description": "Facebook profile URL",
        +            "example": "https://www.facebook.com/johndoe",
        +            "type": "string"
        +          },
        +          "first_name": {
        +            "description": "Contact's first name",
        +            "example": "John",
        +            "type": "string"
        +          },
        +          "hubspot_id": {
        +            "description": "HubSpot ID for matching and deduplication",
        +            "example": "12345678",
        +            "type": "string"
        +          },
        +          "last_name": {
        +            "description": "Contact's last name",
        +            "example": "Doe",
        +            "type": "string"
        +          },
        +          "linkedin_url": {
        +            "description": "LinkedIn profile URL",
        +            "example": "https://www.linkedin.com/in/john-doe-3f9a7c21",
        +            "type": "string"
        +          },
        +          "organization_id": {
        +            "description": "Associated organization ID",
        +            "example": "507f1f77bcf86cd799439012",
        +            "type": "string"
        +          },
        +          "organization_name": {
        +            "description": "Company/organization name",
        +            "example": "Acme Corporation",
        +            "type": "string"
        +          },
        +          "outreach_id": {
        +            "description": "Outreach.io ID",
        +            "example": "98765",
        +            "type": "string"
        +          },
        +          "phone": {
        +            "description": "Phone number",
        +            "example": "+1-555-0135",
        +            "type": "string"
        +          },
        +          "phone_numbers": {
        +            "description": "Array of phone number objects",
        +            "items": {
        +              "properties": {
        +                "position": {
        +                  "example": 0,
        +                  "type": "integer"
        +                },
        +                "raw_number": {
        +                  "example": "+1-555-0135",
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "phone_status_cd": {
        +            "description": "Phone validation status",
        +            "type": "string"
        +          },
        +          "photo_url": {
        +            "description": "Profile photo URL",
        +            "example": "https://example.com/photo.jpg",
        +            "type": "string"
        +          },
        +          "present_raw_address": {
        +            "description": "Physical address",
        +            "example": "San Francisco, CA",
        +            "type": "string"
        +          },
        +          "primary_title": {
        +            "description": "Primary job title (takes precedence over title)",
        +            "example": "VP of Sales",
        +            "type": "string"
        +          },
        +          "salesforce_account_id": {
        +            "description": "Salesforce Account ID",
        +            "example": "001pJNj9pix2idKsfj",
        +            "type": "string"
        +          },
        +          "salesforce_contact_id": {
        +            "description": "Salesforce Contact ID for matching",
        +            "example": "003xx000004TmiQAAS",
        +            "type": "string"
        +          },
        +          "salesforce_id": {
        +            "description": "Salesforce ID for matching and deduplication",
        +            "example": "003xx000004TmiQAAS",
        +            "type": "string"
        +          },
        +          "salesforce_lead_id": {
        +            "description": "Salesforce Lead ID",
        +            "example": "00Qxx000001abcDEFG",
        +            "type": "string"
        +          },
        +          "salesloft_id": {
        +            "description": "SalesLoft ID",
        +            "example": "54321",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Contact's job title",
        +            "example": "Senior Manager",
        +            "type": "string"
        +          },
        +          "twitter_url": {
        +            "description": "Twitter profile URL",
        +            "example": "https://twitter.com/johndoe",
        +            "type": "string"
        +          },
        +          "typed_custom_fields": {
        +            "additionalProperties": {
        +              "type": "string"
        +            },
        +            "description": "Custom field values as key-value pairs where key is the field_id and value is the field_value",
        +            "example": {
        +              "60c39ed82bd02f01154c470a": "2025-08-07"
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "maxItems": 100,
        +      "type": "array"
        +    },
        +    "owner_id": {
        +      "description": "Owner user ID applied to all contacts in this batch. Defaults to current user if omitted. Returns 422 if the ID does not belong to the current team.",
        +      "example": "507f1f77bcf86cd799439013",
        +      "type": "string"
        +    },
        +    "run_dedupe": {
        +      "default": false,
        +      "description": "Enable full deduplication across all sources. When false (default), creates duplicates for non-email_import sources and merges with email_import placeholders only. When true, returns existing contacts in `existing_contacts` without modifying them (except email_import placeholders, which are still merged). <br><br>Matching is checked in order: `id`, CRM identifiers, `person_id`, `email` (against the contact's primary and additional emails), then name plus company (matched on email domain, `organization_id`, or `organization_name`). <br><br>Unlike <a href=\"https://docs.apollo.io/reference/create-a-contact\">create a contact</a>, this endpoint never overwrites a matched contact's fields.",
        +      "example": true,
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "contacts"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / contacts
        Removed value: -{
        -  "description": "Array of contacts to create",
        -  "type": "string"
        -}
      • removedInput schema / properties / run_dedupe
        Removed value: -{
        -  "description": "Enable deduplication. Default false.",
        -  "type": "boolean"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "contacts"
        -]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_contacts_bulk_update3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "anyOf": [
        +    {
        +      "required": [
        +        "contact_ids"
        +      ]
        +    },
        +    {
        +      "required": [
        +        "contact_attributes"
        +      ]
        +    }
        +  ],
        +  "properties": {
        +    "account_id": {
        +      "description": "When using contact_ids, apply this account ID to all contacts",
        +      "example": "63f53afe4ceeca00016bdd2f",
        +      "type": "string"
        +    },
        +    "async": {
        +      "description": "Force asynchronous processing. Automatically enabled for >100 contacts.",
        +      "example": false,
        +      "type": "boolean"
        +    },
        +    "contact_attributes": {
        +      "description": "Array of contact objects with individual updates. Use this for applying different updates to each contact.",
        +      "items": {
        +        "properties": {
        +          "account_id": {
        +            "description": "The Apollo account ID to associate with the contact",
        +            "example": "63f53afe4ceeca00016bdd2f",
        +            "type": "string"
        +          },
        +          "email": {
        +            "description": "The contact's email address",
        +            "example": "john.doe@example.com",
        +            "type": "string"
        +          },
        +          "first_name": {
        +            "description": "The contact's first name",
        +            "example": "John",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "The contact ID to update",
        +            "example": "66e34b81740c50074e3d1bd4",
        +            "type": "string"
        +          },
        +          "last_name": {
        +            "description": "The contact's last name",
        +            "example": "Doe",
        +            "type": "string"
        +          },
        +          "linkedin_url": {
        +            "description": "The contact's LinkedIn profile URL",
        +            "example": "https://www.linkedin.com/in/john-doe-3f9a7c21",
        +            "type": "string"
        +          },
        +          "organization_name": {
        +            "description": "The contact's organization name",
        +            "example": "Example Corp",
        +            "type": "string"
        +          },
        +          "owner_id": {
        +            "description": "The Apollo user ID to assign as owner",
        +            "example": "66302798d03b9601c7934ebf",
        +            "type": "string"
        +          },
        +          "present_raw_address": {
        +            "description": "The contact's location",
        +            "example": "San Francisco, CA",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "The contact's job title",
        +            "example": "Senior Manager",
        +            "type": "string"
        +          },
        +          "typed_custom_fields": {
        +            "additionalProperties": {
        +              "type": "string"
        +            },
        +            "description": "Custom field values as key-value pairs",
        +            "example": {
        +              "60c39ed82bd02f01154c470a": "2025-08-07"
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "contact_ids": {
        +      "description": "Array of contact IDs to update with the same values. Use this for applying the same updates to multiple contacts.",
        +      "example": [
        +        "66e34b81740c50074e3d1bd4",
        +        "66e370fbf5f5c003f0e1d0cf"
        +      ],
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "email": {
        +      "description": "When using contact_ids, apply this email to all contacts",
        +      "example": "updated@example.com",
        +      "type": "string"
        +    },
        +    "first_name": {
        +      "description": "When using contact_ids, apply this first name to all contacts",
        +      "example": "Updated",
        +      "type": "string"
        +    },
        +    "last_name": {
        +      "description": "When using contact_ids, apply this last name to all contacts",
        +      "example": "Name",
        +      "type": "string"
        +    },
        +    "linkedin_url": {
        +      "description": "When using contact_ids, apply this LinkedIn URL to all contacts",
        +      "example": "https://www.linkedin.com/in/updated",
        +      "type": "string"
        +    },
        +    "organization_name": {
        +      "description": "When using contact_ids, apply this organization name to all contacts",
        +      "example": "Updated Corp",
        +      "type": "string"
        +    },
        +    "owner_id": {
        +      "description": "When using contact_ids, apply this owner to all contacts",
        +      "example": "66302798d03b9601c7934ebf",
        +      "type": "string"
        +    },
        +    "present_raw_address": {
        +      "description": "When using contact_ids, apply this address to all contacts",
        +      "example": "New York, NY",
        +      "type": "string"
        +    },
        +    "title": {
        +      "description": "When using contact_ids, apply this title to all contacts",
        +      "example": "Updated Title",
        +      "type": "string"
        +    },
        +    "typed_custom_fields": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "When using contact_ids, apply these custom fields to all contacts",
        +      "example": {
        +        "60c39ed82bd02f01154c470a": "2025-08-07"
        +      },
        +      "type": "object"
        +    },
        +    "visible_entity_ids": {
        +      "description": "Specific contact IDs to return in the response (for performance)",
        +      "example": [
        +        "66e34b81740c50074e3d1bd4"
        +      ],
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_contacts_search10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "contact_label_ids": {
        +      "description": "The Apollo IDs for the labels that you want to include in your search results. If you add multiple labels, Apollo will include all contacts connected to any of the labels, along with the other parameters, in the search results. Example: `['6095a710bd01d100a506d4ae']`",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "contact_stage_ids": {
        +      "description": "The Apollo IDs for the contact stages that you want to include in your search results. If you add multiple contact stages, Apollo will include all contacts that match any of the stages, along with the other parameters, in the search results. Call the [list contact stages endpoint](https://docs.apollo.io/reference/list-contact-stages) to retrieve a list of all the contact stage IDs available in your Apollo account. Example: `6095a710bd01d100a506d4ae`",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "page": {
        +      "description": "The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the `per_page` parameter to make search results navigable and improve the performance of the endpoint. Example: `4`",
        +      "format": "int32",
        +      "type": "integer"
        +    },
        +    "per_page": {
        +      "description": "The number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the `page` parameter to search the different pages of data. Example: `10`",
        +      "format": "int32",
        +      "type": "integer"
        +    },
        +    "q_keywords": {
        +      "description": "Add a keyword search string to narrow the contacts in your team's Apollo account. Keywords should be related to the same search concept and can include names, job titles, employers or company names, or email addresses. Examples: `matthew helm`; `CEO`; `Sumware Software`",
        +      "type": "string"
        +    },
        +    "sort_ascending": {
        +      "default": false,
        +      "description": "Set to `true` to sort the matching contacts in ascending order. This parameter must be used with `sort_by_field`. Otherwise, the sorting logic is not applied. Example: `true`",
        +      "type": "boolean"
        +    },
        +    "sort_by_field": {
        +      "description": "Sort the matching contacts by 1 of the following options: \n- `contact_last_activity_date`: The most recent activity date recorded first.\n- `contact_email_last_opened_at`: The most recent email opened date first.\n- `contact_email_last_clicked_at`: The most recent email clicked first.\n- `contact_created_at`: The most recently created first.\n- `contact_updated_at`: The most recently updated first.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / contact_label_ids
        Removed value: -{
        -  "description": "Filter by contact label IDs",
        -  "type": "string"
        -}
      • removedInput schema / properties / contact_stage_ids
        Removed value: -{
        -  "description": "Filter by contact stage IDs",
        -  "type": "string"
        -}
      • removedInput schema / properties / page
        Removed value: -{
        -  "description": "Page number",
        -  "type": "integer"
        -}
      • removedInput schema / properties / per_page
        Removed value: -{
        -  "description": "Items per page",
        -  "type": "integer"
        -}
      • removedInput schema / properties / q_keywords
        Removed value: -{
        -  "description": "Keyword query",
        -  "type": "string"
        -}
      • removedInput schema / properties / sort_ascending
        Removed value: -{
        -  "description": "Sort ascending. Default false.",
        -  "type": "boolean"
        -}
      • removedInput schema / properties / sort_by_field
        Removed value: -{
        -  "description": "Sort field (e.g. contact_last_activity_date, contact_created_at, contact_updated_at)",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_contacts_update_owners3 fields changed
      • addedInput schema / properties / contact_ids / description
        Added value: +"Contact IDs"
      • removedInput schema / properties / contact_ids / items / description
        Removed value: -"Contact IDs"
      • changedInput schema / required
        Previous value: -[
        -  "owner_id",
        -  "contact_ids"
        -]New value: +[
        +  "contact_ids",
        +  "owner_id"
        +]
    • Changedpost_apollo_contacts_update_stages3 fields changed
      • addedInput schema / properties / contact_ids / description
        Added value: +"Contact IDs"
      • removedInput schema / properties / contact_ids / items / description
        Removed value: -"Contact IDs"
      • changedInput schema / required
        Previous value: -[
        -  "contact_stage_id",
        -  "contact_ids"
        -]New value: +[
        +  "contact_ids",
        +  "contact_stage_id"
        +]
    • Changedpost_apollo_emailer_campaigns_remove_or_stop_contact_ids1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "mode",
        -  "contact_ids",
        -  "emailer_campaign_ids"
        -]New value: +[
        +  "contact_ids",
        +  "emailer_campaign_ids",
        +  "mode"
        +]
    • Changedpost_apollo_fields7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "label": {
        +      "description": "Name of the custom field you want to create. Example: `Test Name`",
        +      "type": "string"
        +    },
        +    "meta": {
        +      "properties": {
        +        "max_length": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "modality": {
        +      "description": "The modality of the custom field you want to create.  Example: `contact`",
        +      "enum": [
        +        "contact",
        +        "account",
        +        "opportunity"
        +      ],
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "What kind of custom field you want to create. Example: `textarea`",
        +      "enum": [
        +        "string",
        +        "textarea",
        +        "number",
        +        "date",
        +        "datetime",
        +        "boolean"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedInput schema / properties / label
        Removed value: -{
        -  "description": "Field label.",
        -  "type": "string"
        -}
      • removedInput schema / properties / meta
        Removed value: -{
        -  "description": "Additional field config.",
        -  "type": "object"
        -}
      • removedInput schema / properties / modality
        Removed value: -{
        -  "description": "Entity modality (e.g., contact).",
        -  "type": "string"
        -}
      • removedInput schema / properties / type
        Removed value: -{
        -  "description": "Field type (e.g., textarea).",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_mixed_companies_search18 fields changed
      • removedInput schema / properties / latest_funding_amount_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The maximium amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[min] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000",
        -      "type": "integer"
        -    },
        -    "min": {
        -      "description": "The minimum amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[max] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000",
        -      "type": "integer"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / latest_funding_amount_range_max
        Added value: +{
        +  "description": "The maximium amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[min] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000",
        +  "type": "integer"
        +}
      • addedInput schema / properties / latest_funding_amount_range_min
        Added value: +{
        +  "description": "The minimum amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[max] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000",
        +  "type": "integer"
        +}
      • removedInput schema / properties / latest_funding_date_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The latest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[min] to set a date range for when the company received its most recent funding round. Example: 2025-09-25",
        -      "type": "string"
        -    },
        -    "min": {
        -      "description": "The earliest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[max] to set a date range for when the company received its most recent funding round. Example: 2025-07-25",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / latest_funding_date_range_max
        Added value: +{
        +  "description": "The latest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[min] to set a date range for when the company received its most recent funding round. Example: 2025-09-25",
        +  "type": "string"
        +}
      • addedInput schema / properties / latest_funding_date_range_min
        Added value: +{
        +  "description": "The earliest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[max] to set a date range for when the company received its most recent funding round. Example: 2025-07-25",
        +  "type": "string"
        +}
      • removedInput schema / properties / organization_job_posted_at_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The latest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25",
        -      "type": "string"
        -    },
        -    "min": {
        -      "description": "The earliest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / organization_job_posted_at_range_max
        Added value: +{
        +  "description": "The latest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25",
        +  "type": "string"
        +}
      • addedInput schema / properties / organization_job_posted_at_range_min
        Added value: +{
        +  "description": "The earliest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25",
        +  "type": "string"
        +}
      • removedInput schema / properties / organization_num_jobs_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The maximum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500",
        -      "type": "integer"
        -    },
        -    "min": {
        -      "description": "The minimum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500",
        -      "type": "integer"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / organization_num_jobs_range_max
        Added value: +{
        +  "description": "The maximum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500",
        +  "type": "integer"
        +}
      • addedInput schema / properties / organization_num_jobs_range_min
        Added value: +{
        +  "description": "The minimum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500",
        +  "type": "integer"
        +}
      • removedInput schema / properties / revenue_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "Search for organizations based on their revenue. Use this parameter to set the upper range of organization revenue. Use the revenue_range[min] parameter to set the lower range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 50000000",
        -      "type": "integer"
        -    },
        -    "min": {
        -      "description": "Search for organizations based on their revenue. Use this parameter to set the lower range of organization revenue. Use the revenue_range[max] parameter to set the upper range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 300000",
        -      "type": "integer"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / revenue_range_max
        Added value: +{
        +  "description": "Search for organizations based on their revenue. Use this parameter to set the upper range of organization revenue. Use the revenue_range[min] parameter to set the lower range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 50000000",
        +  "type": "integer"
        +}
      • addedInput schema / properties / revenue_range_min
        Added value: +{
        +  "description": "Search for organizations based on their revenue. Use this parameter to set the lower range of organization revenue. Use the revenue_range[max] parameter to set the upper range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 300000",
        +  "type": "integer"
        +}
      • removedInput schema / properties / total_funding_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The maximum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[min] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000",
        -      "type": "integer"
        -    },
        -    "min": {
        -      "description": "The minimum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[max] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000",
        -      "type": "integer"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / total_funding_range_max
        Added value: +{
        +  "description": "The maximum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[min] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000",
        +  "type": "integer"
        +}
      • addedInput schema / properties / total_funding_range_min
        Added value: +{
        +  "description": "The minimum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[max] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000",
        +  "type": "integer"
        +}
    • Changedpost_apollo_mixed_people_api_search9 fields changed
      • removedInput schema / properties / organization_job_posted_at_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The latest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25",
        -      "type": "string"
        -    },
        -    "min": {
        -      "description": "The earliest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / organization_job_posted_at_range_max
        Added value: +{
        +  "description": "The latest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25",
        +  "type": "string"
        +}
      • addedInput schema / properties / organization_job_posted_at_range_min
        Added value: +{
        +  "description": "The earliest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25",
        +  "type": "string"
        +}
      • removedInput schema / properties / organization_num_jobs_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The maximum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500",
        -      "type": "integer"
        -    },
        -    "min": {
        -      "description": "The minimum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500",
        -      "type": "integer"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / organization_num_jobs_range_max
        Added value: +{
        +  "description": "The maximum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500",
        +  "type": "integer"
        +}
      • addedInput schema / properties / organization_num_jobs_range_min
        Added value: +{
        +  "description": "The minimum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500",
        +  "type": "integer"
        +}
      • removedInput schema / properties / revenue_range
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "The maximum revenue the person's current employer generates. Use this parameter in combination with revenue_range[min] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000",
        -      "type": "integer"
        -    },
        -    "min": {
        -      "description": "The minimum revenue the person's current employer generates. Use this parameter in combination with revenue_range[max] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000",
        -      "type": "integer"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / revenue_range_max
        Added value: +{
        +  "description": "The maximum revenue the person's current employer generates. Use this parameter in combination with revenue_range[min] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000",
        +  "type": "integer"
        +}
      • addedInput schema / properties / revenue_range_min
        Added value: +{
        +  "description": "The minimum revenue the person's current employer generates. Use this parameter in combination with revenue_range[max] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000",
        +  "type": "integer"
        +}
    • Changedpost_apollo_news_articles_search3 fields changed
      • removedInput schema / properties / published_at
        Removed value: -{
        -  "properties": {
        -    "max": {
        -      "description": "Set the upper bound of the date range you want to search. Use this parameter in combination with the published_at[min] parameter. This date should fall after the published_at[min] date. The date should be formatted as YYYY-MM-DD. Example: 2025-05-15",
        -      "type": "string"
        -    },
        -    "min": {
        -      "description": "Set the lower bound of the date range you want to search. Use this parameter in combination with the published_at[max] parameter. This date should fall before the published_at[max] date. The date should be formatted as YYYY-MM-DD. Example: 2025-02-15",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / published_at_max
        Added value: +{
        +  "description": "Set the upper bound of the date range you want to search. Use this parameter in combination with the published_at[min] parameter. This date should fall after the published_at[min] date. The date should be formatted as YYYY-MM-DD. Example: 2025-05-15",
        +  "type": "string"
        +}
      • addedInput schema / properties / published_at_min
        Added value: +{
        +  "description": "Set the lower bound of the date range you want to search. Use this parameter in combination with the published_at[max] parameter. This date should fall before the published_at[max] date. The date should be formatted as YYYY-MM-DD. Example: 2025-02-15",
        +  "type": "string"
        +}
    • Changedpost_apollo_opportunities10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / account_id
        Removed value: -{
        -  "description": "Account ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / amount
        Removed value: -{
        -  "description": "Deal amount",
        -  "type": "number"
        -}
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "account_id": {
        +      "description": "The ID for the account within your Apollo instance. This is the company that you are targeting as part of the deal being created. <br><br>Each company in the Apollo database is assigned a unique ID. To find IDs, call the <a href=\"https://docs.apollo.io/reference/organization-search\" target=\"_blank\">organization search endpoint</a> and identify the values for `organization_id`. <br><br>Example: `5e66b6381e05b4008c8331b8`",
        +      "type": "string"
        +    },
        +    "amount": {
        +      "description": "The monetary value of the deal being created. <br><br>Do not enter commas or currency symbols for the value. The currency is automatically populated by the settings within your Apollo account. Commas are not accepted and result in the deal amount being left blank. <br><br>Example: `55123478` (results in a deal value of `$55,123,478` if the default currency is USD)",
        +      "type": "string"
        +    },
        +    "closed_date": {
        +      "description": "The estimated close date for the deal. This can be a future or past date. <br><br>The date should be formatted as `YYYY-MM-DD`. <br><br>Example: `2025-10-30`",
        +      "format": "date",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Name the deal you are creating. This should be a human-readable name. <br><br>Example: `Massive Q3 Deal`",
        +      "type": "string"
        +    },
        +    "opportunity_stage_id": {
        +      "description": "The ID for the deal stage within your team's Apollo account. <br><br>Each deal stage is assigned a unique ID. To find deal stage IDs, call the <a href=\"https://docs.apollo.io/reference/list-deal-stages\" target=\"_blank\">list deal stages endpoint</a> and identify the value for `id` for each stage. <br><br>Example: `6095a710bd01d100a506d4bd`",
        +      "type": "string"
        +    },
        +    "owner_id": {
        +      "description": "The ID for the deal owner within your team's Apollo account. <br><br>Use the <a href=\"https://docs.apollo.io/reference/get-a-list-of-users\" target=\"_blank\">get a list of users endpoint</a> to retrieve IDs for all of the users within your Apollo account. <br><br>Example: `66302798d03b9601c7934ebf`",
        +      "type": "string"
        +    },
        +    "typed_custom_fields": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Add information to <a href=\"https://knowledge.apollo.io/hc/en-us/articles/4415062486669-Create-a-Deal\" target=\"_blank\">custom fields</a> in Apollo. <br><br><b>Your custom fields are unique to your team's Apollo account. This means that the examples in this documentation may not work for your testing purposes.</b> <br><br>To utilize this parameter successfully, call the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint and identify the `id` value for the custom field, as well as the appropriate data type. For example, if a custom field accepts picklist entries, you need to pass the accompanying `id` value for the picklist entry that you want to use as the input value. <br><br><b>Example</b>: When the <a href=\"https://docs.apollo.io/reference/get-a-list-of-all-custom-fields\">get a list of all custom fields</a> endpoint returns an `id` of field: \n * `\"60c39ed82bd02f01154c470a\"` (datetime) \n \n\n then the value passed should be: \n\n `{\"60c39ed82bd02f01154c470a\": \"2025-08-07\"}`",
        +      "example": {
        +        "60c39ed82bd02f01154c470a": "2025-08-07"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "name"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / closed_date
        Removed value: -{
        -  "description": "Closed date (date string)",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "Deal name",
        -  "type": "string"
        -}
      • removedInput schema / properties / opportunity_stage_id
        Removed value: -{
        -  "description": "Deal stage ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / owner_id
        Removed value: -{
        -  "description": "Owner ID",
        -  "type": "string"
        -}
      • removedInput schema / properties / typed_custom_fields
        Removed value: -{
        -  "description": "Typed custom fields object",
        -  "type": "object"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "name"
        -]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_people_bulk_match8 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "details": {
        +      "description": "Provide info for each person you want to enrich as an object within this array. Add up to 10 people.",
        +      "items": {
        +        "description": "One person to enrich. Give whatever identifiers you have — the more, the likelier the match.",
        +        "properties": {
        +          "domain": {
        +            "description": "Domain of the person's employer, without www. Example: apollo.io",
        +            "type": "string"
        +          },
        +          "email": {
        +            "description": "Email address of the person.",
        +            "type": "string"
        +          },
        +          "first_name": {
        +            "description": "First name, used with last_name. Example: tim",
        +            "type": "string"
        +          },
        +          "hashed_email": {
        +            "description": "MD5 or SHA-256 hash of the email address.",
        +            "type": "string"
        +          },
        +          "id": {
        +            "description": "Apollo person id, e.g. from a people search.",
        +            "type": "string"
        +          },
        +          "last_name": {
        +            "description": "Last name, used with first_name. Example: zheng",
        +            "type": "string"
        +          },
        +          "linkedin_url": {
        +            "description": "LinkedIn profile URL of the person.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Full name, e.g. \"tim zheng\"; replaces first_name + last_name.",
        +            "type": "string"
        +          },
        +          "organization_name": {
        +            "description": "Name of the person's employer. Example: apollo",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "reveal_personal_emails": {
        +      "description": "Set to true if you want to enrich all matched people with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "details"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / details
        Removed value: -{
        -  "description": "Provide info for each person you want to enrich as an object within this array. Add up to 10 people.",
        -  "items": {
        -    "description": "One person to enrich. Give whatever identifiers you have — the more, the likelier the match.",
        -    "properties": {
        -      "domain": {
        -        "description": "Domain of the person's employer, without www. Example: apollo.io",
        -        "type": "string"
        -      },
        -      "email": {
        -        "description": "Email address of the person.",
        -        "type": "string"
        -      },
        -      "first_name": {
        -        "description": "First name, used with last_name. Example: tim",
        -        "type": "string"
        -      },
        -      "hashed_email": {
        -        "description": "MD5 or SHA-256 hash of the email address.",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Apollo person id, e.g. from a people search.",
        -        "type": "string"
        -      },
        -      "last_name": {
        -        "description": "Last name, used with first_name. Example: zheng",
        -        "type": "string"
        -      },
        -      "linkedin_url": {
        -        "description": "LinkedIn profile URL of the person.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "Full name, e.g. \"tim zheng\"; replaces first_name + last_name.",
        -        "type": "string"
        -      },
        -      "organization_name": {
        -        "description": "Name of the person's employer. Example: apollo",
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  "type": "array"
        -}
      • addedInput schema / properties / reveal_phone_number / description
        Added value: +"Set to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • addedInput schema / properties / run_waterfall_email / description
        Added value: +"Set to true to enable email waterfall enrichment"
      • addedInput schema / properties / run_waterfall_phone / description
        Added value: +"Set to true to enable phone waterfall enrichment"
      • addedInput schema / properties / webhook_url / description
        Added value: +"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • changedInput schema / required
        Previous value: -[
        -  "details"
        -]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_people_match7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "anyOf": [
        +    {
        +      "properties": {
        +        "first_name": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "first_name"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "last_name": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "last_name"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "name": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "name"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "email": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "email"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "hashed_email": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "hashed_email"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "organization_name": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "organization_name"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "domain": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "domain"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "id": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id"
        +      ]
        +    },
        +    {
        +      "properties": {
        +        "linkedin_url": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "linkedin_url"
        +      ]
        +    }
        +  ],
        +  "description": "Identify one person. Give at least one identifier; the more you supply, the likelier the match.",
        +  "minProperties": 1,
        +  "properties": {
        +    "domain": {
        +      "description": "The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. Example: apollo.io or microsoft.com",
        +      "type": "string"
        +    },
        +    "email": {
        +      "description": "The email address of the person. Example: example@email.com",
        +      "type": "string"
        +    },
        +    "first_name": {
        +      "description": "The first name of the person. This is typically used in combination with the last_name parameter. Example: tim",
        +      "type": "string"
        +    },
        +    "hashed_email": {
        +      "description": "The hashed email of the person. The email should adhere to either the MD5 or SHA-256 hash format. Example: 8d935115b9ff4489f2d1f9249503cadf (MD5) or 97817c0c49994eb500ad0a5e7e2d8aed51977b26424d508f66e4e8887746a152 (SHA-256)",
        +      "type": "string"
        +    },
        +    "id": {
        +      "description": "The Apollo ID for the person. Each person in the Apollo database is assigned a unique ID. To find IDs, call the People API Search endpoint and identify the values for person_id. Example: 587cf802f65125cad923a266",
        +      "type": "string"
        +    },
        +    "last_name": {
        +      "description": "The last name of the person. This is typically used in combination with the first_name parameter. Example: zheng",
        +      "type": "string"
        +    },
        +    "linkedin_url": {
        +      "description": "The URL for the person's LinkedIn profile. Example: http://www.linkedin.com/in/tim-zheng-677ba010",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "The full name of the person. This will typically be a first name and last name separated by a space. If you use this parameter, you do not need to use the first_name and last_name parameters. Example: tim zheng",
        +      "type": "string"
        +    },
        +    "organization_name": {
        +      "description": "The name of the person's employer. This can be the current employer or a previous employer. Example: apollo",
        +      "type": "string"
        +    },
        +    "reveal_personal_emails": {
        +      "description": "Set to true if you want to enrich the person's data with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / reveal_phone_number / description
        Added value: +"Set to true if you want to enrich the person's data with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the person's phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • addedInput schema / properties / run_waterfall_email / description
        Added value: +"Set to true to enable email waterfall enrichment"
      • addedInput schema / properties / run_waterfall_phone / description
        Added value: +"Set to true to enable phone waterfall enrichment"
      • addedInput schema / properties / webhook_url / description
        Added value: +"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_reports_sync_report9 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "date_ranges": {
        +      "description": "The time window for the query. Provide one object with a <code>modality</code> preset. For a custom date range, set <code>modality</code> to <code>custom_range</code> and add a <code>smart_datetime_range</code> key in <code>filters</code> with <code>{\"min\": \"YYYY-MM-DD\", \"max\": \"YYYY-MM-DD\"}</code>.",
        +      "items": {
        +        "properties": {
        +          "modality": {
        +            "description": "Date range preset. Valid values: <code>today</code>, <code>yesterday</code>, <code>current_week</code>, <code>current_month</code>, <code>current_quarter</code>, <code>current_year</code>, <code>last_7_days</code>, <code>last_2_weeks</code>, <code>last_30_days</code>, <code>last_3_months</code>, <code>last_6_months</code>, <code>last_12_months</code>, <code>last_4_quarters</code>, <code>last_2_years</code>, <code>previous_week</code>, <code>previous_month</code>, <code>previous_quarter</code>, <code>previous_year</code>, <code>all_time</code>, <code>custom_range</code> (requires <code>smart_datetime_range</code> in <code>filters</code>).",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "modality"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 1,
        +      "type": "array"
        +    },
        +    "filters": {
        +      "additionalProperties": true,
        +      "description": "Key/value filter map to narrow the result set. Pass an empty object <code>{}</code> for no filters. Common filter keys are documented in the <code>properties</code> below; additional dimension-based filters may also be passed using the same key names as <code>group_by[].name</code> values. Refer to the <a href=\"https://docs.apollo.io/reference/sync-report-metrics\" target=\"_blank\">Metrics and Dimensions Reference</a> for a complete list.",
        +      "properties": {
        +        "account_stage_ids": {
        +          "description": "Filter to specific account stage IDs.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "contact_stage_ids": {
        +          "description": "Filter to specific contact stage IDs.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "email_account_ids": {
        +          "description": "Filter to specific sender mailbox IDs.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "emailer_campaign_ids": {
        +          "description": "Filter to specific sequence IDs.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "opportunity_stage_ids": {
        +          "description": "Filter to specific opportunity stage IDs.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "smart_datetime_range": {
        +          "description": "Required when <code>date_ranges[].modality</code> is <code>custom_range</code>. Specifies the exact date window as ISO 8601 date strings.",
        +          "properties": {
        +            "max": {
        +              "description": "End date (inclusive). Format: <code>YYYY-MM-DD</code>. <br><br>Example: <code>2024-03-31</code>",
        +              "type": "string"
        +            },
        +            "min": {
        +              "description": "Start date (inclusive). Format: <code>YYYY-MM-DD</code>. <br><br>Example: <code>2024-01-01</code>",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "min",
        +            "max"
        +          ],
        +          "type": "object"
        +        },
        +        "smart_subteam_id": {
        +          "description": "Filter to specific sub-team IDs.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "smart_user_id": {
        +          "description": "Filter to specific team member IDs. Use <code>\"current\"</code> for the authenticated user. <br><br>Example: <code>[\"current\"]</code>",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "group_by": {
        +      "description": "The dimension to group results by (row dimension). Pass one object to break results down by that dimension. Pass an empty array <code>[]</code> for flat totals with no grouping. <br><br>Only one entry is supported. Refer to the <a href=\"https://docs.apollo.io/reference/sync-report-metrics\" target=\"_blank\">Metrics and Dimensions Reference</a> for valid dimension names.",
        +      "items": {
        +        "properties": {
        +          "limit": {
        +            "description": "Maximum number of dimension values to return.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "description": "The dimension name. <br><br>Example: <code>smart_user_id</code>",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 1,
        +      "type": "array"
        +    },
        +    "group_by_totals_selected": {
        +      "description": "When <code>true</code>, the response includes an aggregated totals row in addition to the per-dimension-value rows.",
        +      "type": "boolean"
        +    },
        +    "metrics": {
        +      "description": "The metrics to query. Each object specifies which metric to measure and which date and user columns the engine should use for that metric. The <code>smart_datetime_reference</code> and <code>smart_user_id_reference</code> values are metric-specific — using the wrong values will return no data. Refer to the <a href=\"https://docs.apollo.io/reference/sync-report-metrics\" target=\"_blank\">Metrics and Dimensions Reference</a> for valid metric names and the correct reference fields for each. <br><br>Pass an empty array <code>[]</code> to return a response with no metric columns.",
        +      "items": {
        +        "properties": {
        +          "display_name": {
        +            "description": "Optional label override for this metric's column in the response.",
        +            "type": "string"
        +          },
        +          "smart_datetime_reference": {
        +            "description": "The date column name to use for this metric time range. Valid values depend on the metric. See the smart reference field values table for supported values by metric type. Unsupported values may cause the related date or user filter not to apply. <br><br>Example: <code>activity_datetime</code>",
        +            "type": "string"
        +          },
        +          "smart_user_id_reference": {
        +            "description": "The user column name that filters per user. Many metrics use <code>user_id</code>. See the smart reference field values table for supported values by metric family. Unsupported values may cause the related date or user filter not to apply. <br><br>Example: <code>user_id</code>",
        +            "type": "string"
        +          },
        +          "value": {
        +            "description": "The metric identifier. For built-in metrics, use the metric name (e.g. <code>num_emails_sent</code>). For team-defined custom metrics, use the format <code>custom_metric_{id}</code> where <code>{id}</code> is the custom metric's id.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "value",
        +          "smart_datetime_reference",
        +          "smart_user_id_reference"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "min_ratio_denominator": {
        +      "default": 0,
        +      "description": "Minimum denominator threshold for ratio metrics. Rows where the denominator falls below this value are excluded from ratio calculations.",
        +      "type": "integer"
        +    },
        +    "pivot_group_by": {
        +      "description": "The dimension to pivot on (column dimension). Used together with <code>group_by</code> to produce a two-dimensional cross-tab table: <code>group_by</code> defines the row dimension and <code>pivot_group_by</code> defines the column dimension. Pass an empty array <code>[]</code> for non-pivot queries. <br><br>Only one entry is supported.",
        +      "items": {
        +        "properties": {
        +          "limit": {
        +            "description": "Maximum number of pivot column values to return.",
        +            "type": "integer"
        +          },
        +          "name": {
        +            "description": "The dimension name to pivot on. <br><br>Example: <code>emailer_campaign_id</code>",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "maxItems": 1,
        +      "type": "array"
        +    },
        +    "pivot_group_by_totals_selected": {
        +      "description": "When <code>true</code>, the pivot response includes an aggregated totals column in addition to the per-pivot-value columns.",
        +      "type": "boolean"
        +    },
        +    "skip_group_by_values": {
        +      "description": "Exclude specific dimension values from the result rows. Values must match the raw <code>key</code> field returned in bucket responses for the active <code>group_by</code> dimension (e.g. a contact stage ID string, a user ID string, or a date string for datetime dimensions). Maximum 500 entries.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "maxItems": 500,
        +      "type": "array"
        +    },
        +    "sorts": {
        +      "description": "Sort order for the result rows. Only the first entry is applied. Pass an empty array <code>[]</code> to use the default order. <br><br>Sorting is supported by metric value — provide the <code>metric</code> field with the same structure as an entry in the <code>metrics</code> array. The <code>asc</code> field controls direction (<code>true</code> = ascending, <code>false</code> = descending). <br><br>Sorting by dimension value (e.g. alphabetically by user name) is not supported via the API.",
        +      "items": {
        +        "properties": {
        +          "asc": {
        +            "description": "Sort ascending (<code>true</code>) or descending (<code>false</code>).",
        +            "type": "boolean"
        +          },
        +          "metric": {
        +            "description": "Sort by a metric column. Provide the same structure as a metric entry in the <code>metrics</code> array.",
        +            "properties": {
        +              "smart_datetime_reference": {
        +                "type": "string"
        +              },
        +              "smart_user_id_reference": {
        +                "type": "string"
        +              },
        +              "value": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          }
        +        },
        +        "required": [
        +          "asc"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "metrics",
        +    "group_by",
        +    "sorts",
        +    "filters",
        +    "group_by_totals_selected",
        +    "pivot_group_by_totals_selected",
        +    "date_ranges"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / date_range
        Removed value: -{
        -  "description": "Date range filter (when supported).",
        -  "type": "object"
        -}
      • removedInput schema / properties / filters
        Removed value: -{
        -  "description": "Filter specs.",
        -  "type": "string"
        -}
      • removedInput schema / properties / group_by
        Removed value: -{
        -  "description": "Dimensions to group by.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / metrics
        Removed value: -{
        -  "description": "Metrics to compute.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / pivot_group_by
        Removed value: -{
        -  "description": "Optional pivot dimensions.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / sorts
        Removed value: -{
        -  "description": "Sort specs.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_tasks10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "contact_id": {
        +      "description": "The Apollo ID for the contact that you want to be on the receiving end of the action. <br><br>To find contact IDs, call the <a href=\"https://docs.apollo.io/reference/search-for-contacts\" target=\"_blank\">search for contacts endpoint</a> and identify the `id` value for the contact. <br><br>Example: `66e34b81740c50074e3d1bd4`",
        +      "type": "string"
        +    },
        +    "due_at": {
        +      "description": "The full date and time when the task will be due. <br><br>Your entry should adhere to the <a href=\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\" target=\"_blank\">ISO 8601 date-time format</a>. Apollo uses Greenwich Mean Time (GMT) by default. If you do not account for time zone differences, you could add a task due date that falls on a different day than you intended. <br><br>The value you enter can either adhere to GMT, or you can adjust the time manually by specifying in hours and minutes how much you want to offset GMT.<br><br>Example: `2025-02-15T08:10:30Z`; `2025-03-25T10:15:30+05:00`",
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "Add a description for the task. This should be a human-readable message. <br><br>This parameter is not required, but it is recommended as it provides the task owner with more context on the action they need to take. <br><br>Example: `This contact expressed interest in the Sequences feature specifically. Be prepared to discuss.`",
        +      "type": "string"
        +    },
        +    "priority": {
        +      "default": "medium",
        +      "description": "Assign a priority to the task you are creating: <ul> <li> `high` </li> <li> `medium` </li> <li> `low` </li> </ul>",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "The status of the task being created. For future-facing tasks, you should use the `scheduled` status. <br><br>For tasks that are already completed, you can use `completed` or `skipped`. <br><br>Example: `scheduled`",
        +      "type": "string"
        +    },
        +    "title": {
        +      "description": "A title for the task. If omitted, Apollo will display an auto-generated title based on the task type and contact name. <br><br>Example: `Follow up on demo request`",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "Set the task to be 1 of the following task types. This enables the task owner to know the type of action they need to take. <ul> <li> `call`: Call the contact. </li> <li> `outreach_manual_email`: Email the contact. </li> <li> `linkedin_step_connect`: Send a LinkedIn invitation to connect with the contact. </li> <li> `linkedin_step_message`: Send a direct message to the contact's LinkedIn profile. </li> <li> `linkedin_step_view_profile`: View the contact's LinkedIn profile. </li> <li> `linkedin_step_interact_post`: Interact with the contact's recent LinkedIn posts. </li> <li> `action_item`: Take generic action for the contact. If you use this task type, Apollo recommends using the `note` parameter too. </li> </ul>",
        +      "type": "string"
        +    },
        +    "user_id": {
        +      "description": "The ID for the task owner within your team's Apollo account. This is the user that will take action on the contacts. <br><br>Use the <a href=\"https://docs.apollo.io/reference/get-a-list-of-users\" target=\"_blank\">get a list of users endpoint</a> to retrieve IDs for all of the users within your Apollo account. <br><br>Example: `66302798d03b9601c7934ebf`",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "user_id",
        +    "contact_id",
        +    "type",
        +    "status",
        +    "due_at"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / contact_id
        Removed value: -{
        -  "description": "Contact ID.",
        -  "type": "string"
        -}
      • removedInput schema / properties / due_at
        Removed value: -{
        -  "description": "ISO 8601 due datetime.",
        -  "type": "string"
        -}
      • removedInput schema / properties / priority
        Removed value: -{
        -  "description": "Task priority (default: medium).",
        -  "type": "string"
        -}
      • removedInput schema / properties / status
        Removed value: -{
        -  "description": "Task status.",
        -  "type": "string"
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Optional title.",
        -  "type": "string"
        -}
      • removedInput schema / properties / type
        Removed value: -{
        -  "description": "Task type.",
        -  "type": "string"
        -}
      • removedInput schema / properties / user_id
        Removed value: -{
        -  "description": "Task owner user ID.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "user_id",
        -  "contact_id",
        -  "type",
        -  "status",
        -  "due_at"
        -]New value: +[
        +  "body"
        +]
    • Changedpost_apollo_tasks_bulk_create10 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / body
        Added value: +{
        +  "properties": {
        +    "contact_ids": {
        +      "description": "The Apollo IDs for the contacts that you want to be on the receiving end of the action. <br><br>If you add multiple contact IDs, individual tasks will be created for each of the contacts using the same task type, due date, and other details. <br><br>To find contact IDs, call the <a href=\"https://docs.apollo.io/reference/search-for-contacts\" target=\"_blank\">search for contacts endpoint</a> and identify the `id` value for the contact. <br><br>Example: `66e34b81740c50074e3d1bd4`",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "due_at": {
        +      "description": "The full date and time when the task will be due. <br><br>Your entry should adhere to the <a href=\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\" target=\"_blank\">ISO 8601 date-time format</a>. Apollo uses Greenwich Mean Time (GMT) by default. If you do not account for time zone differences, you could add a task due date that falls on a different day than you intended. <br><br>The value you enter can either adhere to GMT, or you can adjust the time manually by specifying in hours and minutes how much you want to offset GMT.<br><br>Example: `2025-02-15T08:10:30Z`; `2025-03-25T10:15:30+05:00`",
        +      "format": "date-time",
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "Add a description for the task. This should be a human-readable message. <br><br>This parameter is not required, but it is recommended as it provides the task owner with more context on the action they need to take. <br><br>Example: `This contact expressed interest in the Sequences feature specifically. Be prepared to discuss.`",
        +      "type": "string"
        +    },
        +    "priority": {
        +      "default": "medium",
        +      "description": "Assign a priority to the task you are creating: <ul> <li> `high` </li> <li> `medium` </li> <li> `low` </li> </ul>",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "The status of the task being created. For future-facing tasks, you should use the `scheduled` status. <br><br>For tasks that are already completed, you can use `completed` or `skipped`. <br><br>Example: `scheduled`",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "Set the task to be 1 of the following task types. This enables the task owner to know the type of action they need to take. <ul> <li> `call`: Call the contacts. </li> <li> `outreach_manual_email`: Email the contacts. </li> <li> `linkedin_step_connect`: Send a LinkedIn invitation to connect with the contacts. </li> <li> `linkedin_step_message`: Send a direct message to the contacts' LinkedIn profiles. </li> <li> `linkedin_step_view_profile`: View the contacts' LinkedIn profiles. </li> <li> `linkedin_step_interact_post`: Interact with the contacts' recent LinkedIn posts. </li> <li> `action_item`: Take generic action for the contacts. If you use this task type, Apollo recommends using the `note` parameter too. </li> </ul>",
        +      "type": "string"
        +    },
        +    "user_id": {
        +      "description": "The ID for the task owner within your team's Apollo account. This is the user that will take action on the contacts. <br><br>Use the <a href=\"https://docs.apollo.io/reference/get-a-list-of-users\" target=\"_blank\">get a list of users endpoint</a> to retrieve IDs for all of the users within your Apollo account. <br><br>Example: `66302798d03b9601c7934ebf`",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "user_id",
        +    "contact_ids",
        +    "type",
        +    "status",
        +    "due_at"
        +  ],
        +  "type": "object"
        +}
      • removedInput schema / properties / contact_ids
        Removed value: -{
        -  "description": "Contact IDs.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedInput schema / properties / due_at
        Removed value: -{
        -  "description": "ISO 8601 due datetime.",
        -  "type": "string"
        -}
      • removedInput schema / properties / priority
        Removed value: -{
        -  "description": "Task priority (default: medium).",
        -  "type": "string"
        -}
      • removedInput schema / properties / status
        Removed value: -{
        -  "description": "Task status.",
        -  "type": "string"
        -}
      • removedInput schema / properties / title
        Removed value: -{
        -  "description": "Optional title.",
        -  "type": "string"
        -}
      • removedInput schema / properties / type
        Removed value: -{
        -  "description": "Task type.",
        -  "type": "string"
        -}
      • removedInput schema / properties / user_id
        Removed value: -{
        -  "description": "Task owner user ID.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "user_id",
        -  "contact_ids",
        -  "type",
        -  "status",
        -  "due_at"
        -]New value: +[
        +  "body"
        +]
  2. 8 tool updates
    • Addedbatch_get_schema
    • Addedbatch_quote
    • Changedbatch_use18 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / properties / calls / description
        Removed value: -"Up to 20 items of {call_id, operation_id, arguments}; steps at the same execution_level of a plan go in one batch"
      • addedInput schema / properties / calls / items / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / calls / items / additionalProperties
        Previous value: -trueNew value: +false
      • addedInput schema / properties / calls / items / properties
        Added value: +{
        +  "arguments": {
        +    "additionalProperties": true,
        +    "description": "Strictly schema-compliant arguments using the exact field names and types from this tool's arguments_schema.",
        +    "type": "object"
        +  },
        +  "call_id": {
        +    "description": "Caller-chosen identifier unique within this batch.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "tool": {
        +    "description": "Exact tool name returned by search or batch_get_schema. Never invent a name.",
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / calls / items / required
        Added value: +[
        +  "call_id",
        +  "tool",
        +  "arguments"
        +]
      • addedInput schema / properties / calls / maxItems
        Added value: +20
      • addedInput schema / properties / calls / minItems
        Added value: +1
      • removedInput schema / properties / max_price_usd
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Per-call price cap applied to every item"
        -}
      • removedInput schema / properties / search_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / search_id / default
        Removed value: -null
      • changedInput schema / properties / search_id / description
        Previous value: -"search_id from the search that found these operations"New value: +"Optional search correlation identifier returned by search."
      • addedInput schema / properties / search_id / type
        Added value: +"string"
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +  "maxLength": 128,
        +  "pattern": "^[A-Za-z0-9_-]*$",
        +  "type": "string"
        +}
      • addedOutput schema / $defs
        Added value: +{
        +  "jsonValue": {
        +    "anyOf": [
        +      {
        +        "additionalProperties": {
        +          "$ref": "#/$defs/jsonValue"
        +        },
        +        "type": "object"
        +      },
        +      {
        +        "items": {
        +          "$ref": "#/$defs/jsonValue"
        +        },
        +        "type": "array"
        +      },
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "JSON value returned by the upstream tool."
        +  }
        +}
      • addedOutput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties
        Added value: +{
        +  "batch_id": {
        +    "type": "string"
        +  },
        +  "error_count": {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "next_steps_guidance": {
        +    "description": "Deterministic next-step instructions derived from this result. Not an authorization grant.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "results": {
        +    "items": {
        +      "$schema": "https://json-schema.org/draft/2020-12/schema",
        +      "additionalProperties": false,
        +      "properties": {
        +        "call_id": {
        +          "type": "string"
        +        },
        +        "customer_cost_micros_usd": {
        +          "description": "Actual customer charge settled by AIsaServices, in micro-USD. Omitted when the upstream response does not report it.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "data": {
        +          "$ref": "#/$defs/jsonValue"
        +        },
        +        "error": {
        +          "anyOf": [
        +            {
        +              "$schema": "https://json-schema.org/draft/2020-12/schema",
        +              "additionalProperties": false,
        +              "properties": {
        +                "message": {
        +                  "type": "string"
        +                },
        +                "retryable": {
        +                  "type": "boolean"
        +                },
        +                "status": {
        +                  "type": "integer"
        +                },
        +                "type": {
        +                  "enum": [
        +                    "validation",
        +                    "authentication",
        +                    "payment",
        +                    "permission",
        +                    "rate_limit",
        +                    "upstream",
        +                    "timeout",
        +                    "internal"
        +                  ],
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "status",
        +                "retryable"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "request_id": {
        +          "type": "string"
        +        },
        +        "successful": {
        +          "type": "boolean"
        +        },
        +        "tool": {
        +          "type": "string"
        +        },
        +        "upstream_status": {
        +          "description": "HTTP status returned by AIsaServices when a request was dispatched.",
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "call_id",
        +        "tool",
        +        "successful",
        +        "request_id"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "session_id": {
        +    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "pattern": "^[A-Za-z0-9_-]*$",
        +    "type": "string"
        +  },
        +  "success_count": {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "total_count": {
        +    "minimum": 1,
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "session_id",
        +  "batch_id",
        +  "total_count",
        +  "success_count",
        +  "error_count",
        +  "results",
        +  "next_steps_guidance"
        +]
    • Changedget_details13 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / properties / arguments
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "The arguments the operation would be called with, for a price that reflects them. Keyed by operation_id for a batch, or passed flat for a single operation_id. Routes whose required parameters are validated before pricing have no price without them."
        -}
      • addedInput schema / properties / include_arguments_schema
        Added value: +{
        +  "default": true,
        +  "description": "Return the complete arguments_schema. Defaults to true.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / include_documentation / description
        Previous value: -"Include the complete native public OpenAPI document, reference closure and scoped completeness. Existing execution schemas remain unchanged."New value: +"Return the complete immutable public OpenAPI operation, referenced declarations, provenance and scoped completeness. Documentation does not change execution support."
      • addedInput schema / properties / include_response_schema
        Added value: +{
        +  "default": false,
        +  "description": "Return the complete response_schema. Defaults to false.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / operation_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "One operation_id from search"
        -}
      • removedInput schema / properties / operation_ids
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Up to 20 operation_ids, for a batch"
        -}
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +  "maxLength": 128,
        +  "pattern": "^[A-Za-z0-9_-]*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / tools
        Added value: +{
        +  "description": "Exact tool names returned by search whose complete contracts are needed. Never invent tool names.",
        +  "items": {
        +    "minLength": 1,
        +    "pattern": "^\\S(?:.*\\S)?$",
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "minItems": 1,
        +  "type": "array",
        +  "uniqueItems": true
        +}
      • removedInput schema / properties / with_quote
        Removed value: -{
        -  "default": true,
        -  "description": "Whether each operation is priced for this account before the answer. One round trip per operation; spends nothing.",
        -  "type": "boolean"
        -}
      • addedInput schema / required
        Added value: +[
        +  "tools"
        +]
      • addedOutput schema / properties
        Added value: +{
        +  "error_count": {
        +    "type": "integer"
        +  },
        +  "next_steps_guidance": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "array"
        +      }
        +    ],
        +    "items": {
        +      "type": "string"
        +    }
        +  },
        +  "session_id": {
        +    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "pattern": "^[A-Za-z0-9_-]{1,128}$",
        +    "type": "string"
        +  },
        +  "success_count": {
        +    "type": "integer"
        +  },
        +  "tools": {
        +    "additionalProperties": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "arguments_schema": {
        +          "additionalProperties": true,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "canonical_operation_id": {
        +          "type": "string"
        +        },
        +        "documentation": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "error": {
        +          "additionalProperties": false,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ],
        +          "properties": {
        +            "code": {
        +              "type": "string"
        +            },
        +            "message": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "code",
        +            "message"
        +          ]
        +        },
        +        "execution_supported": {
        +          "description": "Whether this router can execute and quote the operation; false retains documentation and discovery only.",
        +          "type": "boolean"
        +        },
        +        "execution_unsupported_reason": {
        +          "description": "Why execution and quoting remain unavailable through this router.",
        +          "type": "string"
        +        },
        +        "idempotent": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "known_pitfalls": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "array"
        +            }
        +          ],
        +          "items": {
        +            "type": "string"
        +          }
        +        },
        +        "read_only": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "response_schema": {
        +          "additionalProperties": true,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "side_effects": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "array"
        +            }
        +          ],
        +          "items": {
        +            "type": "string"
        +          }
        +        },
        +        "successful": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "successful"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "object"
        +  },
        +  "total_count": {
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "error_count",
        +  "next_steps_guidance",
        +  "session_id",
        +  "success_count",
        +  "tools",
        +  "total_count"
        +]
    • Changedpost_apollo_people_bulk_match11 fields changed
      • removedInput schema / properties / reveal_personal_emails
        Removed value: -{
        -  "description": "Set to true if you want to enrich all matched people with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / reveal_phone_number / default
        Added value: +false
      • removedInput schema / properties / reveal_phone_number / description
        Removed value: -"Set to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • addedInput schema / properties / run_waterfall_email / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_email / description
        Removed value: -"Set to true to enable email waterfall enrichment"
      • addedInput schema / properties / run_waterfall_phone / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_phone / description
        Removed value: -"Set to true to enable phone waterfall enrichment"
      • removedInput schema / properties / webhook_url / description
        Removed value: -"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • addedInput schema / properties / webhook_url / format
        Added value: +"https_url"
      • addedInput schema / properties / webhook_url / maxLength
        Added value: +2048
      • addedInput schema / properties / webhook_url / minLength
        Added value: +1
    • Changedpost_apollo_people_match20 fields changed
      • removedInput schema / properties / domain
        Removed value: -{
        -  "description": "The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. Example: apollo.io or microsoft.com",
        -  "type": "string"
        -}
      • removedInput schema / properties / email
        Removed value: -{
        -  "description": "The email address of the person. Example: example@email.com",
        -  "type": "string"
        -}
      • removedInput schema / properties / first_name
        Removed value: -{
        -  "description": "The first name of the person. This is typically used in combination with the last_name parameter. Example: tim",
        -  "type": "string"
        -}
      • removedInput schema / properties / hashed_email
        Removed value: -{
        -  "description": "The hashed email of the person. The email should adhere to either the MD5 or SHA-256 hash format. Example: 8d935115b9ff4489f2d1f9249503cadf (MD5) or 97817c0c49994eb500ad0a5e7e2d8aed51977b26424d508f66e4e8887746a152 (SHA-256)",
        -  "type": "string"
        -}
      • removedInput schema / properties / id
        Removed value: -{
        -  "description": "The Apollo ID for the person. Each person in the Apollo database is assigned a unique ID. To find IDs, call the People API Search endpoint and identify the values for person_id. Example: 587cf802f65125cad923a266",
        -  "type": "string"
        -}
      • removedInput schema / properties / last_name
        Removed value: -{
        -  "description": "The last name of the person. This is typically used in combination with the first_name parameter. Example: zheng",
        -  "type": "string"
        -}
      • removedInput schema / properties / linkedin_url
        Removed value: -{
        -  "description": "The URL for the person's LinkedIn profile. Example: http://www.linkedin.com/in/tim-zheng-677ba010",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "The full name of the person. This will typically be a first name and last name separated by a space. If you use this parameter, you do not need to use the first_name and last_name parameters. Example: tim zheng",
        -  "type": "string"
        -}
      • removedInput schema / properties / organization_name
        Removed value: -{
        -  "description": "The name of the person's employer. This can be the current employer or a previous employer. Example: apollo",
        -  "type": "string"
        -}
      • removedInput schema / properties / reveal_personal_emails
        Removed value: -{
        -  "description": "Set to true if you want to enrich the person's data with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / reveal_phone_number / default
        Added value: +false
      • removedInput schema / properties / reveal_phone_number / description
        Removed value: -"Set to true if you want to enrich the person's data with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the person's phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • addedInput schema / properties / run_waterfall_email / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_email / description
        Removed value: -"Set to true to enable email waterfall enrichment"
      • addedInput schema / properties / run_waterfall_phone / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_phone / description
        Removed value: -"Set to true to enable phone waterfall enrichment"
      • removedInput schema / properties / webhook_url / description
        Removed value: -"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • addedInput schema / properties / webhook_url / format
        Added value: +"https_url"
      • addedInput schema / properties / webhook_url / maxLength
        Added value: +2048
      • addedInput schema / properties / webhook_url / minLength
        Added value: +1
    • Changedsearch17 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / properties / category / anyOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "seo",
        -      "finance",
        -      "social",
        -      "search",
        -      "sales",
        -      "mail"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / category / default
        Removed value: -null
      • changedInput schema / properties / category / description
        Previous value: -"Restrict to one category (seo, finance, social, search, sales, mail). Omit to search everything."New value: +"Restrict retrieval to one category. Omit to search everything. (AIsa-only: tool-router has no equivalent.)"
      • addedInput schema / properties / category / enum
        Added value: +[
        +  "seo",
        +  "finance",
        +  "social",
        +  "search",
        +  "sales",
        +  "mail"
        +]
      • addedInput schema / properties / category / type
        Added value: +"string"
      • addedInput schema / properties / known_fields
        Added value: +{
        +  "additionalProperties": true,
        +  "default": {},
        +  "description": "Known values such as ticker, URL, provider, or identifier that improve retrieval.",
        +  "type": "object"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum candidates, 1-10"New value: +"Maximum number of additional direct tool candidates."
      • addedInput schema / properties / limit / maximum
        Added value: +20
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / provider_filters
        Added value: +{
        +  "default": [],
        +  "description": "Optional exact catalog provider keys used to narrow retrieval (for example similarweb). Do not use display brands. Omit this field if the exact key is unknown.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 50,
        +  "type": "array",
        +  "uniqueItems": true
        +}
      • changedInput schema / properties / query / description
        Previous value: -"What you need, in plain language, e.g. 'backlinks of a domain', 'recent tweets by a user', 'insider trades for AAPL'. English works best."New value: +"Natural-language capability or task to discover."
      • addedInput schema / properties / query / maxLength
        Added value: +2000
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +  "maxLength": 128,
        +  "pattern": "^[A-Za-z0-9_-]*$",
        +  "type": "string"
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "next_steps_guidance": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "array"
        +      }
        +    ],
        +    "items": {
        +      "type": "string"
        +    }
        +  },
        +  "plan": {
        +    "additionalProperties": false,
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "object"
        +      }
        +    ],
        +    "properties": {
        +      "canonical_use_case": {
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "known_pitfalls": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      },
        +      "plan_ref": {
        +        "type": "string"
        +      },
        +      "primary_tools": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      },
        +      "recommended_steps": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      },
        +      "related_tools": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      }
        +    },
        +    "required": [
        +      "canonical_use_case",
        +      "description",
        +      "known_pitfalls",
        +      "plan_ref",
        +      "primary_tools",
        +      "recommended_steps",
        +      "related_tools"
        +    ]
        +  },
        +  "retrieval_mode": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "string"
        +      }
        +    ]
        +  },
        +  "search_id": {
        +    "type": "string"
        +  },
        +  "session_id": {
        +    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "pattern": "^[A-Za-z0-9_-]{1,128}$",
        +    "type": "string"
        +  },
        +  "tools": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "array"
        +      }
        +    ],
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "arguments_schema": {
        +          "additionalProperties": true,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "description": {
        +          "type": "string"
        +        },
        +        "execution_supported": {
        +          "description": "Whether this router can execute and quote the operation; false retains documentation and discovery only.",
        +          "type": "boolean"
        +        },
        +        "execution_unsupported_reason": {
        +          "description": "Why execution and quoting remain unavailable through this router.",
        +          "type": "string"
        +        },
        +        "has_full_schema": {
        +          "type": "boolean"
        +        },
        +        "match_reasons": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "array"
        +            }
        +          ],
        +          "items": {
        +            "type": "string"
        +          }
        +        },
        +        "price": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "retrieval_debug": {
        +          "additionalProperties": false,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ],
        +          "properties": {
        +            "fused_rank": {
        +              "type": "integer"
        +            },
        +            "fused_score": {
        +              "type": "number"
        +            },
        +            "lexical_rank": {
        +              "type": "integer"
        +            },
        +            "lexical_score": {
        +              "type": "number"
        +            },
        +            "rerank_admission_rank": {
        +              "type": "integer"
        +            },
        +            "rerank_rank": {
        +              "type": "integer"
        +            },
        +            "rerank_score": {
        +              "anyOf": [
        +                {
        +                  "type": "null"
        +                },
        +                {
        +                  "type": "number"
        +                }
        +              ]
        +            },
        +            "runtime_availability": {
        +              "type": "string"
        +            },
        +            "vector_view_ranks": {
        +              "additionalProperties": {
        +                "type": "integer"
        +              },
        +              "type": "object"
        +            },
        +            "vector_view_scores": {
        +              "additionalProperties": {
        +                "type": "number"
        +              },
        +              "type": "object"
        +            }
        +          },
        +          "required": [
        +            "fused_rank",
        +            "fused_score",
        +            "lexical_rank",
        +            "lexical_score",
        +            "rerank_admission_rank",
        +            "rerank_rank",
        +            "runtime_availability",
        +            "vector_view_ranks",
        +            "vector_view_scores"
        +          ]
        +        },
        +        "summary": {
        +          "type": "string"
        +        },
        +        "tool": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "description",
        +        "has_full_schema",
        +        "price",
        +        "summary",
        +        "tool"
        +      ],
        +      "type": "object"
        +    }
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "next_steps_guidance",
        +  "search_id",
        +  "session_id",
        +  "tools"
        +]
    • Changeduse1 field changed
      • changedInput schema / properties / max_price_usd / description
        Previous value: -"Refuse the call before any spend if it would cost more than this many USD"New value: +"Refuse the call before any spend if its quoted price is above this many USD"
  3. 8 tool updates
    • Removedbatch_get_schema
    • Removedbatch_quote
    • Changedbatch_use18 fields changed
      • removedInput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / calls / description
        Added value: +"Up to 20 items of {call_id, operation_id, arguments}; steps at the same execution_level of a plan go in one batch"
      • removedInput schema / properties / calls / items / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / calls / items / additionalProperties
        Previous value: -falseNew value: +true
      • removedInput schema / properties / calls / items / properties
        Removed value: -{
        -  "arguments": {
        -    "additionalProperties": true,
        -    "description": "Strictly schema-compliant arguments using the exact field names and types from this tool's arguments_schema.",
        -    "type": "object"
        -  },
        -  "call_id": {
        -    "description": "Caller-chosen identifier unique within this batch.",
        -    "maxLength": 128,
        -    "minLength": 1,
        -    "type": "string"
        -  },
        -  "tool": {
        -    "description": "Exact tool name returned by search or batch_get_schema. Never invent a name.",
        -    "minLength": 1,
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / calls / items / required
        Removed value: -[
        -  "call_id",
        -  "tool",
        -  "arguments"
        -]
      • removedInput schema / properties / calls / maxItems
        Removed value: -20
      • removedInput schema / properties / calls / minItems
        Removed value: -1
      • addedInput schema / properties / max_price_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Per-call price cap applied to every item"
        +}
      • addedInput schema / properties / search_id / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / search_id / default
        Added value: +null
      • changedInput schema / properties / search_id / description
        Previous value: -"Optional search correlation identifier returned by search."New value: +"search_id from the search that found these operations"
      • removedInput schema / properties / search_id / type
        Removed value: -"string"
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        -  "maxLength": 128,
        -  "pattern": "^[A-Za-z0-9_-]*$",
        -  "type": "string"
        -}
      • removedOutput schema / $defs
        Removed value: -{
        -  "jsonValue": {
        -    "anyOf": [
        -      {
        -        "additionalProperties": {
        -          "$ref": "#/$defs/jsonValue"
        -        },
        -        "type": "object"
        -      },
        -      {
        -        "items": {
        -          "$ref": "#/$defs/jsonValue"
        -        },
        -        "type": "array"
        -      },
        -      {
        -        "type": "string"
        -      },
        -      {
        -        "type": "number"
        -      },
        -      {
        -        "type": "boolean"
        -      },
        -      {
        -        "type": "null"
        -      }
        -    ],
        -    "description": "JSON value returned by the upstream tool."
        -  }
        -}
      • removedOutput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / properties
        Removed value: -{
        -  "batch_id": {
        -    "type": "string"
        -  },
        -  "error_count": {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  "next_steps_guidance": {
        -    "description": "Deterministic next-step instructions derived from this result. Not an authorization grant.",
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": "array"
        -  },
        -  "results": {
        -    "items": {
        -      "$schema": "https://json-schema.org/draft/2020-12/schema",
        -      "additionalProperties": false,
        -      "properties": {
        -        "call_id": {
        -          "type": "string"
        -        },
        -        "customer_cost_micros_usd": {
        -          "description": "Actual customer charge settled by AIsaServices, in micro-USD. Omitted when the upstream response does not report it.",
        -          "minimum": 0,
        -          "type": "integer"
        -        },
        -        "data": {
        -          "$ref": "#/$defs/jsonValue"
        -        },
        -        "error": {
        -          "anyOf": [
        -            {
        -              "$schema": "https://json-schema.org/draft/2020-12/schema",
        -              "additionalProperties": false,
        -              "properties": {
        -                "message": {
        -                  "type": "string"
        -                },
        -                "retryable": {
        -                  "type": "boolean"
        -                },
        -                "status": {
        -                  "type": "integer"
        -                },
        -                "type": {
        -                  "enum": [
        -                    "validation",
        -                    "authentication",
        -                    "payment",
        -                    "permission",
        -                    "rate_limit",
        -                    "upstream",
        -                    "timeout",
        -                    "internal"
        -                  ],
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "status",
        -                "retryable"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ]
        -        },
        -        "request_id": {
        -          "type": "string"
        -        },
        -        "successful": {
        -          "type": "boolean"
        -        },
        -        "tool": {
        -          "type": "string"
        -        },
        -        "upstream_status": {
        -          "description": "HTTP status returned by AIsaServices when a request was dispatched.",
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "call_id",
        -        "tool",
        -        "successful",
        -        "request_id"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  "session_id": {
        -    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        -    "maxLength": 128,
        -    "minLength": 1,
        -    "pattern": "^[A-Za-z0-9_-]*$",
        -    "type": "string"
        -  },
        -  "success_count": {
        -    "minimum": 0,
        -    "type": "integer"
        -  },
        -  "total_count": {
        -    "minimum": 1,
        -    "type": "integer"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "session_id",
        -  "batch_id",
        -  "total_count",
        -  "success_count",
        -  "error_count",
        -  "results",
        -  "next_steps_guidance"
        -]
    • Changedget_details13 fields changed
      • removedInput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / arguments
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The arguments the operation would be called with, for a price that reflects them. Keyed by operation_id for a batch, or passed flat for a single operation_id. Routes whose required parameters are validated before pricing have no price without them."
        +}
      • removedInput schema / properties / include_arguments_schema
        Removed value: -{
        -  "default": true,
        -  "description": "Return the complete arguments_schema. Defaults to true.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / include_documentation / description
        Previous value: -"Return the complete immutable public OpenAPI operation, referenced declarations, provenance and scoped completeness. Documentation does not change execution support."New value: +"Include the complete native public OpenAPI document, reference closure and scoped completeness. Existing execution schemas remain unchanged."
      • removedInput schema / properties / include_response_schema
        Removed value: -{
        -  "default": false,
        -  "description": "Return the complete response_schema. Defaults to false.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / operation_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "One operation_id from search"
        +}
      • addedInput schema / properties / operation_ids
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Up to 20 operation_ids, for a batch"
        +}
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        -  "maxLength": 128,
        -  "pattern": "^[A-Za-z0-9_-]*$",
        -  "type": "string"
        -}
      • removedInput schema / properties / tools
        Removed value: -{
        -  "description": "Exact tool names returned by search whose complete contracts are needed. Never invent tool names.",
        -  "items": {
        -    "minLength": 1,
        -    "pattern": "^\\S(?:.*\\S)?$",
        -    "type": "string"
        -  },
        -  "maxItems": 20,
        -  "minItems": 1,
        -  "type": "array",
        -  "uniqueItems": true
        -}
      • addedInput schema / properties / with_quote
        Added value: +{
        +  "default": true,
        +  "description": "Whether each operation is priced for this account before the answer. One round trip per operation; spends nothing.",
        +  "type": "boolean"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "tools"
        -]
      • removedOutput schema / properties
        Removed value: -{
        -  "error_count": {
        -    "type": "integer"
        -  },
        -  "next_steps_guidance": {
        -    "anyOf": [
        -      {
        -        "type": "null"
        -      },
        -      {
        -        "type": "array"
        -      }
        -    ],
        -    "items": {
        -      "type": "string"
        -    }
        -  },
        -  "session_id": {
        -    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        -    "maxLength": 128,
        -    "minLength": 1,
        -    "pattern": "^[A-Za-z0-9_-]{1,128}$",
        -    "type": "string"
        -  },
        -  "success_count": {
        -    "type": "integer"
        -  },
        -  "tools": {
        -    "additionalProperties": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "arguments_schema": {
        -          "additionalProperties": true,
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "canonical_operation_id": {
        -          "type": "string"
        -        },
        -        "documentation": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "error": {
        -          "additionalProperties": false,
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "object"
        -            }
        -          ],
        -          "properties": {
        -            "code": {
        -              "type": "string"
        -            },
        -            "message": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "code",
        -            "message"
        -          ]
        -        },
        -        "execution_supported": {
        -          "description": "Whether this router can execute and quote the operation; false retains documentation and discovery only.",
        -          "type": "boolean"
        -        },
        -        "execution_unsupported_reason": {
        -          "description": "Why execution and quoting remain unavailable through this router.",
        -          "type": "string"
        -        },
        -        "idempotent": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "boolean"
        -            }
        -          ]
        -        },
        -        "known_pitfalls": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "array"
        -            }
        -          ],
        -          "items": {
        -            "type": "string"
        -          }
        -        },
        -        "read_only": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "boolean"
        -            }
        -          ]
        -        },
        -        "response_schema": {
        -          "additionalProperties": true,
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "side_effects": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "array"
        -            }
        -          ],
        -          "items": {
        -            "type": "string"
        -          }
        -        },
        -        "successful": {
        -          "type": "boolean"
        -        }
        -      },
        -      "required": [
        -        "successful"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "object"
        -  },
        -  "total_count": {
        -    "type": "integer"
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "error_count",
        -  "next_steps_guidance",
        -  "session_id",
        -  "success_count",
        -  "tools",
        -  "total_count"
        -]
    • Changedpost_apollo_people_bulk_match11 fields changed
      • addedInput schema / properties / reveal_personal_emails
        Added value: +{
        +  "description": "Set to true if you want to enrich all matched people with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / reveal_phone_number / default
        Removed value: -false
      • addedInput schema / properties / reveal_phone_number / description
        Added value: +"Set to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • removedInput schema / properties / run_waterfall_email / default
        Removed value: -false
      • addedInput schema / properties / run_waterfall_email / description
        Added value: +"Set to true to enable email waterfall enrichment"
      • removedInput schema / properties / run_waterfall_phone / default
        Removed value: -false
      • addedInput schema / properties / run_waterfall_phone / description
        Added value: +"Set to true to enable phone waterfall enrichment"
      • addedInput schema / properties / webhook_url / description
        Added value: +"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • removedInput schema / properties / webhook_url / format
        Removed value: -"https_url"
      • removedInput schema / properties / webhook_url / maxLength
        Removed value: -2048
      • removedInput schema / properties / webhook_url / minLength
        Removed value: -1
    • Changedpost_apollo_people_match20 fields changed
      • addedInput schema / properties / domain
        Added value: +{
        +  "description": "The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. Example: apollo.io or microsoft.com",
        +  "type": "string"
        +}
      • addedInput schema / properties / email
        Added value: +{
        +  "description": "The email address of the person. Example: example@email.com",
        +  "type": "string"
        +}
      • addedInput schema / properties / first_name
        Added value: +{
        +  "description": "The first name of the person. This is typically used in combination with the last_name parameter. Example: tim",
        +  "type": "string"
        +}
      • addedInput schema / properties / hashed_email
        Added value: +{
        +  "description": "The hashed email of the person. The email should adhere to either the MD5 or SHA-256 hash format. Example: 8d935115b9ff4489f2d1f9249503cadf (MD5) or 97817c0c49994eb500ad0a5e7e2d8aed51977b26424d508f66e4e8887746a152 (SHA-256)",
        +  "type": "string"
        +}
      • addedInput schema / properties / id
        Added value: +{
        +  "description": "The Apollo ID for the person. Each person in the Apollo database is assigned a unique ID. To find IDs, call the People API Search endpoint and identify the values for person_id. Example: 587cf802f65125cad923a266",
        +  "type": "string"
        +}
      • addedInput schema / properties / last_name
        Added value: +{
        +  "description": "The last name of the person. This is typically used in combination with the first_name parameter. Example: zheng",
        +  "type": "string"
        +}
      • addedInput schema / properties / linkedin_url
        Added value: +{
        +  "description": "The URL for the person's LinkedIn profile. Example: http://www.linkedin.com/in/tim-zheng-677ba010",
        +  "type": "string"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "The full name of the person. This will typically be a first name and last name separated by a space. If you use this parameter, you do not need to use the first_name and last_name parameters. Example: tim zheng",
        +  "type": "string"
        +}
      • addedInput schema / properties / organization_name
        Added value: +{
        +  "description": "The name of the person's employer. This can be the current employer or a previous employer. Example: apollo",
        +  "type": "string"
        +}
      • addedInput schema / properties / reveal_personal_emails
        Added value: +{
        +  "description": "Set to true if you want to enrich the person's data with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / reveal_phone_number / default
        Removed value: -false
      • addedInput schema / properties / reveal_phone_number / description
        Added value: +"Set to true if you want to enrich the person's data with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the person's phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • removedInput schema / properties / run_waterfall_email / default
        Removed value: -false
      • addedInput schema / properties / run_waterfall_email / description
        Added value: +"Set to true to enable email waterfall enrichment"
      • removedInput schema / properties / run_waterfall_phone / default
        Removed value: -false
      • addedInput schema / properties / run_waterfall_phone / description
        Added value: +"Set to true to enable phone waterfall enrichment"
      • addedInput schema / properties / webhook_url / description
        Added value: +"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • removedInput schema / properties / webhook_url / format
        Removed value: -"https_url"
      • removedInput schema / properties / webhook_url / maxLength
        Removed value: -2048
      • removedInput schema / properties / webhook_url / minLength
        Removed value: -1
    • Changedsearch17 fields changed
      • removedInput schema / $schema
        Removed value: -"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / category / anyOf
        Added value: +[
        +  {
        +    "enum": [
        +      "seo",
        +      "finance",
        +      "social",
        +      "search",
        +      "sales",
        +      "mail"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / category / default
        Added value: +null
      • changedInput schema / properties / category / description
        Previous value: -"Restrict retrieval to one category. Omit to search everything. (AIsa-only: tool-router has no equivalent.)"New value: +"Restrict to one category (seo, finance, social, search, sales, mail). Omit to search everything."
      • removedInput schema / properties / category / enum
        Removed value: -[
        -  "seo",
        -  "finance",
        -  "social",
        -  "search",
        -  "sales",
        -  "mail"
        -]
      • removedInput schema / properties / category / type
        Removed value: -"string"
      • removedInput schema / properties / known_fields
        Removed value: -{
        -  "additionalProperties": true,
        -  "default": {},
        -  "description": "Known values such as ticker, URL, provider, or identifier that improve retrieval.",
        -  "type": "object"
        -}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of additional direct tool candidates."New value: +"Maximum candidates, 1-10"
      • removedInput schema / properties / limit / maximum
        Removed value: -20
      • removedInput schema / properties / limit / minimum
        Removed value: -1
      • removedInput schema / properties / provider_filters
        Removed value: -{
        -  "default": [],
        -  "description": "Optional exact catalog provider keys used to narrow retrieval (for example similarweb). Do not use display brands. Omit this field if the exact key is unknown.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "maxItems": 50,
        -  "type": "array",
        -  "uniqueItems": true
        -}
      • changedInput schema / properties / query / description
        Previous value: -"Natural-language capability or task to discover."New value: +"What you need, in plain language, e.g. 'backlinks of a domain', 'recent tweets by a user', 'insider trades for AAPL'. English works best."
      • removedInput schema / properties / query / maxLength
        Removed value: -2000
      • removedInput schema / properties / query / minLength
        Removed value: -1
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        -  "maxLength": 128,
        -  "pattern": "^[A-Za-z0-9_-]*$",
        -  "type": "string"
        -}
      • removedOutput schema / properties
        Removed value: -{
        -  "next_steps_guidance": {
        -    "anyOf": [
        -      {
        -        "type": "null"
        -      },
        -      {
        -        "type": "array"
        -      }
        -    ],
        -    "items": {
        -      "type": "string"
        -    }
        -  },
        -  "plan": {
        -    "additionalProperties": false,
        -    "anyOf": [
        -      {
        -        "type": "null"
        -      },
        -      {
        -        "type": "object"
        -      }
        -    ],
        -    "properties": {
        -      "canonical_use_case": {
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "known_pitfalls": {
        -        "anyOf": [
        -          {
        -            "type": "null"
        -          },
        -          {
        -            "type": "array"
        -          }
        -        ],
        -        "items": {
        -          "type": "string"
        -        }
        -      },
        -      "plan_ref": {
        -        "type": "string"
        -      },
        -      "primary_tools": {
        -        "anyOf": [
        -          {
        -            "type": "null"
        -          },
        -          {
        -            "type": "array"
        -          }
        -        ],
        -        "items": {
        -          "type": "string"
        -        }
        -      },
        -      "recommended_steps": {
        -        "anyOf": [
        -          {
        -            "type": "null"
        -          },
        -          {
        -            "type": "array"
        -          }
        -        ],
        -        "items": {
        -          "type": "string"
        -        }
        -      },
        -      "related_tools": {
        -        "anyOf": [
        -          {
        -            "type": "null"
        -          },
        -          {
        -            "type": "array"
        -          }
        -        ],
        -        "items": {
        -          "type": "string"
        -        }
        -      }
        -    },
        -    "required": [
        -      "canonical_use_case",
        -      "description",
        -      "known_pitfalls",
        -      "plan_ref",
        -      "primary_tools",
        -      "recommended_steps",
        -      "related_tools"
        -    ]
        -  },
        -  "retrieval_mode": {
        -    "anyOf": [
        -      {
        -        "type": "null"
        -      },
        -      {
        -        "type": "string"
        -      }
        -    ]
        -  },
        -  "search_id": {
        -    "type": "string"
        -  },
        -  "session_id": {
        -    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        -    "maxLength": 128,
        -    "minLength": 1,
        -    "pattern": "^[A-Za-z0-9_-]{1,128}$",
        -    "type": "string"
        -  },
        -  "tools": {
        -    "anyOf": [
        -      {
        -        "type": "null"
        -      },
        -      {
        -        "type": "array"
        -      }
        -    ],
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "arguments_schema": {
        -          "additionalProperties": true,
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "description": {
        -          "type": "string"
        -        },
        -        "execution_supported": {
        -          "description": "Whether this router can execute and quote the operation; false retains documentation and discovery only.",
        -          "type": "boolean"
        -        },
        -        "execution_unsupported_reason": {
        -          "description": "Why execution and quoting remain unavailable through this router.",
        -          "type": "string"
        -        },
        -        "has_full_schema": {
        -          "type": "boolean"
        -        },
        -        "match_reasons": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "array"
        -            }
        -          ],
        -          "items": {
        -            "type": "string"
        -          }
        -        },
        -        "price": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "retrieval_debug": {
        -          "additionalProperties": false,
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "type": "object"
        -            }
        -          ],
        -          "properties": {
        -            "fused_rank": {
        -              "type": "integer"
        -            },
        -            "fused_score": {
        -              "type": "number"
        -            },
        -            "lexical_rank": {
        -              "type": "integer"
        -            },
        -            "lexical_score": {
        -              "type": "number"
        -            },
        -            "rerank_admission_rank": {
        -              "type": "integer"
        -            },
        -            "rerank_rank": {
        -              "type": "integer"
        -            },
        -            "rerank_score": {
        -              "anyOf": [
        -                {
        -                  "type": "null"
        -                },
        -                {
        -                  "type": "number"
        -                }
        -              ]
        -            },
        -            "runtime_availability": {
        -              "type": "string"
        -            },
        -            "vector_view_ranks": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            },
        -            "vector_view_scores": {
        -              "additionalProperties": {
        -                "type": "number"
        -              },
        -              "type": "object"
        -            }
        -          },
        -          "required": [
        -            "fused_rank",
        -            "fused_score",
        -            "lexical_rank",
        -            "lexical_score",
        -            "rerank_admission_rank",
        -            "rerank_rank",
        -            "runtime_availability",
        -            "vector_view_ranks",
        -            "vector_view_scores"
        -          ]
        -        },
        -        "summary": {
        -          "type": "string"
        -        },
        -        "tool": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "description",
        -        "has_full_schema",
        -        "price",
        -        "summary",
        -        "tool"
        -      ],
        -      "type": "object"
        -    }
        -  }
        -}
      • removedOutput schema / required
        Removed value: -[
        -  "next_steps_guidance",
        -  "search_id",
        -  "session_id",
        -  "tools"
        -]
    • Changeduse1 field changed
      • changedInput schema / properties / max_price_usd / description
        Previous value: -"Refuse the call before any spend if its quoted price is above this many USD"New value: +"Refuse the call before any spend if it would cost more than this many USD"
  4. 8 tool updates
    • Addedbatch_get_schema
    • Addedbatch_quote
    • Changedbatch_use18 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / properties / calls / description
        Removed value: -"Up to 20 items of {call_id, operation_id, arguments}; steps at the same execution_level of a plan go in one batch"
      • addedInput schema / properties / calls / items / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / calls / items / additionalProperties
        Previous value: -trueNew value: +false
      • addedInput schema / properties / calls / items / properties
        Added value: +{
        +  "arguments": {
        +    "additionalProperties": true,
        +    "description": "Strictly schema-compliant arguments using the exact field names and types from this tool's arguments_schema.",
        +    "type": "object"
        +  },
        +  "call_id": {
        +    "description": "Caller-chosen identifier unique within this batch.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "tool": {
        +    "description": "Exact tool name returned by search or batch_get_schema. Never invent a name.",
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / calls / items / required
        Added value: +[
        +  "call_id",
        +  "tool",
        +  "arguments"
        +]
      • addedInput schema / properties / calls / maxItems
        Added value: +20
      • addedInput schema / properties / calls / minItems
        Added value: +1
      • removedInput schema / properties / max_price_usd
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Per-call price cap applied to every item"
        -}
      • removedInput schema / properties / search_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / search_id / default
        Removed value: -null
      • changedInput schema / properties / search_id / description
        Previous value: -"search_id from the search that found these operations"New value: +"Optional search correlation identifier returned by search."
      • addedInput schema / properties / search_id / type
        Added value: +"string"
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +  "maxLength": 128,
        +  "pattern": "^[A-Za-z0-9_-]*$",
        +  "type": "string"
        +}
      • addedOutput schema / $defs
        Added value: +{
        +  "jsonValue": {
        +    "anyOf": [
        +      {
        +        "additionalProperties": {
        +          "$ref": "#/$defs/jsonValue"
        +        },
        +        "type": "object"
        +      },
        +      {
        +        "items": {
        +          "$ref": "#/$defs/jsonValue"
        +        },
        +        "type": "array"
        +      },
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "JSON value returned by the upstream tool."
        +  }
        +}
      • addedOutput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties
        Added value: +{
        +  "batch_id": {
        +    "type": "string"
        +  },
        +  "error_count": {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "next_steps_guidance": {
        +    "description": "Deterministic next-step instructions derived from this result. Not an authorization grant.",
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "results": {
        +    "items": {
        +      "$schema": "https://json-schema.org/draft/2020-12/schema",
        +      "additionalProperties": false,
        +      "properties": {
        +        "call_id": {
        +          "type": "string"
        +        },
        +        "customer_cost_micros_usd": {
        +          "description": "Actual customer charge settled by AIsaServices, in micro-USD. Omitted when the upstream response does not report it.",
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "data": {
        +          "$ref": "#/$defs/jsonValue"
        +        },
        +        "error": {
        +          "anyOf": [
        +            {
        +              "$schema": "https://json-schema.org/draft/2020-12/schema",
        +              "additionalProperties": false,
        +              "properties": {
        +                "message": {
        +                  "type": "string"
        +                },
        +                "retryable": {
        +                  "type": "boolean"
        +                },
        +                "status": {
        +                  "type": "integer"
        +                },
        +                "type": {
        +                  "enum": [
        +                    "validation",
        +                    "authentication",
        +                    "payment",
        +                    "permission",
        +                    "rate_limit",
        +                    "upstream",
        +                    "timeout",
        +                    "internal"
        +                  ],
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "status",
        +                "retryable"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "request_id": {
        +          "type": "string"
        +        },
        +        "successful": {
        +          "type": "boolean"
        +        },
        +        "tool": {
        +          "type": "string"
        +        },
        +        "upstream_status": {
        +          "description": "HTTP status returned by AIsaServices when a request was dispatched.",
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "call_id",
        +        "tool",
        +        "successful",
        +        "request_id"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "session_id": {
        +    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "pattern": "^[A-Za-z0-9_-]*$",
        +    "type": "string"
        +  },
        +  "success_count": {
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "total_count": {
        +    "minimum": 1,
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "session_id",
        +  "batch_id",
        +  "total_count",
        +  "success_count",
        +  "error_count",
        +  "results",
        +  "next_steps_guidance"
        +]
    • Changedget_details13 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / properties / arguments
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "additionalProperties": true,
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "The arguments the operation would be called with, for a price that reflects them. Keyed by operation_id for a batch, or passed flat for a single operation_id. Routes whose required parameters are validated before pricing have no price without them."
        -}
      • addedInput schema / properties / include_arguments_schema
        Added value: +{
        +  "default": true,
        +  "description": "Return the complete arguments_schema. Defaults to true.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / include_documentation / description
        Previous value: -"Include the complete native public OpenAPI document, reference closure and scoped completeness. Existing execution schemas remain unchanged."New value: +"Return the complete immutable public OpenAPI operation, referenced declarations, provenance and scoped completeness. Documentation does not change execution support."
      • addedInput schema / properties / include_response_schema
        Added value: +{
        +  "default": false,
        +  "description": "Return the complete response_schema. Defaults to false.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / operation_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "One operation_id from search"
        -}
      • removedInput schema / properties / operation_ids
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "description": "Up to 20 operation_ids, for a batch"
        -}
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +  "maxLength": 128,
        +  "pattern": "^[A-Za-z0-9_-]*$",
        +  "type": "string"
        +}
      • addedInput schema / properties / tools
        Added value: +{
        +  "description": "Exact tool names returned by search whose complete contracts are needed. Never invent tool names.",
        +  "items": {
        +    "minLength": 1,
        +    "pattern": "^\\S(?:.*\\S)?$",
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "minItems": 1,
        +  "type": "array",
        +  "uniqueItems": true
        +}
      • removedInput schema / properties / with_quote
        Removed value: -{
        -  "default": true,
        -  "description": "Whether each operation is priced for this account before the answer. One round trip per operation; spends nothing.",
        -  "type": "boolean"
        -}
      • addedInput schema / required
        Added value: +[
        +  "tools"
        +]
      • addedOutput schema / properties
        Added value: +{
        +  "error_count": {
        +    "type": "integer"
        +  },
        +  "next_steps_guidance": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "array"
        +      }
        +    ],
        +    "items": {
        +      "type": "string"
        +    }
        +  },
        +  "session_id": {
        +    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "pattern": "^[A-Za-z0-9_-]{1,128}$",
        +    "type": "string"
        +  },
        +  "success_count": {
        +    "type": "integer"
        +  },
        +  "tools": {
        +    "additionalProperties": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "arguments_schema": {
        +          "additionalProperties": true,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "canonical_operation_id": {
        +          "type": "string"
        +        },
        +        "documentation": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "error": {
        +          "additionalProperties": false,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ],
        +          "properties": {
        +            "code": {
        +              "type": "string"
        +            },
        +            "message": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "code",
        +            "message"
        +          ]
        +        },
        +        "execution_supported": {
        +          "description": "Whether this router can execute and quote the operation; false retains documentation and discovery only.",
        +          "type": "boolean"
        +        },
        +        "execution_unsupported_reason": {
        +          "description": "Why execution and quoting remain unavailable through this router.",
        +          "type": "string"
        +        },
        +        "idempotent": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "known_pitfalls": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "array"
        +            }
        +          ],
        +          "items": {
        +            "type": "string"
        +          }
        +        },
        +        "read_only": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "response_schema": {
        +          "additionalProperties": true,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "side_effects": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "array"
        +            }
        +          ],
        +          "items": {
        +            "type": "string"
        +          }
        +        },
        +        "successful": {
        +          "type": "boolean"
        +        }
        +      },
        +      "required": [
        +        "successful"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "object"
        +  },
        +  "total_count": {
        +    "type": "integer"
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "error_count",
        +  "next_steps_guidance",
        +  "session_id",
        +  "success_count",
        +  "tools",
        +  "total_count"
        +]
    • Changedpost_apollo_people_bulk_match11 fields changed
      • removedInput schema / properties / reveal_personal_emails
        Removed value: -{
        -  "description": "Set to true if you want to enrich all matched people with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / reveal_phone_number / default
        Added value: +false
      • removedInput schema / properties / reveal_phone_number / description
        Removed value: -"Set to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • addedInput schema / properties / run_waterfall_email / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_email / description
        Removed value: -"Set to true to enable email waterfall enrichment"
      • addedInput schema / properties / run_waterfall_phone / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_phone / description
        Removed value: -"Set to true to enable phone waterfall enrichment"
      • removedInput schema / properties / webhook_url / description
        Removed value: -"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • addedInput schema / properties / webhook_url / format
        Added value: +"https_url"
      • addedInput schema / properties / webhook_url / maxLength
        Added value: +2048
      • addedInput schema / properties / webhook_url / minLength
        Added value: +1
    • Changedpost_apollo_people_match20 fields changed
      • removedInput schema / properties / domain
        Removed value: -{
        -  "description": "The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. Example: apollo.io or microsoft.com",
        -  "type": "string"
        -}
      • removedInput schema / properties / email
        Removed value: -{
        -  "description": "The email address of the person. Example: example@email.com",
        -  "type": "string"
        -}
      • removedInput schema / properties / first_name
        Removed value: -{
        -  "description": "The first name of the person. This is typically used in combination with the last_name parameter. Example: tim",
        -  "type": "string"
        -}
      • removedInput schema / properties / hashed_email
        Removed value: -{
        -  "description": "The hashed email of the person. The email should adhere to either the MD5 or SHA-256 hash format. Example: 8d935115b9ff4489f2d1f9249503cadf (MD5) or 97817c0c49994eb500ad0a5e7e2d8aed51977b26424d508f66e4e8887746a152 (SHA-256)",
        -  "type": "string"
        -}
      • removedInput schema / properties / id
        Removed value: -{
        -  "description": "The Apollo ID for the person. Each person in the Apollo database is assigned a unique ID. To find IDs, call the People API Search endpoint and identify the values for person_id. Example: 587cf802f65125cad923a266",
        -  "type": "string"
        -}
      • removedInput schema / properties / last_name
        Removed value: -{
        -  "description": "The last name of the person. This is typically used in combination with the first_name parameter. Example: zheng",
        -  "type": "string"
        -}
      • removedInput schema / properties / linkedin_url
        Removed value: -{
        -  "description": "The URL for the person's LinkedIn profile. Example: http://www.linkedin.com/in/tim-zheng-677ba010",
        -  "type": "string"
        -}
      • removedInput schema / properties / name
        Removed value: -{
        -  "description": "The full name of the person. This will typically be a first name and last name separated by a space. If you use this parameter, you do not need to use the first_name and last_name parameters. Example: tim zheng",
        -  "type": "string"
        -}
      • removedInput schema / properties / organization_name
        Removed value: -{
        -  "description": "The name of the person's employer. This can be the current employer or a previous employer. Example: apollo",
        -  "type": "string"
        -}
      • removedInput schema / properties / reveal_personal_emails
        Removed value: -{
        -  "description": "Set to true if you want to enrich the person's data with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / reveal_phone_number / default
        Added value: +false
      • removedInput schema / properties / reveal_phone_number / description
        Removed value: -"Set to true if you want to enrich the person's data with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the person's phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
      • addedInput schema / properties / run_waterfall_email / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_email / description
        Removed value: -"Set to true to enable email waterfall enrichment"
      • addedInput schema / properties / run_waterfall_phone / default
        Added value: +false
      • removedInput schema / properties / run_waterfall_phone / description
        Removed value: -"Set to true to enable phone waterfall enrichment"
      • removedInput schema / properties / webhook_url / description
        Removed value: -"If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
      • addedInput schema / properties / webhook_url / format
        Added value: +"https_url"
      • addedInput schema / properties / webhook_url / maxLength
        Added value: +2048
      • addedInput schema / properties / webhook_url / minLength
        Added value: +1
    • Changedsearch17 fields changed
      • addedInput schema / $schema
        Added value: +"https://json-schema.org/draft/2020-12/schema"
      • removedInput schema / properties / category / anyOf
        Removed value: -[
        -  {
        -    "enum": [
        -      "seo",
        -      "finance",
        -      "social",
        -      "search",
        -      "sales",
        -      "mail"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / category / default
        Removed value: -null
      • changedInput schema / properties / category / description
        Previous value: -"Restrict to one category (seo, finance, social, search, sales, mail). Omit to search everything."New value: +"Restrict retrieval to one category. Omit to search everything. (AIsa-only: tool-router has no equivalent.)"
      • addedInput schema / properties / category / enum
        Added value: +[
        +  "seo",
        +  "finance",
        +  "social",
        +  "search",
        +  "sales",
        +  "mail"
        +]
      • addedInput schema / properties / category / type
        Added value: +"string"
      • addedInput schema / properties / known_fields
        Added value: +{
        +  "additionalProperties": true,
        +  "default": {},
        +  "description": "Known values such as ticker, URL, provider, or identifier that improve retrieval.",
        +  "type": "object"
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum candidates, 1-10"New value: +"Maximum number of additional direct tool candidates."
      • addedInput schema / properties / limit / maximum
        Added value: +20
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / provider_filters
        Added value: +{
        +  "default": [],
        +  "description": "Optional exact catalog provider keys used to narrow retrieval (for example similarweb). Do not use display brands. Omit this field if the exact key is unknown.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 50,
        +  "type": "array",
        +  "uniqueItems": true
        +}
      • changedInput schema / properties / query / description
        Previous value: -"What you need, in plain language, e.g. 'backlinks of a domain', 'recent tweets by a user', 'insider trades for AAPL'. English works best."New value: +"Natural-language capability or task to discover."
      • addedInput schema / properties / query / maxLength
        Added value: +2000
      • addedInput schema / properties / query / minLength
        Added value: +1
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +  "maxLength": 128,
        +  "pattern": "^[A-Za-z0-9_-]*$",
        +  "type": "string"
        +}
      • addedOutput schema / properties
        Added value: +{
        +  "next_steps_guidance": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "array"
        +      }
        +    ],
        +    "items": {
        +      "type": "string"
        +    }
        +  },
        +  "plan": {
        +    "additionalProperties": false,
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "object"
        +      }
        +    ],
        +    "properties": {
        +      "canonical_use_case": {
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "known_pitfalls": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      },
        +      "plan_ref": {
        +        "type": "string"
        +      },
        +      "primary_tools": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      },
        +      "recommended_steps": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      },
        +      "related_tools": {
        +        "anyOf": [
        +          {
        +            "type": "null"
        +          },
        +          {
        +            "type": "array"
        +          }
        +        ],
        +        "items": {
        +          "type": "string"
        +        }
        +      }
        +    },
        +    "required": [
        +      "canonical_use_case",
        +      "description",
        +      "known_pitfalls",
        +      "plan_ref",
        +      "primary_tools",
        +      "recommended_steps",
        +      "related_tools"
        +    ]
        +  },
        +  "retrieval_mode": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "string"
        +      }
        +    ]
        +  },
        +  "search_id": {
        +    "type": "string"
        +  },
        +  "session_id": {
        +    "description": "Reuse the session_id returned by Search in all subsequent tool calls for this task. If omitted, a new session is created.",
        +    "maxLength": 128,
        +    "minLength": 1,
        +    "pattern": "^[A-Za-z0-9_-]{1,128}$",
        +    "type": "string"
        +  },
        +  "tools": {
        +    "anyOf": [
        +      {
        +        "type": "null"
        +      },
        +      {
        +        "type": "array"
        +      }
        +    ],
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "arguments_schema": {
        +          "additionalProperties": true,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "description": {
        +          "type": "string"
        +        },
        +        "execution_supported": {
        +          "description": "Whether this router can execute and quote the operation; false retains documentation and discovery only.",
        +          "type": "boolean"
        +        },
        +        "execution_unsupported_reason": {
        +          "description": "Why execution and quoting remain unavailable through this router.",
        +          "type": "string"
        +        },
        +        "has_full_schema": {
        +          "type": "boolean"
        +        },
        +        "match_reasons": {
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "array"
        +            }
        +          ],
        +          "items": {
        +            "type": "string"
        +          }
        +        },
        +        "price": {
        +          "additionalProperties": true,
        +          "type": "object"
        +        },
        +        "retrieval_debug": {
        +          "additionalProperties": false,
        +          "anyOf": [
        +            {
        +              "type": "null"
        +            },
        +            {
        +              "type": "object"
        +            }
        +          ],
        +          "properties": {
        +            "fused_rank": {
        +              "type": "integer"
        +            },
        +            "fused_score": {
        +              "type": "number"
        +            },
        +            "lexical_rank": {
        +              "type": "integer"
        +            },
        +            "lexical_score": {
        +              "type": "number"
        +            },
        +            "rerank_admission_rank": {
        +              "type": "integer"
        +            },
        +            "rerank_rank": {
        +              "type": "integer"
        +            },
        +            "rerank_score": {
        +              "anyOf": [
        +                {
        +                  "type": "null"
        +                },
        +                {
        +                  "type": "number"
        +                }
        +              ]
        +            },
        +            "runtime_availability": {
        +              "type": "string"
        +            },
        +            "vector_view_ranks": {
        +              "additionalProperties": {
        +                "type": "integer"
        +              },
        +              "type": "object"
        +            },
        +            "vector_view_scores": {
        +              "additionalProperties": {
        +                "type": "number"
        +              },
        +              "type": "object"
        +            }
        +          },
        +          "required": [
        +            "fused_rank",
        +            "fused_score",
        +            "lexical_rank",
        +            "lexical_score",
        +            "rerank_admission_rank",
        +            "rerank_rank",
        +            "runtime_availability",
        +            "vector_view_ranks",
        +            "vector_view_scores"
        +          ]
        +        },
        +        "summary": {
        +          "type": "string"
        +        },
        +        "tool": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "description",
        +        "has_full_schema",
        +        "price",
        +        "summary",
        +        "tool"
        +      ],
        +      "type": "object"
        +    }
        +  }
        +}
      • addedOutput schema / required
        Added value: +[
        +  "next_steps_guidance",
        +  "search_id",
        +  "session_id",
        +  "tools"
        +]
    • Changeduse1 field changed
      • changedInput schema / properties / max_price_usd / description
        Previous value: -"Refuse the call before any spend if it would cost more than this many USD"New value: +"Refuse the call before any spend if its quoted price is above this many USD"
  5. 1 tool update
    • Changedget_details1 field changed
      • addedInput schema / properties / include_documentation
        Added value: +{
        +  "default": false,
        +  "description": "Include the complete native public OpenAPI document, reference closure and scoped completeness. Existing execution schemas remain unchanged.",
        +  "type": "boolean"
        +}
  6. 59 tool updates
    • First observedbatch_use
    • First observedget_apollo_account_stages
    • First observedget_apollo_accounts_id
    • First observedget_apollo_contact_stages
    • First observedget_apollo_contacts_contact_id
    • First observedget_apollo_email_accounts
    • First observedget_apollo_emailer_messages_id_activities
    • First observedget_apollo_emailer_messages_search
    • First observedget_apollo_fields
    • First observedget_apollo_labels
    • First observedget_apollo_notes
    • First observedget_apollo_opportunities_opportunity_id
    • First observedget_apollo_opportunities_search
    • First observedget_apollo_opportunity_stages
    • First observedget_apollo_organizations_enrich
    • First observedget_apollo_organizations_id
    • First observedget_apollo_organizations_organization_id_job_postings
    • First observedget_apollo_phone_calls_search
    • First observedget_apollo_typed_custom_fields
    • First observedget_apollo_users_search
    • First observedget_details
    • First observedlist_categories
    • First observedpatch_apollo_accounts_account_id
    • First observedpatch_apollo_contacts_contact_id
    • First observedpatch_apollo_opportunities_opportunity_id
    • First observedpost_apollo_accounts
    • First observedpost_apollo_accounts_bulk_create
    • First observedpost_apollo_accounts_bulk_update
    • First observedpost_apollo_accounts_search
    • First observedpost_apollo_accounts_update_owners
    • First observedpost_apollo_contacts
    • First observedpost_apollo_contacts_bulk_create
    • First observedpost_apollo_contacts_bulk_update
    • First observedpost_apollo_contacts_search
    • First observedpost_apollo_contacts_update_owners
    • First observedpost_apollo_contacts_update_stages
    • First observedpost_apollo_emailer_campaigns_add_contact_ids
    • First observedpost_apollo_emailer_campaigns_remove_or_stop_contact_ids
    • First observedpost_apollo_emailer_campaigns_search
    • First observedpost_apollo_emailer_campaigns_sequence_id_abort
    • First observedpost_apollo_emailer_campaigns_sequence_id_approve
    • First observedpost_apollo_emailer_campaigns_sequence_id_archive
    • First observedpost_apollo_fields
    • First observedpost_apollo_mixed_companies_search
    • First observedpost_apollo_mixed_people_api_search
    • First observedpost_apollo_news_articles_search
    • First observedpost_apollo_opportunities
    • First observedpost_apollo_organizations_bulk_enrich
    • First observedpost_apollo_people_bulk_match
    • First observedpost_apollo_people_match
    • First observedpost_apollo_phone_calls
    • First observedpost_apollo_reports_sync_report
    • First observedpost_apollo_tasks
    • First observedpost_apollo_tasks_bulk_create
    • First observedpost_apollo_tasks_search
    • First observedpost_apollo_usage_stats_api_usage_stats
    • First observedput_apollo_phone_calls_id
    • First observedsearch
    • First observeduse

Publisher details

Operator
AIsa · Publisher source
Operator website
https://aisa.one
Vendor relationship
Independent
Trust center
Not available
Restrictions
No paid plan, admin approval, regional limit or custom OAuth app is needed to connect. Sign-in is OAuth against auth.aisa.one with dynamic client registration (RFC 7591), or an Authorization: Bearer AIsa API key. search, get_details and list_categories are free. use and batch_use are billed per call to the caller's own AIsa key, and max_price_usd refuses anything above a cap before any spend. Some operations are subscription-only on the gateway and answer 402 without the Hive GTM Growth plan.

Related MCP Connectors

  • Your agent needs a pipeline, not a list — the companies worth calling, the people who decide inside them, a way to reach those people, and the market evidence that the account is worth the call. **What you can ask for** • "Find Series-B fintech companies in Germany and the heads of marketing there, with emails." • "Enrich these 200 domains with headcount, funding and tech stack." • "Which of these accounts is hiring for roles that imply they need us?" • "How much traffic does this prospect get, and where does it come from?" • "Create the account and contact records and move this opportunity to the next stage." **How to use it** Point any MCP client at https://mcp.aisa.one/sales/mcp and sign in with OAuth — there is no key to create or paste. 79 tools: Apollo people and company search, enrichment, accounts, contacts, opportunities and stages, job postings, sequences and call activity; Similarweb traffic, audience, referrals, ad spend and competitors; plus creator discovery. **Why this rather than the source** Prospecting, enrichment, market sizing and the CRM writes behind one login instead of three. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Build the list here, then ask the same agent what those companies rank for or what is being said about them — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/apollo/mcp or https://mcp.aisa.one/similarweb/mcp for one of them alone; https://mcp.aisa.one/gtm/mcp adds the social side.

  • Your agent needs live data — a competitor's traffic, who to contact there, what people are saying, what Google and ChatGPT answer about you, a company's filings. Normally that is six vendor accounts, six sets of keys and six SDKs. This is one URL. **What you can ask for** • "How much traffic does stripe.com get, where does it come from, and who competes for the same keywords?" • "Find 20 Series-B fintech companies in Germany and the heads of marketing there, with emails." • "Does ChatGPT mention our brand when someone asks for the best CRM — and what does it cite?" • "What is X saying about $NVDA today, and what did the stock actually do?" • "Search the web for this, then scrape the three best pages into markdown." **How to use it** Point any MCP client at https://mcp.aisa.one/mcp and sign in with OAuth — there is no key to create or paste. Then just ask: the agent calls search to find the right operation and use to run it. **Why this rather than the source** 26 sources behind one account and one bill — DataForSEO, Semrush, Ahrefs, Similarweb, Apollo, X/Twitter, Instagram, Reddit, Pinterest, YouTube, Tavily, Exa, Perplexity, Firecrawl, CoinGecko, Kalshi, Polymarket, AgentMail and more, 580+ operations. tools/list returns five tools, not 580, so the introduction does not eat your context window. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** One slice at a time: https://mcp.aisa.one/seo/mcp · /finance/mcp · /social/mcp · /search/mcp · /sales/mcp · /mail/mcp · /gtm/mcp, or a single provider like /twitter-api/mcp. Same account, fewer tools listed, and search still reaches everything. Full list at https://mcp.aisa.one/servers

  • Your agent needs one go-to-market picture — the market, the companies in it, the people who decide, and what is being said about them — in a single set of tools. **What you can ask for** • "Size this market: who ranks, who gets the traffic, who advertises." • "Find the companies that fit and the people to email inside them." • "What is being said about these brands on X, Reddit and Instagram?" • "Which of these prospects is hiring for roles that imply budget?" • "Give me a competitor's keywords, backlinks and traffic mix in one pass." **How to use it** Point any MCP client at https://mcp.aisa.one/gtm/mcp and sign in with OAuth — there is no key to create or paste. 43 tools drawn from Apollo, Similarweb, Semrush, Ahrefs, X/Twitter, Instagram, Reddit and Pinterest — company enrichment and job postings, traffic and audience, keywords, backlinks and domain rating, and social search. **Why this rather than the source** The cross-source questions that usually need four tabs, answered in one conversation. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Start anywhere here, then keep going — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/sales/mcp for the pipeline side, https://mcp.aisa.one/seo/mcp for the search side, https://mcp.aisa.one/social/mcp for the conversation side.

  • Your agent needs X/Twitter data — who follows a competitor, what a community is posting, who quoted that tweet, what is trending in Japan. Normally that means applying for an X developer account, passing app review, and managing a quota per endpoint. **What you can ask for** • "Who follows @stripe, and which of them are verified?" • "Pull every reply and quote on this tweet and summarise what people object to." • "List this community's moderators and its posts this week." • "What is trending in Japan right now?" • "Give me the full thread context behind this link, including the long-form article." **How to use it** Point any MCP client at https://mcp.aisa.one/twitter-api/mcp and sign in with OAuth — there is no key to create or paste. 29 read tools: users (profile, about, batch lookup by id, search, followers, verified followers, followings, follow check), tweets (timeline, latest, mentions, advanced search, replies, quotes, retweeters, thread context, articles), communities, lists, Spaces and trends. **Why this rather than the source** No developer account to apply for, no app review, no per-endpoint quota to manage. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Ask for a handle's followers here, then ask the same agent for that brand's search traffic, its backlinks, or the people to contact — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/social/mcp for X plus Instagram, Reddit, Pinterest and YouTube; https://mcp.aisa.one/gtm/mcp for those plus Similarweb and Apollo.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Apollo.io MCP server for prospecting, lead enrichment, sales intelligence, and outreach workflows. Integrates Apollo.io go-to-market data into MCP-compatible AI applications.
    30
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    Exposes Apollo.io API functionalities as MCP tools for people and organization enrichment, search, and job postings. Enables natural language interaction with Apollo.io data.
    5
    16
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for the Apollo.io API that lets LLMs search and enrich people and company data.
    47 npm
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    MCP server for Apollo.io B2B database enabling people and company search, enrichment, and insights through conversational interfaces.
    9
    3,815 npm
    19
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources