Infinite Audience
Server Details
Discover audiences, build segments, match and deliver data. Some actions count toward account usage.
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 8.1% over 36 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 60 tools
Descriptions work hard to steer the agent (e.g. 'use list_all_deliveries for an org-wide search', 'use discovery_count for an unsaved preview'), but several clusters remain genuinely confusable: list_deliveries vs list_all_deliveries vs list_file_match_deliveries, count_segment vs recount_audience vs discovery_count, and archive_audience vs patch_audience (which also archives). The get_* run/job family (get_match_run, get_file_match_job, get_integration_run, get_saved_integration_segment_build) and wait_for_segment vs get_segment add further near-duplicates that require careful reading rather than obvious distinction.
Nearly everything is snake_case verb_noun (create_segment, get_audience, archive_segment, quote_delivery, wait_for_segment, link_audience_to_campaign), which is highly predictable. The main deviation is the discovery_* noun-prefix family (discovery_count, discovery_crosstab, discovery_lookup, discovery_overlap) and bare verbs like match_records and count_segment, which break the verb-first pattern but remain readable and internally consistent.
60 tools is far beyond a comfortable surface even for a rich segment/audience/delivery platform; many are narrow variants (four discovery_* tools, three delivery-listing tools, four 'get a run/job' tools). The toolset should be consolidated, especially around listing and status retrieval.
Coverage is genuinely broad: CRUD-ish lifecycle for segments and audiences (create, get, list, patch, archive, duplicate, refresh, count), plus campaigns, deliveries with quoting and polling, billing status, discovery, integrations, and async workflow gates. The notable gaps are deletion (intentionally archive-only) and top-up creation—only check_topup_status exists—plus no campaign deletion.
Available Tools
60 toolsanalyze_audience_uploadAnalyze Segment UploadADestructiveInspect
After uploading a file to the presigned upload_url (or all same-format shards to upload_urls) returned by create_segment(subtype=matched), call this to run LLM-assisted column mapping inference. For a sharded upload, analysis runs against the first shard only — every shard is assumed to share the same schema; a mismatch fails the batch job later with a specific error, not silently here. Returns: segment_id, analysis.columns[] (each: source_column, mapped_to, inferred_type, confidence 0–1, warning), analysis.unmapped_columns[] (column headers that could not be mapped), analysis.recommendations[] (human-readable tips to improve match rates). gzip is detected from file bytes, so a missing or incorrect compression declaration is self-healed during analysis. Returns typed 422 errors for malformed gzip, format mismatch, or malformed input, and 409 FILE_NOT_YET_UPLOADED before upload. The upload is staged (create_segment sets hitl:true) — nothing has started yet. Present these results to the user and wait for their response, then call confirm_column_mappings (to start resolution) or cancel_matched_upload (to abort) — do not call wait_for_segment before confirm_column_mappings succeeds. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | Yes | The segment_id of the matched segment returned by create_segment(subtype=matched) |
Output Schema
| Name | Required | Description |
|---|---|---|
| analysis | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: sharded uploads are analyzed against the first shard only, schema mismatch fails later with a specific error, gzip is detected from bytes and self-healed, typed 422 and 409 FILE_NOT_YET_UPLOADED errors are returned, the upload is staged with hitl:true, and discovery scope is required. These details materially help the agent understand state transitions and error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized and front-loaded: it starts with the trigger condition, then covers shard behavior, return shape, errors, workflow state, next steps, and required scope. Every sentence contributes operational information for a complex workflow tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool participates in a staged upload-to-confirmation workflow, the description covers the necessary preconditions, expected return structure, error conditions, and sequencing with sibling tools. Although an output schema exists and return details are not strictly required, the added context makes the definition complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the only parameter segment_id is already documented in the schema as the matched segment returned by create_segment(subtype=matched). The description references the same origin but adds no extra parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (run LLM-assisted column mapping inference) on a specific resource (an uploaded matched-segment file), and ties it directly to the create_segment(subtype=matched) upload flow. It also clearly distinguishes this analysis step from confirm_column_mappings, cancel_matched_upload, and wait_for_segment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call this: after uploading to the presigned URL(s) from create_segment(subtype=matched). It also states the next steps in order, including presenting results to the user, waiting, then calling confirm_column_mappings or cancel_matched_upload, and explicitly warns not to call wait_for_segment before confirm_column_mappings succeeds.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_audienceArchive AudienceADestructiveIdempotentInspect
Archive a saved audience to hide it from the default list, or restore it with restore=true. Preserves its composition and delivery history. Requires the creator scope. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| restore | No | True restores an archived audience to active | |
| audience_id | Yes | Saved audience ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond the annotations: it clarifies that composition and delivery history are preserved, so destructiveHint=true means only visibility is affected, not data loss. It also discloses the required creator scope. The scope sentence is duplicated rather than expanding into further behavior (e.g., what happens to linked campaigns).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core behavior and effect are front-loaded, but the final two sentences repeat the same creator-scope requirement verbatim ('Requires the creator scope. Requires "creator" scope.'), which is wasted space in an otherwise short description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with full schema coverage, rich annotations, and an output schema, the description covers effect, reversibility, data preservation, and auth prerequisites. Only the duplicated scope line and the absence of any dependency notes (e.g., effect on campaigns) keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, and the description's note that restore=true returns the audience to active merely mirrors the schema text. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (archive) and resource (saved audience) and explains the effect: it hides the audience from the default list, with restore=true as the inverse. It does not explicitly distinguish itself from nearby siblings like patch_audience or duplicate_audience, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: use it to hide an audience from the default list, and use restore=true to bring it back. It lacks explicit exclusions (e.g., 'use patch_audience instead to edit fields'), so no alternative routing guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_segmentArchive SegmentADestructiveIdempotentInspect
Archive a segment to hide it from the default segment catalog and new audience compositions, or restore an archived one back to active. Always safe and fully reversible: archiving never affects audiences that already reference this segment — their composition and record count are unchanged. This is distinct from permanently deleting a segment, which does change referencing audiences' composition and cannot be undone. Requires the creator scope. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| restore | No | Pass true to restore an archived segment back to active instead of archiving it | |
| segment_id | Yes | The segment ID to archive or restore |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Strongly exceeds the annotations: it discloses reversibility, that referencing audiences keep their composition and record count, and that a creator scope is required. The one tension is 'Always safe and fully reversible' versus destructiveHint=true — not a true contradiction since archiving does mutate state and is reversible, but the framing softens the hint rather than explaining why it is set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core content is well front-loaded, but the scope requirement is stated twice — 'Requires the creator scope. Requires 'creator' scope.' — which is a visible duplication artifact suggesting template concatenation. Trimming that redundancy would tighten an otherwise efficient description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 covers everything an agent needs to call correctly: mutation semantics, reversibility, side-effect boundaries, and auth scope. Only the duplicated scope line keeps it from being fully clean.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both segment_id and the restore boolean. The description's 'or restore an archived one back to active' reinforces the restore semantics but adds no syntax, defaults, or constraints beyond what the schema states; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs specific verbs (archive, restore) with a specific resource (segment) and states the exact effect: hidden from the default catalog and new audience compositions, with the inverse restore behavior spelled out. It also explicitly separates this operation from permanent deletion, so an agent can distinguish it from the destructive alternative 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance (archive vs. restore via the same tool) and an explicit when-not boundary by contrasting it with permanent deletion. The only shortfall is that the alternative is described conceptually rather than by a sibling tool name, so the agent isn't routed to a concrete other tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_saved_integration_segmentBuild Segment from Saved Integration MatchesADestructiveInspect
Create a matched segment, or add unique saved identities to a compatible standalone matched segment. Call preview_saved_integration_segment first and confirm the exact counts and target with the user. Adding to an existing segment replaces its current version. Completion or failure may notify configured organization webhooks, subscriptions, and opted-in user email. This never reruns matching, charges again, or creates an Audience automatically. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Create a new matched segment or add identities to an existing one | |
| filters | No | Select saved matches by provider, connection, run, source kind, or time window | |
| request_id | No | Stable idempotency key; generated when omitted | |
| segment_name | No | Name for a new matched segment | |
| target_segment_id | No | Existing matched segment ID when mode is add_to_segment |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| status | Yes | |
| preview | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| failure_code | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| collection_id | Yes | |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| identity_count | Yes | |
| failure_message | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| target_segment_id | Yes | |
| materialization_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true, but the description supplies the specifics: adding replaces the existing segment version, completion/failure may fire webhooks, subscriptions, and opted-in email, and no matching is rerun, no charge is incurred, and no Audience is auto-created. The 'creator' scope requirement is also stated, none of which appears in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six short sentences, front-loaded with the action and the required preview step, followed by consequences. Every sentence contributes a distinct constraint or side effect; nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world mutation with a nested filter object and an output schema, the description covers the prerequisite, the destructive side effect, cost/non-effects, authorization scope, and notification behavior. An agent has everything needed to call it safely without reading further docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented; the description still adds meaning by constraining target_segment_id to a 'compatible standalone' segment and framing mode as new-vs-add. It does not explain filter interaction or the idempotency key beyond what the schema states, keeping it short of the schema baseline plus full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource ('create a matched segment' / 'add unique saved identities to a compatible standalone matched segment') with both modes named. The phrase 'saved identities' and 'never reruns matching' distinguish it cleanly from create_segment, match_records, and create_audience.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite workflow ('Call preview_saved_integration_segment first') and a human-in-the-loop condition ('confirm the exact counts and target with the user'). It also narrows the add_to_segment case to a 'compatible standalone' segment, telling the agent when the mode is valid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_matched_uploadCancel Matched UploadADestructiveIdempotentInspect
Abort a staged matched-segment upload without confirming. Call this when the user declines to proceed after reviewing analyze_audience_upload's results. Clears the staged upload — no file move, no status/mapping-state change. The existing segment is retained; cancellation does not delete it or complete matching. Inspect it with get_segment and archive it with archive_segment if no longer needed. Idempotent. Pass exactly one of segment_id or audience_id — use audience_id when only the audience is known (it resolves to that audience's matched member segment server-side). Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | No | The segment_id returned by create_segment(subtype=matched) | |
| audience_id | No | The audience_id, if segment_id isn't known |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the requested action succeeded |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: clarifies that the destructiveHint covers only the staged upload (no file move, no status/mapping-state change), that the existing segment survives cancellation, that the call is idempotent, and that 'creator' scope is required. This resolves the ambiguity an agent would otherwise have about destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and trigger, and every sentence carries information (behavior, alternatives, idempotency, param exclusivity, auth). Slightly dense at six sentences, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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. Given that, the description covers everything an agent needs: trigger, side effects and non-effects, post-cancellation handling, idempotency, parameter selection, and auth scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover both params, but the description adds a rule the schema does not enforce: pass exactly one of segment_id or audience_id, and that audience_id resolves server-side to the matched member segment. Useful added semantics beyond the 100%-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: abort a staged matched-segment upload. Explicitly ties itself to the analyze_audience_upload workflow, making it distinguishable from generic cancel/delete siblings like archive_segment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the exact trigger (user declines to proceed after reviewing analyze_audience_upload results) and routes the agent to alternatives: get_segment to inspect, archive_segment if the retained segment is no longer needed. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_balanceCheck BalanceARead-onlyIdempotentInspect
Return customer-facing billing status: active contract, rated current-period spend, available/committed/promotional cents, active reservations, accepted pending usage, auto-recharge status, payment readiness, and projection staleness. For parent-billed orgs, consumer_money is only that child's attributed usage; agency balances and invoices are not exposed. Requires 'account-read' scope.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| billing | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| operational | Yes | |
| billing_mode | Yes | Who bills this account, or native_setup_required |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read-only, idempotent operation. The description adds valuable behavioral context: the data is customer-facing, agency balances and invoices are not exposed, and parent-billed orgs see only the child's attributed usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with what is returned, followed by key caveats and the required scope. The first sentence is a long but necessary list; overall it is efficient with little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering return values and annotations covering safety, the description adds the important data-exposure caveats and scope requirement. It is nearly complete, though sibling differentiation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing for the description to clarify beyond the schema. Baseline score for zero parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Return') and resource ('customer-facing billing status') and enumerates the fields returned. It is clear what the tool does, but it does not distinguish itself from sibling tools like check_topup_status or get_account_usage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage by describing the returned billing status and states a prerequisite ('Requires account-read scope'), but gives no explicit when-to-use guidance or alternatives versus sibling balance/usage tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_topup_statusCheck Top-up StatusARead-onlyIdempotentInspect
Read verified state for an existing top-up request without creating a charge. If customer action is required, direct the user to Account → Billing in Infinite Audience; this tool does not return a hosted payment URL. It cannot list top-ups: supply the request_id from the original top-up confirmation, not an invoice/payment ID; if unavailable, ask the account owner to review Account → Billing. Requires 'account-read' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | Idempotent top-up request ID returned when the request was created |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Verified state of the existing top-up request |
| guidance | No | Interpretation or recovery guidance for this result |
| next_step | No | Instruction to finish payment in Infinite Audience, when needed |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds context those fields cannot express: no charge is created, no hosted payment URL is returned, and the call requires the 'account-read' scope. The auth requirement and the explicit statement of what is NOT returned are exactly the kind of disclosure an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the read-only constraint, then the no-URL caveat, then the ID requirement and remedy, then the scope. Every sentence carries information an agent would otherwise have to discover through failure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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. Given a single required parameter, annotations covering the safety profile, and this description covering provenance, fallback, scope, and what is not returned, an agent has everything needed to call it correctly or route the user elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns extra by clarifying provenance ('from the original top-up confirmation') and by excluding a plausible wrong input ('not an invoice/payment ID') – a disambiguation the schema's 'returned when the request was created' wording does not make explicit enough to prevent a mismatched-ID lookup.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('read verified state for an existing top-up request') and immediately scopes it against write operations ('without creating a charge'). It implicitly separates itself from list-style siblings by declaring 'It cannot list top-ups', but never explicitly contrasts with the closest sibling, check_balance, so the reader must infer that boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (an existing top-up request whose ID you hold), explicit when-not-to-use ('cannot list top-ups'), a concrete alternative when the prerequisite is missing ('ask the account owner to review Account → Billing'), and a fallback for customer action. 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.
confirm_column_mappingsConfirm Column MappingsADestructiveInspect
Confirm column mappings for a staged matched-segment upload, starting identity resolution. Call this after analyze_audience_upload has been reviewed with the user and they approve (with or without edits). This moves the staged file into place — nothing runs before this call succeeds. Only call wait_for_segment after this returns ok. Pass exactly one of segment_id or audience_id — use audience_id when only the audience is known (it resolves to that audience's matched member segment server-side). When using audience_id, column_mappings is required (no auto-inference fallback on that path). When using segment_id, column_mappings may be omitted — the platform re-analyzes the active upload itself and accepts its own suggested mapping as-is. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | No | The segment_id returned by create_segment(subtype=matched) | |
| audience_id | No | The audience_id, if segment_id isn't known | |
| column_mappings | No | Map of source column name -> standard identity attribute name. Valid targets: iag_person_id, full_name, first_name, middle_name, last_name, name_suffix, address_1, address_2, city, state, zip, email, phone, dob, email_sha256, phone_sha256, emails, phones, addresses, emails_sha256, phones_sha256 (the last 7 — hashed/plural/array variants — are LLM/programmatic mapping targets only, not offered in a human dropdown). Use "(skip)" to exclude a column. For segment_id: omit to have the platform accept its own fresh analysis of the upload as-is. For audience_id: required. Always send the FULL mapping set (not just user-edited columns); this replaces the mappings entirely rather than merging. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the requested action succeeded |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| column_mappings | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/openWorld annotations, it discloses the concrete side effect ('moves the staged file into place'), the blocking behavior ('nothing runs before this call succeeds'), and an auth requirement ('Requires creator scope') — all things annotations cannot convey. It also warns that the audience_id path has no inference fallback, which is real behavioral risk information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the approval prerequisite are front-loaded, then the branching rules follow in order of decision. Sentences are dense with constraints rather than filler, and nothing is repeated except the ordering rule, which is reinforced for safety.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent staging tool with an output schema, the description covers preconditions, ordering, scope, and branch-specific parameter rules. The one gap is retry/re-entry behavior: it does not say whether calling again after a partial failure is safe or what happens to the staged file, despite the non-idempotent and destructive hints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns extra credit by adding the mutual-exclusivity constraint between segment_id and audience_id (not encoded via oneOf in the schema) and by explaining the server-side resolution of audience_id to a matched member segment. Most of the column_mappings requirements, however, are already duplicated in the schema property description rather than added here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Confirm column mappings for a staged matched-segment upload') and states the downstream effect ('starting identity resolution'). This distinguishes it cleanly from analyze_audience_upload (preview) and wait_for_segment (polling), so an agent can place it in the workflow 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('Call this after analyze_audience_upload has been reviewed with the user and they approve'), explicit sequencing ('Only call wait_for_segment after this returns ok'), and an exclusivity rule ('Pass exactly one of segment_id or audience_id') with a decision rule for which branch to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_segmentCount SegmentADestructiveIdempotentInspect
Refresh the stored record_count of one saved segment, not its parent audience. Runs a fresh BigQuery count over the segment's own definition for any subtype (filter, matched, similarity, propensity), updates segment.record_count. Returns {segment_id, record_count}. For an unsaved population preview use discovery_count; for a composed audience snapshot use recount_audience. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | Yes | The segment ID to recount |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | Yes | Fresh segment count, or null when pending or failed |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnlyHint=false, destructiveHint=true and idempotentHint=true; the description adds valuable context beyond them: it explains the mutation is an overwrite of segment.record_count via a fresh BigQuery count, and it declares the required 'discovery' scope. It does not mention query cost or rate limits for the BigQuery recount, which would matter for planning — hence 4 rather than 5. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what it does and what it does not touch, followed by mechanism, return shape, alternatives, and the scope prerequisite. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a one-param tool with an output schema, an auth scope requirement, and many sibling tools, the description is complete: it covers mechanism, mutation target, return shape, subtype breadth, and alternatives. Nothing an agent needs 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage, so the schema already carries the meaning. The description adds only that the count runs over 'the segment's own definition', which is scope context rather than a new param semantic. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: refreshing the stored record_count of one saved segment, explicitly NOT its parent audience. The subtype coverage (filter, matched, similarity, propensity) further pins the scope so an agent can distinguish it from recount_audience and discovery_count without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names both alternatives and the exact condition that selects each: discovery_count for unsaved population previews, recount_audience for composed audience snapshots. Use-vs-alternative routing is fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_audienceCreate AudienceAInspect
Create an audience from one or more existing segments. Audiences are the delivery payload — they have no subtype. To create typed cohorts (filter, matched, similarity, propensity), use create_segment instead. Accepts segment_refs: [{segment_id, role: include|exclude}] to compose the audience with per-segment inclusion/exclusion control. set_logic controls how include-role segments are combined (union or intersection). Returns audience_id, status and campaign_id immediately. Use record_count only for a verified count of this exact composition. Optional campaign_id links the new audience to that campaign (an audience belongs to at most one); omit it to leave the audience unlinked — link it later with link_audience_to_campaign. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable audience name | |
| set_logic | No | How include-role segments are combined: 'union' (OR, default) or 'intersection' (AND) | union |
| campaign_id | No | Optional campaign to link the new audience to (see list_campaigns). An unknown ID is rejected with INVALID_CAMPAIGN_ID and nothing is created. | |
| record_count | No | Legacy caller-provided count for this exact composition. Prefer omitting it and calling recount_audience. The server may reuse a valid saved member count; otherwise record_count is null | |
| segment_refs | Yes | Array of segment references with roles. Must include at least one include-role segment. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| set_logic | No | How included segments combine; excluded segments always subtract |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| campaign_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| segment_ids | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Saved composition count; null is unknown. Use recount_audience for a current value. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| excluded_segment_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the required 'creator' scope, the immediate return fields, and the cardinality constraint that an audience belongs to at most one campaign. It also clarifies that record_count is only for a verified count of the exact composition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and sibling differentiation, then moves through composition, return behavior, optional parameters, and auth scope. Despite its length, each sentence supports correct invocation or disambiguation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has five parameters, an output schema, and annotations, the description covers the critical creation flow, segment composition, campaign linking, return timing, and permission requirement. No material decision-making detail is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 useful operational meaning around record_count and campaign_id, including omitting campaign_id to link later, though much of the per-parameter detail is already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Create an audience from one or more existing segments.' It also distinguishes audiences from typed cohorts and explicitly routes agents to create_segment for that separate purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the key alternative: use create_segment for typed cohorts such as filter, matched, similarity, and propensity. It also explains when to use campaign_id versus linking later with link_audience_to_campaign.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_campaignCreate CampaignAInspect
Create a new campaign workspace with an optional brief and goals. Use when the user wants to start a new initiative, project, or campaign. Returns the new campaign object including its id. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name for the campaign | |
| description | No | Campaign brief, goals, intended market, and desired outcomes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| audiences | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent, closed-world operation, so the safety profile is covered. The description adds genuinely new context by stating the "'creator' scope" authorization requirement and noting the new campaign object with its id is returned. It does not warn that retries create duplicates (relevant given idempotentHint=false), which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the purpose stated first, then the usage trigger, then the return value and auth requirement. Nothing is padded and no sentence is redundant with the point of being noise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter create with a 100% coverage schema, an output schema, and full annotations, the description covers purpose, trigger, return, and auth scope. The return-value sentence is somewhat redundant given the output schema, and there is no guidance on duplicate creation or campaign limits, so it is strong but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two flat parameters, so the schema already explains name and description fully. The description restates "optional brief and goals," which maps loosely to the description field but adds no syntax, limits, or format guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ("Create a new campaign workspace") and adds scope detail (optional brief and goals), so an agent will not confuse it with update_campaign, get_campaign, or list_campaigns. It stops short of naming any sibling explicitly, so it lands just under the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when the user wants to start a new initiative, project, or campaign" gives a clear positive trigger with concrete user-intent phrasing. There is no explicit exclusion or alternative-path guidance (e.g., when to update an existing campaign instead), which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_segmentCreate SegmentADestructiveInspect
Create a segment of the specified subtype. Segments are the typed cohort definitions — audiences are composition wrappers built from segments. filter: reusable filter definition — returns immediately with status active and an unset count unless count_snapshot is supplied. Call count_segment to calculate its saved count. similarity: provide seed_description (natural language) OR seed_segment_id — triggers async icp-segment workflow, returns status pending + workflow_run_id. Call wait_for_segment(segment_id) to block until active. propensity: provide positive_class_segment_id — triggers async ml-model workflow, returns status pending + workflow_run_id. Training can take 10–60 min. Call wait_for_segment(segment_id) to monitor. matched: upload a file — returns upload_url (30-min presigned), or upload_urls (an array, one per shard) when shard_count > 1. The upload is staged (not resolved automatically): PUT the raw file bytes to each returned URL with Content-Type matching file_format: csv=text/csv, avro=application/avro, json=application/json, jsonl=application/x-ndjson. Do not include the MCP bearer token in this upload. After uploading (all shards, if multiple), call analyze_audience_upload(segment_id) (analyzes the first shard only when sharded — all shards must share one schema), present the mappings to the user and wait for their response, then confirm_column_mappings(segment_id) to start resolution (or cancel_matched_upload(segment_id) if they decline) — only THEN call wait_for_segment(segment_id). Upload, analysis, and completed matched resolution emit no usage; the first successful delivery emits one aggregate platform_match usage set together with normal delivery usage. HITL: similarity and propensity default to hitl=false (auto-proceed through all gates). Set hitl=true to pause at review gates. Use file_format to specify csv (default), avro, json, or jsonl and compression=gzip for gzip bytes. Set shard_count > 1 for multiple same-format files; all shards must use the same compression and every CSV shard must include its own header row. Set create_audience=true to automatically wrap the new segment in an audience for immediate delivery. Optional campaign_id records the campaign the segment is built for and links that wrapper audience to it; omit it to leave both outside any campaign. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| hitl | No | (similarity/propensity) Enable human-in-the-loop gates. Default false = auto-proceed through all gates. Set true for interactive review. | |
| name | Yes | Human-readable segment name | |
| filters | No | (filter) AND-combined conditions, reusable directly from discovery_count. Supply filters OR filter_groups, not both. | |
| subtype | Yes | Segment subtype | |
| campaign_id | No | Optional campaign this segment is built for (see list_campaigns). Stored as origin_campaign_id; with create_audience, the wrapper audience is linked to it. An unknown ID is rejected with INVALID_CAMPAIGN_ID and nothing is created. | |
| compression | No | (matched) Input transport compression. Use gzip for .csv.gz/.json.gz/.jsonl.gz bytes; object names remain based on file_format. gzip is NOT supported with file_format=avro (avro is already internally compressed) — the API rejects that combination with UNSUPPORTED_INPUT_COMPRESSION. | none |
| file_format | No | (matched) Input file format. csv (default): every column is a single scalar value — multi-value/array fields are not supported. avro/json/jsonl: native array columns supported. | |
| match_level | No | (matched) Restrict identity resolution to these match levels (Individual/Household/Digital/Spatial/Address). Omit to use the platform default (all levels). | |
| shard_count | No | (matched) Set > 1 for multiple same-format shards. All shards must use the same compression; every CSV shard must contain its own header row. | |
| webhook_url | No | (similarity/propensity/matched) URL to receive a POST notification when the segment becomes active | |
| record_limit | No | (filter) Cap the segment at this many people (e.g. "up to 1,000"). Requires State, City, or ZIP Code filters narrowing every OR branch to at most 100 three-digit ZIP prefixes. Audiences and deliveries inherit the cap. | |
| spatial_mode | No | (matched) Spatial trade-area mode. residential is the default; use work for workplace-oriented spatial matching, or auto for dynamic commercial workplace routing. | residential |
| filter_groups | No | (filter) Grouped conditions, reusable directly from discovery_count. Supply filters OR filter_groups, not both. | |
| count_snapshot | No | (filter) Existing verified count snapshot to store on the new segment; omit to leave the count unknown, then call count_segment for a fresh count | |
| create_audience | No | When true, automatically creates an audience wrapper around the new segment for immediate delivery use. Returns both segment_id and audience_id. | |
| seed_segment_id | No | (similarity) Existing segment ID to use as seed — provide either seed_description or seed_segment_id, not both | |
| seed_description | No | (similarity) Natural language ICP narrative describing the target segment persona | |
| positive_class_segment_id | No | (propensity) Segment ID whose members represent the positive class for ML training |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| subtype | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| upload_url | No | |
| audience_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| upload_urls | No | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Stored count; null means unknown. Call count_segment for a current count. |
| record_limit | No | Maximum members; null means no explicit cap |
| filter_groups | No | Complete saved filter definition; one AND group also represents a simple flat filter list |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| current_version | No | |
| workflow_run_id | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| upload_expires_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: async workflow behavior, pending statuses, 10–60 minute training, staged uploads with presigned URLs, token-handling warning, HITL defaults, usage-emission behavior, and creator scope requirement. These details materially help an agent understand side effects and operational sequencing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but justified by four distinct subtypes and a complex matched-upload workflow. It is front-loaded with purpose and subtype distinctions, though the single dense paragraph and repeated wait_for_segment guidance reduce readability slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema and rich annotations, the description still covers the operational gaps an agent needs: subtype-specific prerequisites, async monitoring, upload resolution sequence, HITL behavior, scope requirements, and campaign linkage. Nothing critical appears missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter documentation is already strong, but the description adds subtype-specific meaning: seed_description vs seed_segment_id, positive_class_segment_id, file_format/compression/shard interactions, campaign_id linkage, and create_audience behavior. It does not explain every parameter, but it adds useful semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a segment") and immediately clarifies segment subtypes and how segments differ from audiences. The subtype-specific behavior makes it easy to distinguish from sibling tools like create_audience, count_segment, and wait_for_segment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use each subtype and which follow-up tools to call: count_segment for filter counts, wait_for_segment for async similarity/propensity, and the analyze/confirm/cancel sequence for matched uploads. It also names the alternative actions when upload mappings are declined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deliver_audienceDeliver AudienceADestructiveInspect
Deliver an audience as a download. LiveRamp and Narrative remain unavailable until their partner pushes can confirm data egress; they cannot create delivery or usage charges. Download has no destination surcharge but still carries base/field delivery usage. Supply template_id OR field_list — not both. Call quote_delivery first: pricing depends on the audience version, selected fields, output settings, and current licensing. Returns delivery_id, status, cost, and (for download) download_urls[] once completed. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| field_list | No | Custom list of field names (alternative to template_id) | |
| audience_id | Yes | Audience to deliver | |
| destination | Yes | Active delivery destination | |
| template_id | No | Enrichment template ID from get_field_catalog() | |
| output_format | No | Output file format for download deliveries. Omit to auto-detect: matched audiences default to their uploaded file format; all others default to csv. | |
| include_unmatched | No | (matched subtype) Include rows that did not resolve to a real graph match — these get a best-effort derived iag_person_id (or null), not a real match. Defaults to true. | |
| output_compression | No | Explicit download compression. gzip supports csv/json/jsonl; Avro uses native DEFLATE and rejects outer gzip. Never inherited from input compression. | none |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| status | Yes | Current delivery state |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| delivery_id | Yes | |
| destination | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| download_urls | No | Fresh signed artifact URLs on an individual completed download delivery |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=false), the description discloses the cost model — no destination surcharge but base/field delivery usage still applies — and the 'creator' scope requirement, which the annotations never convey. It also states the response shape (delivery_id, status, cost, download_urls[] once completed), so an agent knows completion is asynchronous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six short sentences, front-loaded with the action and immediately followed by the two hard constraints (partner unavailability, the quote-first prerequisite). Every sentence carries operational information — pricing, parameter exclusivity, return values, scope — with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, charge-incurring, open-world delivery call, the description covers prerequisites, cost behavior, scope, parameter exclusivity, and completion semantics. An output schema exists, yet the brief return summary still helps an agent plan a wait_for_delivery follow-up; nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine meaning with the template_id/field_list mutual-exclusion rule that the schema does not state. It does not explain output_format, include_unmatched, or output_compression behavior, leaving those to the (already thorough) schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Deliver an audience as a download') and constrains the destination, so an agent knows exactly what the call produces. It does not explicitly contrast with the close sibling deliver_file_match or list_deliveries, but the audience-scoped, download-only framing still makes the target operation unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit sequencing ('Call quote_delivery first: pricing depends on...') and an explicit parameter rule ('Supply template_id OR field_list — not both'). It also names when the tool will fail for reasons outside the caller's control (LiveRamp and Narrative unavailable until partner push confirms egress), which is exactly the kind of precondition an agent cannot infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deliver_file_matchDeliver File MatchADestructiveInspect
Trigger download delivery for a file-based identity match job. Always delivers to download — returns a signed URL to the enriched output file. Use this instead of deliver_audience for matched segments created via create_segment(subtype=matched). The match_id is the segment_id returned by create_segment(subtype=matched) — delivery still routes through an audience wrapper internally. Matched segments do not support LiveRamp or Narrative destinations. Supply template_id OR field_list — not both. Use get_field_catalog() to browse options. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | The segment_id returned by create_segment(subtype=matched) — also accepted as match_id for backward compatibility | |
| field_list | No | Custom list of field names to include. Mutually exclusive with template_id. | |
| template_id | No | Enrichment template ID from get_field_catalog(). Mutually exclusive with field_list. | |
| webhook_url | No | Optional HTTPS URL to notify when delivery completes. | |
| output_format | No | Output file format. Defaults to csv if not specified. | |
| include_unmatched | No | Include rows that did not resolve to a known identity. Defaults to true. | |
| output_compression | No | Explicit output compression. gzip supports csv/json/jsonl; Avro uses native DEFLATE. | none |
Output Schema
| Name | Required | Description |
|---|---|---|
| cost | Yes | |
| status | Yes | Current delivery state |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| delivery_id | Yes | |
| destination | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| download_urls | No | Fresh signed artifact URLs on an individual completed download delivery |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: delivery always routes to download and returns a signed URL, matched segments don't support LiveRamp/Narrative, and the 'creator' scope requirement is disclosed. It doesn't fully clarify irreversibility or what a repeated call does (idempotentHint=false), so slightly short of full marks.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and delivery behavior, and most sentences carry distinct routing or constraint information. A few details (backward-compatibility phrasing aside) are dense but each earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema, full param coverage, and clarifying annotations, the description covers the workflow context an agent needs: what it returns, destination limits, auth scope, and param routing. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds value by explaining that match_id is the segment_id from create_segment (routing through an audience wrapper internally) and pointing to get_field_catalog for template_id discovery. This meaning goes beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Trigger download delivery') and resource ('file-based identity match job'), and explicitly distinguishes it from deliver_audience. The agent can identify exactly what the tool does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (deliver_audience) and the exact condition that selects this tool (matched segments from create_segment(subtype=matched)). Also states exclusions (no LiveRamp/Narrative destinations) and the template_id/field_list exclusivity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discovery_countDiscovery CountADestructiveInspect
Preview the count for one requested population; this does not create a saved audience. With segment_id, the current segment count snapshot is updated. Returns count and optional group_by breakdown. Use filters (AND conditions) or filter_groups (advanced compound filters), segment_id (resolve filters from a saved segment), audience_id (resolve from a saved audience), or segment_ids+set_logic (compose multiple segments, optionally with excluded_segment_ids for an ad-hoc "A minus B" preview). All inputs are mutually exclusive — providing more than one is rejected with AMBIGUOUS_INPUT. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | Raw flat Filter objects | |
| group_by | No | Field with groupable=true in get_field_catalog; mutually exclusive with automatic breakdowns | |
| set_logic | No | How to combine segment_ids (required when segment_ids is provided) | |
| segment_id | No | Saved segment ID (any subtype) — resolve its definition from the segment doc | |
| audience_id | No | Saved audience ID — resolve its composition via segment memberships (any subtype mix) | |
| segment_ids | No | Multiple segment IDs to compose | |
| filter_groups | No | Advanced compound filter groups | |
| include_breakdowns | No | When true, also return demographic/geographic breakdowns (slower). Default false. | |
| excluded_segment_ids | No | Ad-hoc "A minus B" preview — segments to subtract from the segment_ids composition, without persisting an audience |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of matching records |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this readOnlyHint=false and destructiveHint=true, and the description explains why: with segment_id the current segment count snapshot is overwritten. That is genuinely additive context beyond the annotations. But it stops there — it never states that the snapshot overwrite is irreversible or affects what other users see, which matters for a tool flagged destructive, and it gives no cost/slowness signal beyond 'slower' on include_breakdowns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the non-persistence caveat, then a single dense sentence enumerating input modes. Every clause earns its place, though the middle sentence is long enough that a reader may skim the exclusivity constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, zero-required tool with an output schema, the description covers what an agent needs: what is returned (count plus optional group_by breakdown), the input-mode exclusivity rule with its error code, the snapshot side effect, and the required 'discovery' scope. Return-value details are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3; the description earns above baseline by stating the mutual-exclusivity rule between filters, filter_groups, segment_id, audience_id and segment_ids+set_logic, which the schema does not encode. It also names the A-minus-B role of excluded_segment_ids. It adds little on group_by or set_logic beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Preview the count for one requested population') and immediately scopes it as non-persistent ('does not create a saved audience'), which separates it from create_audience/create_segment siblings. It does not explicitly distinguish itself from count_segment or recount_audience, so an agent still has to infer that division.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly enumerates the five input modes and tells the agent they are mutually exclusive, including the exact failure (AMBIGUOUS_INPUT). Missing is guidance on when to use this instead of the closely named siblings count_segment or recount_audience, so the routing advice is internal to the tool rather than across tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discovery_crosstabDiscovery CrosstabAInspect
Generate a cross-tabulation pivot table across two demographic dimensions. Returns rows, columns, bounded cells, total_count for the full population, displayed_count for visible cells, and truncated when row/column limits omit categories. Accepts EXACTLY ONE of: filters (flat array), filter_groups, segment_id, audience_id, or segment_ids+set_logic to define the audience population (more than one is rejected with AMBIGUOUS_INPUT). Grouped logic, saved audience exclusions, and record limits are preserved. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | Flat filter array to define the audience population | |
| max_cols | No | Maximum number of column values to return (default 10) | |
| max_rows | No | Maximum number of row values to return (default 20) | |
| col_field | Yes | Different field with groupable=true from get_field_catalog for pivot columns | |
| col_label | No | Human-readable label for the column dimension | |
| row_field | Yes | Field with groupable=true from get_field_catalog for pivot rows | |
| row_label | No | Human-readable label for the row dimension | |
| set_logic | No | How to combine segment_ids | |
| segment_id | No | Saved segment ID | |
| audience_id | No | Saved audience ID | |
| segment_ids | No | Multiple segment IDs to compose | |
| filter_groups | No | Compound filter groups |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| cells | Yes | |
| columns | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| col_field | Yes | |
| col_label | Yes | |
| row_field | Yes | |
| row_label | Yes | |
| truncated | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| total_count | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| displayed_count | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses traits annotations do not: cells beyond max_rows/max_cols are omitted and signalled via 'truncated', total_count vs displayed_count semantics, that grouped logic/exclusions/record limits are preserved, and the 'discovery' scope prerequisite. It does not explain why readOnlyHint is false for what reads as a query tool, leaving a small ambiguity about side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then the input rule, then prerequisites – a sensible order with no filler. The return-value sentence is a long comma-separated list that is slightly dense, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description need not spell out return fields, yet it names the key ones and, more importantly, the truncation and preservation semantics an agent cannot infer from schema alone. Only the readOnlyHint=false tension and the absence of any sibling routing keep it from being complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so baseline 3 applies, but the description adds a mutual-exclusion constraint the schema does not encode as oneOf/anyOf, plus the exact rejection error AMBIGUOUS_INPUT. That is real meaning beyond the schema for a 12-parameter tool with four alternative audience inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Generate a cross-tabulation pivot table across two demographic dimensions', and the required row_field/col_field confirm the shape. It never names the closest discovery siblings (discovery_count, discovery_overlap) or get_segment_demographics, so the agent must infer which of several demographic-reporting tools this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'EXACTLY ONE of ... (more than one is rejected with AMBIGUOUS_INPUT)' rule is genuinely useful selection guidance for how to build the audience. But there is no statement of when to pick a crosstab over a plain count or a single-dimension demographic breakdown, which are exactly the choices the sibling list presents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discovery_lookupDiscovery LookupAInspect
Return up to 25 masked sample rows for audience matching criteria. Accepts: filters (raw Filter objects), segment_id, audience_id, segment_ids+set_logic (optionally with excluded_segment_ids for an ad-hoc "A minus B" preview), or filter_groups. All inputs are mutually exclusive — providing more than one is rejected with AMBIGUOUS_INPUT. Saved compositions and their exclusions are preserved. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum masked sample rows, 1–25 (default 10) | |
| fields | No | Non-PII audience fields to preview; defaults to a small demographic selection. Discover fields with get_field_catalog. | |
| filters | No | Raw flat Filter objects | |
| set_logic | No | How to combine segment_ids | |
| segment_id | No | Saved segment ID (any subtype) — resolve its definition from the segment doc | |
| audience_id | No | Saved audience ID — resolve its composition via segment memberships (any subtype mix) | |
| segment_ids | No | Multiple segment IDs to compose | |
| filter_groups | No | Advanced compound filter groups | |
| excluded_segment_ids | No | Ad-hoc "A minus B" preview — segments to subtract from the segment_ids composition, without persisting an audience |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | Masked sample records |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| total_matched | Yes | Number of records matching the lookup |
| available_fields | Yes | Non-PII fields selected for this sample; use get_field_catalog to discover other fields |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial context beyond the annotations: the 'discovery' scope requirement (an auth prerequisite), the masked nature of returned rows, the mutual-exclusion rejection with a named error code, and the fact that saved compositions/exclusions are preserved and excluded segment previews are not persisted. One unresolved tension: annotations declare readOnlyHint=false and idempotentHint=false, which imply state changes/side effects (e.g. metered queries) that the read-like 'return sample rows' framing does not explain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output/scope statement is front-loaded, followed by the accepted input modes and the exclusivity rule. It is dense but nearly every clause carries operative information (error code, exclusion semantics, scope); it could be tightened marginally but wastes little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema handling return values and full schema coverage on inputs, the description covers what structured fields cannot: auth scope, mutual-exclusion behavior, masking, and composition preservation. It is complete enough to invoke correctly, with only the readOnlyHint=false side-effect ambiguity left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter, including nested filter operators and BETWEEN/LIKE semantics, is already documented in the schema. The description adds only the higher-level mutual-exclusion rule and the 'A minus B' semantics of excluded_segment_ids, so the schema does most of the work and baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Return up to 25 masked sample rows for audience matching criteria," and enumerates the accepted input modes (filters, segment_id, audience_id, segment_ids+set_logic, filter_groups). It is clear what the tool produces. It does not, however, distinguish itself from the sibling discovery_count/discovery_crosstab/discovery_overlap tools, so an agent must infer that this is the row-preview variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"All inputs are mutually exclusive — providing more than one is rejected with AMBIGUOUS_INPUT" gives real selection guidance among the input modes, and the excluded_segment_ids clause describes an ad-hoc preview path. But there is no explicit guidance on when to use this tool versus discovery_count or discovery_crosstab/the other discovery siblings, 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.
discovery_overlapDiscovery OverlapAInspect
Calculate the overlap between two audience criteria sets. Returns overlap_count, overlap_pct (percentage of the smaller population), and demographic_deltas. Each side (a and b) independently accepts EXACTLY ONE of: audience_id, segment_id, segment_ids+set_logic, filter_groups, or filters (more than one per side is rejected with AMBIGUOUS_INPUT). Saved composition, exclusions, and record limits are preserved. Empty optional distributions mean unavailable, not zero. Legacy: pass audience_id_a and audience_id_b at the top level for backward compatibility (mutually exclusive with a/b). Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| a | No | Side A input — any of the five discovery input shapes | |
| b | No | Side B input — any of the five discovery input shapes | |
| audience_id_a | No | (Legacy) First audience ID | |
| audience_id_b | No | (Legacy) Second audience ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| a_name | Yes | |
| b_name | Yes | |
| a_count | Yes | |
| b_count | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| warnings | No | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| overlap_pct | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| overlap_count | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| demographic_deltas | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false): it discloses the 'discovery' scope requirement, states that saved composition/exclusions/record limits are preserved, warns that empty optional distributions mean unavailable not zero, and documents the AMBIGUOUS_INPUT rejection. Minor gap: it doesn't clarify why readOnlyHint is false for what reads as a compute call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and return fields, then input constraints, then scope. Dense but every sentence carries real rules; the one slightly wasteful bit is listing the return fields despite an output schema existing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deeply nested tool with an output schema and annotations, the description covers the key gotchas an agent needs: one-input-per-side, ambiguity rejection, preserved composition, empty-distribution semantics, legacy parameters, and auth scope. Nothing materially missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
On top of 100% schema coverage, it adds the crucial 'EXACTLY ONE of' constraint per side that the schema cannot express with its current shape, and explains the audience_id_a/audience_id_b legacy alternates and their mutual exclusivity with a/b. Clear value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Calculate') and resource ('overlap between two audience criteria sets'), which is inherently distinguishable from siblings like discovery_count, discovery_crosstab, and discovery_lookup. However, it never names or contrasts those siblings, so the agent must infer which discovery tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes the required 'discovery' scope and the mutual-exclusivity rule for the legacy parameters, which implies when to use the modern a/b shape. But it never says when to choose this tool over discovery_crosstab or discovery_count, 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.
duplicate_audienceDuplicate AudienceAInspect
Create a duplicate of an existing audience with lineage tracking (parent_audience_id + derived_from root ancestor, segment versions pinned at duplicate time). The duplicate carries the source composition (segment_ids, excluded_segment_ids, set_logic), is immediately active, and starts with record_count null — call recount_audience for a fresh count. Optionally link the duplicate to a campaign. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the duplicate. Defaults to "<source name> (copy)" | |
| audience_id | Yes | ID of the audience to duplicate | |
| campaign_id | No | Optional campaign to link the duplicate to |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| set_logic | No | How included segments combine; excluded segments always subtract |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| campaign_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| segment_ids | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Saved composition count; null is unknown. Use recount_audience for a current value. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| excluded_segment_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: lineage tracking with parent_audience_id and derived_from, pinned segment versions, copied composition, immediate active status, null record_count, optional campaign linkage, and the required 'creator' scope. These details add substantial operational context not already present in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then efficiently covers lineage, copied composition, initial state, recount behavior, campaign linkage, and scope. The density is justified by the complexity of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of annotations and an output schema, the description supplies everything an agent needs to call this tool correctly: authorization scope, resulting-object behavior, lineage semantics, initial record_count state, and the need to call recount_audience for a fresh count.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents audience_id, name, and campaign_id fully. The description reinforces campaign linkage and the source-audience concept, but does not add meaningful parameter-level detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: duplicate an existing audience. It also states the resulting object's lineage, composition, active state, and initial record_count, which clearly distinguishes it from create_audience and other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use case clear: duplicate an existing audience, optionally link it to a campaign, and call recount_audience when a fresh count is needed. It does not explicitly name alternatives such as create_audience or duplicate_segment, so it is strong but not fully exhaustive on when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_segmentDuplicate SegmentAInspect
Create a duplicate of an existing segment. Preserves the source subtype and all subtype-specific data: filter criteria for filter segments; match results, column mappings, and match counts for matched segments; seed and generated-score references for similarity/propensity segments (underlying computed data is referenced, never recomputed). Lineage is recorded (parent_segment_id, derived_from root ancestor, parent_segment_version pin). Filter duplicates start with record_count null — trigger a recount with count_segment for a fresh count; matched/similarity/propensity duplicates carry the source's counts. Returns 409 SOURCE_MATCH_UNAVAILABLE when a matched source's match data is unavailable (expired/failed/incomplete match), or 409 SOURCE_NOT_READY when a non-matched source is pending or failed. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the duplicate. Defaults to "<source name> (copy)" | |
| segment_id | Yes | ID of the segment to duplicate |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| subtype | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| upload_url | No | |
| audience_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| upload_urls | No | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Stored count; null means unknown. Call count_segment for a current count. |
| record_limit | No | Maximum members; null means no explicit cap |
| filter_groups | No | Complete saved filter definition; one AND group also represents a simple flat filter list |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| current_version | No | |
| workflow_run_id | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| upload_expires_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (not read-only, not destructive, not idempotent); the description adds substantial context beyond that — what is preserved per subtype, that computed data is referenced rather than recomputed, lineage fields recorded, the null record_count side effect, two distinct 409 error codes, and the required scope. That is exactly the kind of behavior an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then failure modes and permissions — a sensible order. The subtype enumeration is dense but each clause carries real information; still, the sentence is long enough that trimming would improve scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, and the description covers the remaining pieces an agent needs: preserved data per subtype, lineage side effects, count semantics, permission requirement, and specific error conditions. Nothing material is missing for a 2-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema itself documents the name default ("<source name> (copy)") and segment_id. The description adds no parameter-level syntax or format meaning beyond implying segment_id identifies the source, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create a duplicate of an existing segment") and immediately scopes it by enumerating what is carried over per subtype. An agent can distinguish this from create_segment because duplication semantics (preserved subtype data, lineage) are spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes to a sibling: "Filter duplicates start with record_count null — trigger a recount with count_segment for a fresh count." It also gives the preconditions under which the call will fail (unavailable match data, pending/failed source) and the required 'creator' scope. It stops short of explicitly contrasting duplicate_segment with create_segment, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_usageGet Account UsageARead-onlyIdempotentInspect
Read this organization’s segment and audience totals, delivery count for the last 30 days, rated current-period spend in cents, billing projection freshness, and compute-ceiling usage percentage. Does not create a charge or change the account. Requires 'account-read' scope.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| segment_count | Yes | |
| audience_count | Yes | |
| deliveries_30d | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| compute_usage_pct | Yes | |
| billing_projection | Yes | |
| current_period_spend_cents | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description still adds genuinely new behavioral facts beyond them: it requires the 'account-read' scope and it explicitly reassures the agent that calling it will not create a charge or modify the account, which matters for a billing-adjacent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence enumerating the payload, followed by a non-mutation guarantee and the scope requirement. No filler, and the key content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so enumerating return fields in the description is partly redundant, but it usefully helps selection. Auth scope and non-mutation semantics are covered; only the relationship to sibling billing tools is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. The description correctly implies the org context is implicit rather than passed in.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Read') and resource ('this organization's usage') and enumerates the exact metrics returned: segment/audience totals, 30-day delivery count, rated spend in cents, projection freshness, compute-ceiling percentage. That specificity makes it hard to confuse with the write/mutation siblings, though it never names the adjacent billing siblings (check_balance, check_topup_status) explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the read-only framing and the scope requirement; there is no explicit 'use this when you need X instead of check_balance/check_topup_status' routing. An agent can infer it is the aggregate usage snapshot, but the choice among billing-related tools 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_audienceGet AudienceAIdempotentInspect
Get customer-facing details of an audience, including expanded segment summaries and composition. Use when the user wants to reload, inspect, or rerun a specific saved audience. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | The audience ID returned by list_audiences or create_audience |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| set_logic | No | How included segments combine; excluded segments always subtract |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| campaign_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| segment_ids | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Saved composition count; null is unknown. Use recount_audience for a current value. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| excluded_segment_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent/non-destructive/non-open-world, and the description adds a genuinely useful auth requirement ('Requires discovery scope'). However, it never explains the notable annotation quirk that this 'Get' tool is marked readOnlyHint=false, nor what the 'rerun' wording implies about side effects. With annotations present the bar is lower, but that gap is material for a tool that may mutate state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and payload contents, followed by usage and auth. Nothing is repeated, though 'reload, inspect, or rerun' is a slightly loose triple that pads the usage cue without sharpening it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Low-complexity getter with one param described in full and an output schema that already covers return values, so the description needn't restate them. The scope requirement and payload summary make it callable without guesswork; only sibling routing against get_audience_demographics/get_segment_audiences is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single audience_id parameter has 100% schema description coverage, including its provenance ('returned by list_audiences or create_audience'). The description adds only 'a specific saved audience', so the schema does essentially all the work — baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get customer-facing details of an audience') and adds what the payload contains (expanded segment summaries and composition), which goes beyond the bare name. It doesn't differentiate itself from near-neighbors like get_audience_demographics, get_segment_audiences, or list_audiences, so it falls short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an implied usage cue ('when the user wants to reload, inspect, or rerun a specific saved audience'), which is more than nothing. But it names no alternative and gives no when-not guidance — an agent can't tell from this text whether to call get_audience, list_audiences, or refresh_audience for a given request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audience_demographicsGet Audience DemographicsAInspect
Profile a saved audience composition, including its segment set logic and exclusions. Returns a BigQuery-computed demographic breakdown, including median age, gender split, homeowner %, children %, college-educated %, and high-income %. Results are cached server-side for 20 minutes. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | The audience ID to retrieve demographics for |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| extra_field | No | |
| total_count | Yes | |
| generated_at | Yes | ISO timestamp of the demographic snapshot |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| age_breakdown | Yes | |
| audience_name | Yes | |
| geo_breakdown | Yes | |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| breakdown_extra | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the auth requirement ('discovery' scope), the backend that computes the data (BigQuery), and a 20-minute server-side cache – all behaviorally relevant. The caching note is also useful given the annotations declare idempotentHint=false and readOnlyHint=false for what reads as a query operation, though the description never explicitly asserts a write, so this is not a direct contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what it does, what it returns, then operational constraints (cache, scope). Purpose is front-loaded and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is not the description's job, and it covers the important gaps (scope, caching, computation source). The only missing piece is routing guidance versus the segment-demographics sibling, which matters for an agent choosing among many demographic/count tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single audience_id parameter is fully documented there, so baseline 3 applies. The description adds no syntax, format, or case-sensitivity hints for the ID beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Profile a saved audience composition') and enumerates the returned metrics, so it is clearly distinguished from a generic fetch. It does not explicitly name the segment-oriented sibling get_segment_demographics as the alternative, so differentiation is implicit 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description supplies a prerequisite ('Requires discovery scope') but gives no explicit when-to-use guidance and does not point to alternatives such as get_segment_demographics or count_segment. Usage must be inferred from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_campaignGet CampaignARead-onlyIdempotentInspect
Retrieve customer-facing details for a campaign including its brief and linked audience summaries. Use when the user asks about a specific campaign or wants to see what audiences are in it. Linked segments are summaries; call get_segment with a segment ID to inspect its filter_groups definition. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | The campaign ID to retrieve |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| audiences | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds real value on top: the required 'discovery' scope and the caveat that linked segments are summaries rather than full definitions. It stops short of covering error behavior for a missing campaign_id, which keeps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose, then usage conditions, then the sibling handoff and scope requirement. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 spelled out, yet the description still orients the agent to brief and audience content. Hot path, sibling escape hatch, and auth scope are all covered for a one-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single campaign_id parameter, so the schema already carries the semantics. The description adds no format or sourcing hints for the ID beyond what the schema states, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (retrieve) plus resource (campaign) plus the contents returned (brief and linked audience summaries). It is clearly distinguishable from list_campaigns, create_campaign, update_campaign, and from get_segment, which it explicitly routes to for deeper segment detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States explicitly when to use it (user asks about a specific campaign or wants its audiences) and names the alternative tool with the condition that selects it: get_segment for filter_groups definitions. It also sets expectations that linked segments are only summaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_releaseGet Data ReleaseAInspect
Return the platform current data-release version (current_release_major/minor). Compare against a match_records result's resolution_action to tell whether a direct Refresh returned data unchanged since it was last delivered ("current") or potentially updated ("refreshed"). Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | Yes | ISO timestamp of the registry snapshot |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| current_release_major | Yes | |
| current_release_minor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description frames this purely as a read ('Return the platform current data-release version'), yet annotations declare readOnlyHint=false and idempotentHint=false without the description reconciling that. The description does add genuine behavioral context (discovery-scope requirement, and how the value is interpreted against resolution_action), but the unreconciled read/write signal is a real inconsistency an agent could act on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, with the purpose front-loaded before the usage explanation. The second sentence is somewhat convoluted (nested quotes, long clause) but every element carries information; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 is not required. The description still supplies the two field names, the scope prerequisite, and the interpretive rule tying the result to match_records. The main gap is not addressing the non-read-only annotation, which an agent would want clarified for a simple getter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the baseline is 4. The description correctly introduces no parameter discussion and instead directs attention to the response fields (current_release_major/minor), which is the right focus for a no-arg tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Return the platform current data-release version (current_release_major/minor).' It also names the related sibling, match_records, so the agent can place it in a workflow. It stops short of explicitly contrasting with other getter/list tools (get_match_run, get_workflow_status), but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says concretely when to reach for it: compare its value against a match_records result's resolution_action to interpret 'current' vs 'refreshed'. It also states the prerequisite ('Requires discovery scope'). It does not state any exclusion or what to do instead if the scope is missing, which keeps it out of 5 territory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_deliveryGet DeliveryARead-onlyIdempotentInspect
Get status and details of a single delivery. Returns fresh 24-hour download_urls[] for completed download deliveries while the artifact is retained; expires_at is the artifact retention date, not the signed-link expiry. Use this to poll status after deliver_audience returns status: processing. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | Audience the delivery belongs to | |
| delivery_id | Yes | Delivery ID returned by deliver_audience |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Current delivery state |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| download_urls | No | Fresh signed artifact URLs on an individual completed download delivery |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint, idempotentHint, and destructiveHint=false, the description explains important return behavior: fresh 24-hour download_urls[] while the artifact is retained, and that expires_at is artifact retention rather than signed-link expiry. It also discloses the required 'discovery' scope, adding auth context not conveyed by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then adds the most important return caveat, the polling use case, and auth requirement. Every sentence contributes distinct, useful information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations cover safety and idempotency, and schema coverage is complete. The description fills the remaining gaps by explaining polling usage, download URL freshness, retention semantics, and required scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are already documented in the schema. The description does not add parameter syntax or format details beyond what the schema provides, so it meets the baseline for fully covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get status and details of a single delivery.' It distinguishes itself from list-oriented siblings by emphasizing 'single delivery' and from deliver_audience by describing polling after delivery creation. It does not explicitly contrast with wait_for_delivery, which is the closest sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: 'Use this to poll status after deliver_audience returns status: processing.' It also states the required 'discovery' scope. However, it does not mention when to prefer wait_for_delivery or how this differs from list_deliveries for multiple deliveries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_field_catalogBrowse Field CatalogARead-onlyIdempotentInspect
Discover a bounded page of fields, descriptions, accepted aliases, allowed filter operators, coded values and coverage definitions. Search zip or zip_code for the canonical zip5 field. State publishes two-letter codes and full-name labels; either input is accepted. Defaults to filterable audience fields; use purpose=enrichment for all output fields. feature_store fields are enrichment-only unless also tagged audience. Follow next_cursor for more fields; for more enum values pass field_name and values_next_cursor as value_cursor. Pricing is opt-in. Requires discovery scope. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum fields per page; response size may shorten the page | |
| cursor | No | next_cursor returned by the previous page | |
| search | No | Case-insensitive search across field names, accepted aliases, labels and descriptions | |
| purpose | No | Default filter: show fields usable for population filters. Use enrichment for all selectable output fields. Explicit product_usage, template_id or field_name overrides this default. | filter |
| field_name | No | Retrieve one exact field, including a page of its coded values | |
| template_id | No | Show fields in this delivery template | |
| value_limit | No | Maximum enum values per field; defaults to 100 for one field or 25 in a list | |
| value_cursor | No | values_next_cursor from a field; requires field_name | |
| product_usage | No | Filter by supported product usage | |
| include_pricing | No | Include account-specific pricing; requires configured billing |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| fields | Yes | Selectable output fields; audience filtering remains audience-tagged only |
| pricing | Yes | Organization prices when include_pricing=true; otherwise null |
| guidance | No | Interpretation or recovery guidance for this result |
| templates | Yes | Templates; request template_id to page their fields |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_cursor | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds meaningful operational context beyond that: bounded pagination, default filterable-audience scope, enrichment-only feature_store fields, opt-in pricing, and required discovery scope. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and information-dense, covering the most important defaults and cursor flow early. It is slightly repetitive, especially the duplicated statement that the tool requires discovery scope, which prevents a perfect conciseness score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 10 optional parameters, an output schema, and clear annotations; the description covers pagination, default filtering, enrichment mode, pricing opt-in, and scope requirements. An agent has enough context to invoke and paginate correctly without needing return-value details the output schema already provides.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter meanings are already largely documented. The description still adds useful semantics, including zip_code alias handling, state two-letter/full-name inputs, purpose default behavior, and value_cursor usage, though it leaves several parameters to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: discovering a bounded page of catalog fields, including aliases, operators, coded values, and coverage. It is clear what the tool does, but it does not explicitly distinguish itself from related discovery siblings such as discovery_lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage guidance: use purpose=enrichment for output fields, follow next_cursor for more fields, pass field_name plus values_next_cursor for more enum values, and opt in to pricing. It does not state when to use this tool instead of sibling discovery tools, so the alternative-tool guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_match_jobGet File Match JobARead-onlyIdempotentInspect
Retrieve a single file-based identity resolution job by its match_id (= segment_id). Returns full details including matching_status, amount_charged, file_format, compression, field_counts, source_job_id, audience_id, audience_status, and error_message if failed. amount_charged is null until this run first participates in a successful delivery, then shows its one-time pending match-usage estimate; it excludes delivery usage. audience_status (active/archived/null) reports whether the linked audience is still open-able in Library. mapping_warnings lists problems with how the file's columns were used (code nested_addresses means the addresses column was ignored in whole or part) — tell the user about any entries. Use to check job progress after create_segment(subtype=matched), or to retrieve the audience_id for delivery. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | The match_id (segment_id) returned by create_segment(subtype=matched) or list_file_match_jobs |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| match_id | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. Beyond that, the description adds substantial behavioral context: amount_charged is null until a successful delivery participation, audience_status reflects whether the linked audience remains open-able in Library, and mapping_warnings should be reported to the user. It also discloses the required scope, which is important for invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and is organized around usage, return details, and caveats. It is somewhat dense because it lists many return fields even though an output schema exists, but most of the extra text earns its place through semantic caveats like amount_charged and mapping_warnings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and strong annotations, the description is complete enough for correct invocation. It covers purpose, usage contexts, important return-field semantics, warnings interpretation, and required scope. Nothing critical appears to be missing for an agent deciding whether and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the match_id parameter is already well documented in the schema. The description adds useful equivalency information by clarifying that match_id is the segment_id and that it is returned by create_segment(subtype=matched) or list_file_match_jobs. This meaningfully augments the already-complete schema without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it retrieves a single file-based identity resolution job by match_id. It clearly distinguishes this from the list operation by saying 'single' and by explaining that match_id is the segment_id. An agent can identify exactly what this tool does without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage contexts: checking job progress after create_segment(subtype=matched) and retrieving audience_id for delivery. It also states the required 'discovery' scope. However, it does not explicitly compare this with list_file_match_jobs or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_integration_runGet Integration RunARead-onlyIdempotentInspect
Get one retained integration run by run_id. Returns customer-safe provenance, selected fields, record counts, processing status, and billing rail; intermediate workflow artifacts are not exposed. Use an ID from list_integration_runs. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | Integration run ID returned by list_integration_runs |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| counts | Yes | |
| run_id | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| provider | Yes | |
| count_unit | No | |
| created_at | Yes | |
| page_count | No | Number of objects on this page, not the organization total |
| updated_at | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| connection_id | Yes | |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuine behavioral context: the run must be a 'retained' run, the payload is 'customer-safe provenance' with 'intermediate workflow artifacts... not exposed', and a 'discovery' scope is required. That is meaningful disclosure beyond the annotation set, though nothing is said about behavior when the run is missing or expired.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences ordered purpose, return shape, then usage and prerequisite. No filler, and the core action is front-loaded in the first clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so the description does not need to enumerate return fields, yet it still characterizes the payload and explicitly notes what is excluded. Combined with the ID source and scope requirement, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema coverage, the schema already carries the full meaning of run_id including its source. The description's 'by run_id' and the list_integration_runs pointer duplicate rather than extend that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one retained integration run by run_id') and immediately scopes it against the sibling list_integration_runs. An agent can tell this single-record fetch apart from the list operation without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use an ID from list_integration_runs' gives the explicit sourcing rule and 'Requires discovery scope' states an auth prerequisite. It stops short of ruling out lookalike siblings such as get_workflow_status or get_match_run, which is the only missing piece.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_match_runGet Match RunARead-onlyIdempotentInspect
Retrieve a single micro-batch match run by its run_id. Returns full details: match_count, match_rate, input_record_count, amount_charged (a conservative pending-usage estimate, not a finalized invoice amount), field_list, status, created_at, expires_at. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| run_id | Yes | The match run ID returned by list_match_runs or a prior match_records call |
Output Schema
| Name | Required | Description |
|---|---|---|
| run_id | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| match_count | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| input_record_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds useful behavioral context beyond annotations by stating the required 'discovery' scope and clarifying that amount_charged is a conservative pending-usage estimate rather than a finalized invoice amount; it does not describe error behavior, but that is a minor gap for this simple read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is two compact sentences, front-loading the action and then the returned details and scope requirement. Every clause provides useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with an output schema and full annotations, the description covers the key missing context: required scope and the caveat around amount_charged. The only notable omission is an explicit statement of how it relates to list_match_runs and match_records as alternatives, but the schema makes that relationship inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the run_id parameter is fully documented as coming from list_match_runs or a prior match_records call. The description only restates 'by its run_id' and adds no syntax, format, or further semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') and resource ('single micro-batch match run by its run_id'). The word 'single' distinguishes it from list_match_runs, and the schema's run_id description ties it to list_match_runs and match_records, so an agent can identify its role without opening those tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies it is used after obtaining a run_id from list_match_runs or match_records and states the required 'discovery' scope, but it does not explicitly say when to choose this tool over siblings or when not to use it. Usage is therefore inferable rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_saved_integration_segment_buildGet Saved Integration Segment BuildARead-onlyIdempotentInspect
Check a saved-match segment materialization by materialization_id after build_saved_integration_segment. Returns aggregate progress/status and the durable segment ID once complete; it does not start another build. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| materialization_id | Yes | Materialization ID returned by build_saved_integration_segment |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| status | Yes | |
| preview | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| failure_code | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| collection_id | Yes | |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| identity_count | Yes | |
| failure_message | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| target_segment_id | Yes | |
| materialization_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the required 'discovery' scope and what the call yields (aggregate progress/status plus the durable segment ID once complete). It does not describe what a partial/incomplete status looks like or whether repeated polling is expected, which would have pushed it higher.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the identification/precondition comes first, the return contract and the negative constraint follow. Every clause carries information an agent would otherwise have to infer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 spelled out, and the description still summarizes them; the scope requirement is a useful addition. It leaves minor gaps around polling behavior and the status vocabulary for a long-running check, but nothing essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains that materialization_id comes from build_saved_integration_segment, so the description's restatement adds little. Baseline 3 is appropriate for a single fully-documented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — check a saved-match segment materialization by materialization_id — and explicitly disambiguates from build_saved_integration_segment by noting it does not start another build. An agent can distinguish it from the build sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"after build_saved_integration_segment" gives a clear precondition for when to call it, and "it does not start another build" excludes the most likely misuse. There is no explicit mention of polling cadence or of an alternative (e.g. wait_for_segment-style blocking helper), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_segmentGet SegmentBIdempotentInspect
Fetch one segment by segment_id. Returns its customer-facing subtype, status, count, and subtype-specific fields. Filter segments include the complete filter_groups definition and current_version; matched and model-generated segments expose their own relevant fields. Use to inspect a definition before modifying or composing it. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | Yes | The segment ID to retrieve |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| subtype | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Stored count; null means unknown. Call count_segment for a current count. |
| record_limit | No | Maximum members; null means no explicit cap |
| filter_groups | No | Complete saved filter definition; one AND group also represents a simple flat filter list |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| current_version | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description presents a pure read operation ('Fetch', 'inspect'), while annotations declare readOnlyHint=false, indicating the tool is not read-only. That is a direct contradiction; although scope and return-shape context are provided, the annotation conflict dominates the behavioral assessment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then adds return-shape and scope details. It is somewhat long for a one-parameter read tool, especially since an output schema exists, but the sentences are purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the required parameter, return content, and auth scope, and an output schema exists. However, it does not address the non-read-only behavior implied by readOnlyHint=false, leaving a meaningful behavioral gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single segment_id parameter is fully documented in the schema. The description says the segment is fetched 'by segment_id' but adds no format or constraint details beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Fetch one segment by segment_id.' It also clarifies the scope by saying one segment is retrieved, which naturally distinguishes this from list_segments and related mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear positive use case: 'Use to inspect a definition before modifying or composing it,' and notes the required 'discovery' scope. It does not explicitly name when not to use it or point to specific alternatives such as list_segments or patch_segment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_segment_audiencesGet Segment AudiencesARead-onlyIdempotentInspect
List every audience that references a segment, with campaign linkage. Returns audiences[] ({id, name, campaign_id, status, record_count}), audience_count, and campaign_count. Use before archiving, refreshing, or editing a segment to understand downstream impact, or when the user asks where a segment is used across campaigns. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | Yes | The segment ID to look up referencing audiences for |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| audiences | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| audience_count | Yes | |
| campaign_count | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuinely new context beyond annotations: the required 'discovery' scope (an auth prerequisite the agent cannot infer elsewhere) and the downstream-impact purpose. It stops short of noting volume/limits on large segment fan-out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then usage triggers and the scope requirement — no wasted sentences. The enumeration of return fields is mildly redundant given an output schema exists, but it is compact and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich annotation set and an output schema, the description only needs to add purpose, usage triggers, and prerequisites — all of which it supplies, including the 'discovery' scope. Nothing an agent needs to select or call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single parameter with 100% schema description coverage, so the schema already explains segment_id. The description adds no format, lookup, or edge-case guidance (e.g., what happens for an unknown segment ID) beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List every audience that references a segment') with explicit scope ('every') plus campaign linkage, which distinguishes it from siblings like get_segment or list_audiences. An agent knows exactly what it returns 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggering scenarios: before archiving, refreshing, or editing a segment, or when the user asks where a segment is used across campaigns. That implicitly points at siblings such as archive_segment and refresh_segment, though it never explicitly names alternatives or states when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_segment_demographicsGet Segment DemographicsAInspect
Profile one saved segment on its own, without any audience set logic or exclusions. Returns a BigQuery-computed demographic breakdown (age buckets, geography, and a behavioral/financial extra when available) evaluated directly over the segment's own definition — the segment-level path, with no audience composition (set_logic/exclusions) applied. Works for any subtype (filter, matched, similarity, propensity) — non-filter subtypes resolve via the same underlying ID-set composition audiences use. Results are cached server-side for 20 minutes. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | Yes | The segment ID to retrieve demographics for |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| extra_field | No | |
| total_count | Yes | |
| generated_at | Yes | ISO timestamp of the demographic snapshot |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| segment_name | Yes | |
| age_breakdown | Yes | |
| geo_breakdown | Yes | |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| breakdown_extra | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond the annotations: server-side caching for 20 minutes, the required 'discovery' scope, and that non-filter subtypes resolve through the same ID-set composition used by audiences. This is useful operational detail. It does not, however, explain why annotations mark the tool as non-read-only and non-idempotent (presumably BigQuery job cost), leaving a small gap between declared hints and described behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core scope in the first sentence and keeps the remainder dense with substantive detail. Minor redundancy: 'without any audience set logic or exclusions' and 'no audience composition (set_logic/exclusions) applied' restate the same exclusion twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't enumerate return fields, yet it still summarizes them (age buckets, geography, optional behavioral/financial extra). Combined with caching, scope, and subtype handling, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema description coverage is 100%, so the schema already fully documents segment_id. The description adds no format, sourcing, or validation detail about the ID, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Profile one saved segment') and pins down the scope precisely: demographics computed over the segment's own definition with no audience composition. The contrast with the audience-level path implicitly separates it from siblings like get_audience_demographics and get_segment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes clear this is the segment-level path with no set_logic/exclusions applied, which tells an agent when to pick it over an audience-composition tool, and it notes applicability to all subtypes (filter, matched, similarity, propensity). It stops short of naming the alternative sibling explicitly ('use get_audience_demographics instead when...'), so a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflow_statusGet Workflow StatusBDestructiveInspect
Check the current status, step, and gate info for a running similarity or propensity segment workflow. Returns status, current_step, step_count, paused_gate when awaiting a decision, and failure with a code and next action when failed. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_run_id | Yes | The workflow run ID returned by create_segment(subtype=similarity/propensity) |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| failure | No | Safe failure reason and next action when status is failed |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | No | |
| step_count | Yes | |
| audience_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| paused_gate | No | |
| current_step | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| workflow_run_id | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description describes a read-only inspection operation ('Check the current status'), but annotations declare readOnlyHint=false and destructiveHint=true. This is a direct contradiction, so the behavioral transparency score is forced to 1 despite the description otherwise disclosing return fields and scope requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the core purpose and followed by return-value and auth details. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool returns, failure behavior, and required scope, which is strong for a status tool. It could better route the agent to respond_to_workflow_gate when paused_gate is present, but with an output schema available the omission is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter with 100% schema description coverage, including its origin from create_segment(subtype=similarity/propensity). The description adds no syntax or format detail beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: checking status, step, and gate info for a running similarity or propensity segment workflow. It distinguishes itself from siblings such as wait_for_workflow and respond_to_workflow_gate by focusing on inspection rather than blocking or decision-making.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context (running similarity or propensity workflows) and mentions paused_gate when awaiting a decision, implying usage. However, it does not explicitly say to use respond_to_workflow_gate when a gate is paused or wait_for_workflow when blocking is desired, so alternatives are left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_audience_to_campaignLink Audience to CampaignADestructiveIdempotentInspect
Link an existing audience to a campaign. Each audience can belong to at most one campaign. This is idempotent — calling it again for an already-linked pair is safe. Fails with AUDIENCE_ALREADY_LINKED (naming current_campaign_id) if the audience is already in a different campaign — unlink it there first. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | The audience ID to link | |
| campaign_id | Yes | The campaign ID to link the audience to |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the requested action succeeded |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| campaign_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, and the description reinforces the idempotency while adding genuinely new context: the exclusive-membership constraint, the AUDIENCE_ALREADY_LINKED error code with the current_campaign_id it returns, and the 'creator' scope requirement. It does not explain why the operation is flagged destructive, which would be the last missing piece.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with the core action and cardinality rule front-loaded, followed by idempotency, error handling, and auth. Every sentence carries information, though the idempotency clause partially restates the idempotentHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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. With auth scope, failure code, exclusivity constraint, and idempotency all covered, an agent has everything needed to invoke this correctly and interpret the likely error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both required parameters, so the schema already explains audience_id and campaign_id. The description adds no format, syntax, or lookup guidance beyond the IDs themselves, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb+resource ('Link an existing audience to a campaign') in the first sentence, immediately narrowed by the cardinality rule 'Each audience can belong to at most one campaign'. That rule distinguishes it functionally from the sibling unlink_audience_from_campaign and from create_audience.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the precondition for success and what to do when it fails: 'unlink it there first' when the audience is already in a different campaign. It also tells the agent that repeat calls are safe, which removes a common hesitation. It stops short of naming the unlink sibling tool explicitly, leaving the agent to infer it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_all_deliveriesList All DeliveriesARead-onlyIdempotentInspect
Search org delivery history across audiences with pagination. Supports status, destination, and audience_id filters, Use audience_id to narrow the search to one audience, or list_deliveries for its latest 100 deliveries. Signed download links are omitted; call get_delivery for one completed artifact. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum deliveries to return, 1–100 (default 25) | |
| cursor | No | Opaque pagination cursor from a previous response | |
| status | No | Only deliveries with this status | |
| audience_id | No | Only deliveries for this audience | |
| destination | No | Only deliveries to this destination |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| deliveries | Yes | Delivery summaries; signed download URLs are omitted from history |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, and the description adds genuinely new context: pagination exists, signed download links are omitted from responses, and a 'discovery' scope is required. It stops short of describing rate limits or link expiry, but the auth and output caveats are the ones an agent would otherwise trip on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scope statement and the alternative routing are front-loaded in a compact sequence of sentences, and each carries information. Minor deduction for the run-on comma splice ('filters, Use audience_id') that slightly muddles the transition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return shape needn't be explained, and the description still covers the two things the schema can't convey: missing download links and required scope. Cursor mechanics and page-size limits are left to the schema, which is acceptable given 100% coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and every parameter is documented there, so the description's mention of status/destination/audience_id filters mostly restates the schema. The one added nuance is that audience_id collapses the search to a single audience, but limit and cursor are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search org delivery history across audiences') with scope (org-wide, paginated), which cleanly separates it from the audience-scoped list_deliveries and the single-item get_delivery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use audience_id to narrow to one audience, use list_deliveries for its latest 100, and call get_delivery for a single completed artifact. Both alternatives are named with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_audiencesList AudiencesARead-onlyIdempotentInspect
List a page of non-archived saved audiences for this organization, including status, saved count and campaign_id (null when the audience is in no campaign). Use to find an audience_id before get_audience, recount_audience, or delivery; pass a limit of 1–100. Pass campaign_id to list one campaign's audiences, or unlinked=true for audiences in no campaign (not both). A filtered page can hold fewer than limit audiences — keep following next_cursor until it is null. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of audiences to return (default 10; maximum 100) | |
| cursor | No | next_cursor from a previous response | |
| compact | No | Return small summaries by default. Use the matching get tool for a complete definition, or compact=false for full entries. | |
| unlinked | No | When true, only audiences that belong to no campaign. Do not combine with campaign_id. | |
| campaign_id | No | Only audiences linked to this campaign (newest link first). Use list_campaigns to find campaign IDs. | |
| include_archived | No | Include archived objects so they can be found and restored |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Number of audiences on this page |
| guidance | No | Interpretation or recovery guidance for this result |
| audiences | Yes | Saved audience summaries |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_cursor | Yes | Cursor for the next page, or null |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, non-destructive semantics. The description adds real value beyond them: the auth requirement ('discovery' scope) and the pagination caveat that a filtered page may hold fewer than limit entries and that next_cursor must be followed until null.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but zero-waste: the core purpose and returned fields are front-loaded, then usage, filtering constraints, pagination, and auth follow in a tight sequence. Every sentence carries distinct operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't be fully spelled out, yet the description still flags key fields. Combined with auth scope and pagination guidance, an agent has everything needed to call this correctly for a six-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all six params, and the baseline is 3. The description adds meaning beyond it by stating the campaign_id/unlinked mutual exclusion and the cursor-until-null loop, though it doesn't elaborate on compact or include_archived behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list a page of non-archived saved audiences for this organization) and names the returned fields (status, saved count, campaign_id). This clearly distinguishes the collection operation from the single-object get_audience sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: 'Use to find an audience_id before get_audience, recount_audience, or delivery.' It also states the mutually exclusive filter condition (campaign_id or unlinked, not both) and the limit range, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_campaignsList CampaignsARead-onlyIdempotentInspect
List a page of campaigns for the organisation. Use when the user asks "what campaigns do I have?" or "show my active campaigns". Returns each campaign brief and status; use get_campaign for linked audience details. Pass the returned next_cursor as cursor to fetch another page. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum campaigns per page (default 10) | |
| cursor | No | next_cursor from a previous list_campaigns page | |
| status | No | Optional filter by campaign status | |
| compact | No | Return small name/status summaries by default; set false for each saved brief and timestamps. Call get_campaign for linked audiences. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| campaigns | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_cursor | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds behavior they cannot express: what is returned per item (campaign brief and status), how pagination works ('pass the returned next_cursor as cursor'), and that a 'discovery' scope is required. It stops short of ordering guarantees or rate limits, which keeps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each doing distinct work: purpose, trigger examples, return shape, pagination, and auth. The primary capability is front-loaded before the sibling routing and pagination detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated list tool with an output schema, an authorisation requirement, and a clear sibling, this covers everything an agent needs: what it returns, how to page, when to prefer get_campaign, and what scope is needed. Return-value specifics are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a cross-field contract the schema cannot show: the output's next_cursor is the input for cursor to fetch another page. It also frames the status filter through the 'show my active campaigns' example, giving the enum a usage anchor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb ('List'), resource ('campaigns'), scope ('for the organisation'), and pagination semantics ('a page of'). It also distinguishes itself from get_campaign by name, so an agent can separate the two 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It quotes concrete user utterances ("what campaigns do I have?", "show my active campaigns") that select this tool, and explicitly routes linked audience lookups to get_campaign as the alternative. The scope prerequisite ('discovery') is stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_deliveriesList DeliveriesARead-onlyIdempotentInspect
List up to 100 deliveries for one accessible saved audience. This audience-scoped path checks the audience and its member segments before returning history. Signed download links are omitted; call get_delivery for one completed artifact. Use list_all_deliveries for an org-wide paginated search. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | Audience whose delivery history to fetch |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| deliveries | Yes | Delivery summaries; signed download URLs are omitted from history |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent read, so this dimension is additive — and the description adds real context beyond them: a 100-item result cap, the fact that the audience and its member segments are validated before history is returned, and that signed download links are deliberately omitted. That is exactly the operational behavior an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying a distinct load: cap and scope first, then the validation behavior, then the link omission and sibling routing, then the scope requirement. Zero redundancy and front-loaded with the most decision-relevant facts.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 single parameter is fully covered. Combined with the safety annotations, the description supplies everything needed to decide whether and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single audience_id parameter is already documented and the baseline is 3. The description adds the qualifier that the audience must be 'accessible' and that it is 'one' audience, which conveys an authorization/quantity constraint the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list deliveries) plus explicit scope ('for one accessible saved audience'). It also names the two sibling tools that cover adjacent cases (get_delivery, list_all_deliveries), so the agent can distinguish this tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use this for a single audience's history, call get_delivery for one completed artifact, and use list_all_deliveries for an org-wide paginated search. It also states the prerequisite ('Requires discovery scope'), leaving nothing to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_file_match_deliveriesList File Match DeliveriesARead-onlyIdempotentInspect
List deliveries for a file-based identity match job, including status and delivery IDs. Signed download links are omitted from history; call get_delivery for a specific completed delivery. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | The segment_id returned by create_segment(subtype=matched), also accepted as match_id |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| deliveries | Yes | Delivery summaries; signed download URLs are omitted from history |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
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 adds the genuinely useful caveat that signed download links are omitted from history, plus the required 'discovery' scope. It doesn't mention pagination or result limits, which keeps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned, then the caveat, then the alternative and the scope requirement. No redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple read tool with an output schema, full param coverage, and complete annotations; the description supplies the missing pieces an agent needs (link omission, get_delivery alternative, scope). Only the relationship to other delivery-listing tools is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents the segment_id/match_id alias from create_segment(subtype=matched). The description adds only the notion of a 'file-based identity match job', which is marginal over the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and scoped resource (deliveries for a file-based identity match job) plus what the listing contains (status, delivery IDs). It clearly separates itself from get_delivery, but does not explicitly distinguish itself from the sibling list_deliveries / list_all_deliveries, leaving that inference to the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit alternative and condition: use get_delivery for a specific completed delivery, since download links are not in this history view. It lacks an explicit 'do not use this when...' against list_deliveries/list_all_deliveries, so guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_file_match_jobsList File Match JobsARead-onlyIdempotentInspect
List async file-based identity resolution jobs for the org. Each job corresponds to a matched segment created via create_segment(subtype=matched). Returns match_id, name, status, matching_status, input_record_count, match_count, match_rate, amount_charged, file_format, compression, segment_id, audience_id, audience_status, created_at, expires_at. amount_charged is null until this run first participates in a successful delivery, then shows its one-time pending match-usage estimate; it excludes delivery usage. audience_status (active/archived/null) reports whether the linked audience is still open-able in Library — job history itself always persists, even after the segment or audience is deleted. Cursor-paginated. Filter by status to find pending/active/failed jobs. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum jobs to return (default 30, max 100) | |
| before | No | Legacy ISO timestamp cursor for pagination | |
| cursor | No | Opaque next_cursor from the preceding page; mutually exclusive with before | |
| status | No | Filter by job status |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| has_more | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_cursor | No | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, and the description adds substantial context beyond them: amount_charged is null until the run participates in a successful delivery and excludes delivery usage, and job history persists even after the segment or audience is deleted. The scope requirement and cursor pagination are also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the create_segment linkage are front-loaded, then return fields and caveats follow logically. It is dense but mostly earns its length; the amount_charged sentence is the one place that runs long relative to its decision value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still names the returned fields and clarifies the two non-obvious ones (amount_charged, audience_status), plus the persistence guarantee. Nothing an agent needs to select and call this read tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents limit, cursor/before exclusivity, and the enum. The description adds intent-level meaning by explaining that status filtering is how you surface pending/active/failed jobs and that the tool is cursor-paginated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List async file-based identity resolution jobs for the org') with a precise linkage rule ('Each job corresponds to a matched segment created via create_segment(subtype=matched)'). It clearly distinguishes itself from the singular sibling get_file_match_job and from list_match_runs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States a concrete use case ('Filter by status to find pending/active/failed jobs') and a hard prerequisite ('Requires discovery scope'), which is real routing information. It does not explicitly name get_file_match_job as the alternative for single-job lookup, so the when-not is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_integration_runsList Integration RunsARead-onlyIdempotentInspect
List safe, retained integration activity for this organization. Intermediate workflow artifacts stay private, while this projection records provenance, counts, selected fields, and billing rail. Results are cursor-paginated. Supply at most one of provider, connection_id, kind, or status; use next_cursor to continue. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter to one run kind | |
| limit | No | Maximum runs per page, 1–100 | |
| cursor | No | Opaque next_cursor from an earlier response | |
| status | No | Filter to one run status | |
| provider | No | Filter to one integration provider | |
| connection_id | No | Filter to one organization integration connection |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| has_more | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_cursor | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior. The description adds meaningful context beyond that: intermediate workflow artifacts remain private, results are cursor-paginated, and the caller needs 'discovery' scope. It does not cover rate limits or response shape, but with annotations present this is solid additional disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core list operation, then layers in privacy, pagination, filter exclusivity, and scope. The phrasing 'safe, retained integration activity' is slightly abstract, but every sentence contributes to correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't document return fields, and annotations already carry the safety profile. The description covers the key non-schema constraints: one-filter-only, cursor pagination, discovery scope, and artifact privacy. The main remaining gap is sibling-usage guidance, which is minor but real.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 an important cross-parameter rule not expressed in the schema: at most one of provider, connection_id, kind, or status may be supplied. The only minor wrinkle is that it says 'next_cursor' while the parameter is named 'cursor', though the schema clarifies the connection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly frames a list operation over integration activity for the organization, and adds useful scope details like provenance, counts, selected fields, and billing rail. It does not explicitly differentiate this tool from sibling list tools such as list_match_runs or get_integration_run, 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete invocation constraint: 'Supply at most one of provider, connection_id, kind, or status' and tells the caller to use next_cursor to continue. However, it does not say when to use this tool instead of nearby siblings like get_integration_run or list_saved_integration_matches, leaving selection guidance implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_match_runsList Match RunsARead-onlyIdempotentInspect
List past micro-batch identity match calls for the org. Returns run_id, match_count, match_rate, amount_charged, field_list, created_at, and expires_at. Results are cursor-paginated — pass next_cursor as cursor to fetch older pages. The before timestamp is a legacy alternative. amount_charged is a conservative pending-usage estimate, not a finalized invoice amount. Use to audit recent match activity, inspect estimated costs, or find a specific run by scanning pages. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum runs to return (default 30, max 100) | |
| before | No | Legacy ISO timestamp cursor — returns runs created before this time. Use the created_at of the last run in a previous response to paginate. | |
| cursor | No | Opaque next_cursor from the preceding page; mutually exclusive with before |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| has_more | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_cursor | No | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/idempotent annotations: it discloses the required 'discovery' scope, warns that amount_charged is a conservative pending-usage estimate rather than a finalized invoice figure, and explains cursor pagination with the legacy 'before' path. These are exactly the caveats an agent needs to interpret results honestly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then pagination mechanics, then the cost caveat, then the scope requirement — a logical order with no filler sentences. The enumerated return-field list is partly redundant since an output schema exists, which is the only real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a paginated, read-only listing tool this covers everything material: what it lists, pagination and page ordering, the legacy parameter, the meaning of the billing field, and the required scope. Return values are documented by the output schema, so the description need not elaborate further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes slightly beyond by clarifying that next_cursor from a prior response is passed as cursor and that before is a legacy alternative. It does not add format or ordering detail (e.g., sort order of results) beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list past micro-batch identity match calls scoped to the org) and names the returned identifiers, so an agent knows it's a list/audit endpoint rather than a single-run fetch. It never explicitly contrasts itself with the close sibling get_match_run, so the differentiation is implied by 'past... calls' 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage scenarios: audit recent match activity, inspect estimated costs, or find a specific run by scanning pages. That is clear positive guidance, but there are no exclusions or explicit pointers to alternatives — notably it recommends 'scanning pages' to find a run rather than naming get_match_run with a known run_id, which is a missed routing opportunity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_saved_integration_matchesList Saved Integration MatchesAInspect
List saved integration matches available to build into a segment. Returns aggregate counts without raw identities. Refreshes stored collection counts and may initialize collection metadata; does not create segments or charge for records. Use preview_saved_integration_segment before building. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| collections | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: it refreshes stored collection counts, may initialize collection metadata, does not create segments, and does not charge for records. It also discloses that results are aggregate counts without raw identities and that the 'discovery' scope is required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds precise operating constraints in a compact form. Every sentence contributes useful information about scope, side effects, or prerequisites.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no input parameters, an output schema present, and annotations covering safety hints, the description supplies the remaining context an agent needs: auth scope, side effects, aggregate-only returns, and the recommended preview step. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no input semantics to explain; the schema coverage is effectively complete. Per the rubric, a zero-parameter tool has a baseline of 4 for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it lists saved integration matches available to build into a segment. It also distinguishes this from building by explicitly saying it does not create segments, and it names preview_saved_integration_segment as a related tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by saying to use preview_saved_integration_segment before building, and it states the required 'discovery' scope. It does not explicitly map out every sibling alternative such as list_match_runs or list_integration_runs, so it stops short of full when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_segmentsList SegmentsARead-onlyIdempotentInspect
List a page of visible, non-archived saved segments with subtype, status, and record counts. Use when the user asks what segments they have; filter by subtype or pass a limit of 1–100. For one complete definition, call get_segment with its segment_id. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of segments to return (default 10; maximum 100) | |
| cursor | No | next_cursor from a previous response | |
| compact | No | Return small summaries by default. Set false to include saved filter_groups on filter segments; get_segment retrieves one complete definition. | |
| subtype | No | Optional: filter results to a specific segment subtype ('filter', 'matched', 'similarity', 'propensity') | |
| include_archived | No | Include archived objects so they can be found and restored |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Number of segments on this page |
| guidance | No | Interpretation or recovery guidance for this result |
| segments | Yes | Saved segment summaries |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_cursor | Yes | Cursor for the next page, or null |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the read-only, idempotent, closed-world, non-destructive profile, so the description correctly spends its words elsewhere: the visibility rule (only visible, non-archived segments are listed), pagination via cursor, and the 'discovery' scope authorization requirement, which appears nowhere in the structured fields. It doesn't discuss ordering or what happens at the end of pagination, but that is minor given an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose before usage and the alternative. The '1–100' limit clause duplicates the schema and is the one sentence fragment that doesn't earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with full schema coverage, an output schema, and rich annotations, the description covers purpose, trigger, alternative, pagination, and the required auth scope. Only marginal gaps remain (result ordering), and those are low-stakes for this operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters, ranges, defaults, and the subtype enum are already documented. The description adds only the implicit default of excluding archived segments and restates the 1–100 limit already in the schema; subtype and compact are not elaborated beyond what the schema says. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list saved segments) plus the scope qualifiers (visible, non-archived, paged) and the fields returned (subtype, status, record counts). It explicitly routes the singular case to get_segment, so an agent can separate it from get_segment, count_segment, and list_audiences 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the user asks what segments they have') and an explicit alternative with its selecting condition ('For one complete definition, call get_segment with its segment_id'). No inference about which sibling to use is left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_recordsMatch RecordsADestructiveInspect
Perform real-time identity resolution on up to 100 records. Returns run_id, match_count, record_count, match_rate, amount_charged, and records[] — one output record per input record, matched or not (each with row_id, iag_person_id, match_level, match_type, match_confidence, enrichment fields, and the licensing labels below). iag_person_id is an org-scoped, non-reversible id: present on a real match, or a best-effort id derived from the row's own identity signals (or null) when unmatched — use match_count/record_count, not id-presence, to tell real matches from derived-only rows. Each record also carries resolution_action (resolved = organic PII match, refreshed = the row submitted a valid iag_person_id, unmatched = no real match, identity_unavailable = a previously valid id no longer resolves to deliverable data) and license_action (none, started, or renewed), plus license_expires_at (ISO-8601 or null) — these two fields are independent: a row can be resolution_action "resolved" and license_action "renewed" at once. The run_id can be passed immediately to get_match_run to retrieve or audit this call later. Billing: emits usage per matched record only — derived-only rows are free; amount_charged is a conservative pending-usage estimate, not a finalized invoice amount. A tier-01 Person ID from a prior real match or licensed audience delivery can go directly to Refresh; an audience-only ID has null match_level until a real match occurs. Include I in match_level for direct ID lookup, or omit the filter. An active license avoids another identity-license charge. For more than 100 records, use create_segment(subtype="matched") with a file upload instead. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| records | Yes | Array of 1–100 records to match. Each record is a key-value object of identity fields: email, phone, full_name (or first_name/middle_name/last_name/name_suffix), address_1/address_2/city/state/zip, dob, iag_person_id. If full_name is provided without first_name/last_name, the engine parses it into components automatically. Pre-hashed clients may submit email_sha256/phone_sha256 (lowercase-hex SHA-256) instead of raw email/phone — do not submit an already-hashed value in the raw field, it will be hashed a second time and never match. Extra permutations beyond the primary identity fields may be supplied as emails[]/phones[]/addresses[]/emails_sha256[]/phones_sha256[] arrays. Each addresses[] entry is read by exact key: address_1, address_2, city, state, zip (zip5/postal_code/zip_code accepted as ZIP aliases); any other key is ignored. | |
| field_list | No | Optional list of output fields to include in matched records | |
| match_level | No | Restrict identity resolution to these match levels (Individual/Household/Digital/Spatial/Address). Omit to use the platform default (all levels). | |
| template_id | No | Optional enrichment template ID to apply | |
| spatial_mode | No | Spatial trade-area mode. residential is the default; use work for workplace-oriented spatial matching, or auto for dynamic commercial workplace routing. | residential |
Output Schema
| Name | Required | Description |
|---|---|---|
| run_id | Yes | |
| records | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| match_rate | Yes | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| match_count | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | Yes | |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| amount_charged | Yes | Pending usage estimate in USD, not a finalized invoice |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: discloses the billing model (usage per matched record only, derived-only rows free, amount_charged is a pending estimate not an invoice), the 'creator' scope requirement, and the non-obvious semantics of iag_person_id (org-scoped, non-reversible, best-effort derived id on unmatched rows — use match_count/record_count rather than id-presence to distinguish). It also explains the independent resolution_action and license_action axes with a concrete combined case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and return contract are front-loaded, which is good, but the body collapses into a single dense run-on paragraph mixing billing, ID semantics, action enums, and filtering advice. The sentence "Include I in match_level for direct ID lookup, or omit the filter" is cryptic and buried mid-paragraph where it is easy to miss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 supplies the interpretation layer that the schema cannot: what each action value means, how the two action fields interact, and how to determine real matches from derived rows. Scope requirements, billing caveats, and the scale-up alternative are all covered, leaving nothing an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 still adds real meaning on top: it clarifies that a tier-01 Person ID from a prior real match can go straight to Refresh while an audience-only ID has null match_level, and gives guidance on match_level filtering. The remaining parameters (template_id, spatial_mode, field_list) are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("Perform real-time identity resolution on up to 100 records") and immediately establishes the scope limit and the inline-record input shape. It is clearly distinct from sibling tools like create_segment and get_match_run, which it names as complements rather than substitutes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule for large batches ("more than 100 records, use create_segment(subtype=\"matched\") with a file upload instead") and points to get_match_run for later retrieval. It also warns that an active license avoids another identity-license charge. It stops short of contrasting against other match-adjacent siblings such as deliver_file_match or list_match_runs, 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.
patch_audiencePatch AudienceADestructiveIdempotentInspect
Rename, archive/restore, or change the composition of an existing audience. Also supports adding/removing included or excluded segments. set_logic must be "union" or "intersection" — never "exclusion". To exclude records, use add_excluded_segment_id. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name for the audience | |
| status | No | Status transition: active once ready, archived to hide from the default list; active restores it | |
| set_logic | No | Change inclusion logic: "union" (OR) or "intersection" (AND) | |
| audience_id | Yes | The audience ID returned by create_audience or list_audiences | |
| add_segment_id | No | Segment ID to append to the included list | |
| remove_segment_id | No | Segment ID to remove from the included list | |
| add_excluded_segment_id | No | Segment ID to add as an exclusion — records matching this segment are subtracted from the audience | |
| remove_excluded_segment_id | No | Excluded segment ID to stop excluding |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful context beyond that: the 'creator' scope requirement and the invalid-value warning on set_logic, which an agent would otherwise only learn from a failed call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the capability summary and followed by constraints and prerequisites; no filler. There is minor redundancy where the set_logic restriction restates the schema enum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 annotations carry the destructive/idempotent profile. What is missing is whether multiple segments can be added in one call (the schema exposes only singular add/remove fields) and how this tool relates to archive_audience for the archived status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, including the exclusion semantics of add_excluded_segment_id. The description reinforces the set_logic enum constraint but adds no syntax, cardinality, or format detail beyond the schema – baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names specific verbs (rename, archive/restore, change composition) against a specific resource (an existing audience), so the agent knows this is a mutating edit tool. It does not distinguish itself from the sibling archive_audience, which appears to overlap with the status=archived path described here, leaving a small ambiguity about which to use for archiving.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one useful routing rule ('To exclude records, use add_excluded_segment_id') and a hard constraint ('never exclusion'), plus a prerequisite ('Requires creator scope'). However, it never says when to prefer this tool over archive_audience or patch_segment, so the alternative-tool guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_segmentUpdate SegmentADestructiveInspect
Rename a segment or replace a filter segment definition. Supply filters OR filter_groups, never both. record_limit=null removes a size limit; a positive limit requires bounded State, City, or ZIP Code geography. Definition changes create a new version; renaming does not. Use archive_segment to archive or restore. Requires the creator scope. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name | |
| filters | No | Replacement AND-combined filters (filter subtype only) | |
| segment_id | Yes | Saved segment ID | |
| record_limit | No | Maximum population size (up to 1 billion); null removes the limit | |
| filter_groups | No | Replacement grouped filters (filter subtype only) |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: definition changes create a new version while renaming does not, and the call requires creator scope. It also signals replacement (not merge) semantics for filters. It falls short of describing what is lost when a definition is replaced, which matters for a tool flagged destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense, front-loaded sentences covering mode selection, constraints, versioning, and scope in a short block. The final two sentences duplicate the same requirement ("Requires the creator scope. Requires 'creator' scope."), wasting one sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with an output schema, it covers prerequisites, mutual exclusion, versioning side effects, and the sibling for archiving. The one gap is not spelling out that replaced filters are discarded entirely, which is the main thing an agent could get wrong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds two facts the schema does not carry: filters and filter_groups are mutually exclusive, and record_limit must be paired with bounded geography when positive. It does not explain how name interacts with a definition change in the same call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States two specific operations on a specific resource: rename a segment or replace its filter definition. It also explicitly routes archiving elsewhere ("Use archive_segment to archive or restore"), so an agent can distinguish it from the nearest sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use rules: filters XOR filter_groups, record_limit=null to remove a cap, a positive limit requires bounded State/City/ZIP geography, and archive_segment is the tool for archive/restore. Exclusions and alternatives are both stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_saved_integration_segmentPreview Saved Integration SegmentARead-onlyIdempotentInspect
Preview exact unique identities, duplicate receipts, expiry/privacy exclusions, existing overlap, and net additions before creating or extending a segment. This performs no mutation and records no usage. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | Optional provider, connection, run, source-kind, and time-window filters | |
| target_segment_id | No | Optional existing matched segment for overlap and net-addition counts |
Output Schema
| Name | Required | Description |
|---|---|---|
| preview | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| cutoff_at | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new operational context beyond them: 'records no usage' (cost/quota behavior) and "Requires 'discovery' scope" (an auth prerequisite the agent cannot infer from the schema). It stops short of noting latency or result-size expectations for a preview over large filter sets.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler; the enumerated outputs are front-loaded and the scope prerequisite is placed last where it reads as a gate. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 description covers the mutation-free guarantee plus the required scope. Slightly incomplete in that it never clarifies how the preview result relates to the eventual build (e.g., whether counts are guaranteed identical at build time).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only 2 parameters, both described in the schema (filters and target_segment_id), so the schema carries the semantics. The description adds no detail about filter composition, time-window semantics, or how target_segment_id changes the overlap calculation, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Preview) and a specific resource (saved integration segment), then enumerates the exact outputs produced: unique identities, duplicate receipts, expiry/privacy exclusions, overlap, net additions. The phrase 'before creating or extending a segment' distinguishes it from the mutating sibling build_saved_integration_segment without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'before creating or extending a segment' gives a clear decision point for when to reach for this tool. It does not explicitly name build_saved_integration_segment as the alternative, so the routing is implied by lifecycle position rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_deliveryQuote DeliveryADestructiveInspect
Get a usage estimate for delivering an audience before creating billable work. A fresh quote creates a pending quote record and replaces the audience current quote reference; it does not purchase or deliver records. Returns TWO cost figures: cost_estimate is the license-aware expected charge (identities this audience already holds an active 12-month license for elsewhere are excluded from the billable count), and max_cost_estimate is the worst-case ceiling assuming nothing is pre-licensed — always quote max_cost_estimate as the ceiling and cost_estimate as the expected price when license_pricing.status is "live" or "cached"; if license_pricing.status is "unavailable", cost_estimate equals max_cost_estimate exactly and only one number needs mentioning. Key response fields: already_delivered (true = this exact delivery is free), cost_estimate.total_cost / max_cost_estimate.total_cost (total USD), cost_estimate.base_cost / match_cost / field_cost / destination_cost (breakdown; match_cost is the one-time deferred file-match component, never license-discounted), billing_count (records that will be billed), sufficient_balance, shortfall. Call this before deliver_audience so the user can review cost. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| field_list | No | Custom field list (alternative to template_id) | |
| audience_id | Yes | Audience to quote | |
| destination | Yes | Active delivery destination; partner pushes are not yet available | |
| template_id | No | Enrichment template ID | |
| output_format | No | Requested download artifact format. | |
| output_compression | No | Requested download compression. gzip supports csv/json/jsonl; Avro uses native DEFLATE. | none |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| shortfall | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| destination | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| cost_estimate | Yes | Expected license-aware charge in USD |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| license_pricing | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| already_delivered | Yes | |
| max_cost_estimate | Yes | Worst-case charge ceiling in USD |
| sufficient_balance | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-obvious side effects beyond the annotations — a fresh quote creates a pending quote record and replaces the audience's current quote reference — which is consistent with destructiveHint=true and idempotentHint=false. It also explains license-aware billing exclusions, the match_cost exception, behavior when license_pricing.status is 'unavailable', and the required 'discovery' scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the pre-delivery rule, then layers cost semantics; every clause carries meaning. It is dense but long, and some of the enumerated response fields would be available in the output schema, which costs a point on conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers when to call, side effects, billing semantics, edge cases (licensing unavailable, already_delivered), and the OAuth scope requirement. For a quote tool with a destructive annotation, this leaves nothing an agent needs to know before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter documentation is already handled by the schema, and the description adds nothing about field_list, template_id, output_format, or output_compression. Baseline 3 applies since the schema does the heavy lifting here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a usage estimate for delivering an audience') plus a scope qualifier ('before creating billable work'). It explicitly separates itself from the sibling deliver_audience by noting it does not purchase or deliver records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering rule: 'Call this before deliver_audience so the user can review cost.' The alternative (actually delivering) is named and the condition selecting this tool is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recount_audienceRecount AudienceADestructiveIdempotentInspect
Refresh the stored record_count of one saved audience from its current included/excluded segment composition. Call after adding or removing segments. For an unsaved population preview use discovery_count; for a segment snapshot use count_segment. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | The audience ID to recount |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | Yes | Fresh audience count, or null when unavailable |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutating profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), and the description adds real context beyond them: the prerequisite 'discovery' scope and the fact that the mutation overwrites a previously stored record_count. It does not explain why the operation is flagged destructive or what happens to the stored value if the recount fails, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences in a deliberate order: what it does, when to call it, which siblings to use instead, and the auth requirement. Every sentence carries distinct information and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, rich annotations, and a single fully-documented parameter, the description covers everything an agent needs to select and invoke it: scope requirement, post-segment-edit trigger, and sibling disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, so the schema already documents audience_id. The description only implies scope ('one saved audience') and adds no format or lookup guidance beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Refresh the stored record_count of one saved audience') and adds the mechanism ('from its current included/excluded segment composition'), which tells an agent exactly what is recomputed. It also names the two nearest siblings (discovery_count, count_segment) so the tool is distinguishable 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Call after adding or removing segments') and explicit alternative routing with the conditions that select them: unsaved population preview -> discovery_count, segment snapshot -> count_segment. 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.
refresh_audienceRefresh AudienceADestructiveInspect
Refresh one named member segment of an audience against the current IAG, then refresh the audience's own version/expiry. An audience is a composition of one or more member segments, possibly of different subtypes — there is no "primary" segment, so segment_id is required (400 SEGMENT_ID_REQUIRED if omitted, 400 SEGMENT_NOT_A_MEMBER if it is not part of this audience). Behaviour is specific to the chosen segment's subtype:
filter: synchronous — returns status: active immediately. record_count is null; call recount_audience if a fresh count is needed before quoting.
matched: with hitl false/unset (default): returns status: pending + upload_url. Instruct the user to upload their identity list to upload_url (same or updated file). After upload, call wait_for_segment(segment_id) to block until identity resolution completes. With hitl: true: the upload is staged instead — follow the analyze_audience_upload -> confirm_column_mappings / cancel_matched_upload -> wait_for_segment sequence documented on create_segment(subtype=matched) (confirm_column_mappings/cancel_matched_upload take this segment_id, not audience_id).
similarity: returns status: pending + workflow_run_id. Call wait_for_workflow(workflow_run_id) to monitor progress. Do not attempt to deliver until status is active.
propensity: returns status: pending + workflow_run_id. Call wait_for_workflow(workflow_run_id) to monitor progress. Do not attempt to deliver until status is active. Returns 422 MISSING_POSITIVE_CLASS_ID for legacy propensity segments that predate field storage — archive the affected segment with archive_segment and create a replacement using create_segment. Always call get_audience first to see the member segments and their subtypes, so you can pick (or have the user pick) the right segment_id. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| hitl | No | If true: pauses similarity/propensity workflows at human-in-the-loop gates; stages a matched segment's re-upload instead of resolving automatically. Defaults to false. | |
| segment_id | Yes | Which member segment of this audience to refresh. Required — there is no default/primary segment. | |
| audience_id | Yes | The audience ID to refresh | |
| compression | No | Matched subtype: replacement upload compression. | none |
| shard_count | No | Matched subtype: number of same-format shards. Every CSV shard must include its own header row. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| subtype | Yes | |
| version | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| next_step | Yes | |
| refreshed | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| upload_url | No | |
| audience_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| upload_urls | No | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| workflow_run_id | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/non-idempotent/openWorld, and the description goes well past them: synchronous vs pending return states per subtype, the upload_url and workflow_run_id handoffs, the hitl staging variant, the 400 SEGMENT_ID_REQUIRED / SEGMENT_NOT_A_MEMBER / 422 MISSING_POSITIVE_CLASS_ID failure modes, and the 'creator' scope requirement. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded and well structured with a subtype-keyed bullet list, so scanning is easy. The similarity and propensity bullets are near-verbatim duplicates and could be merged, which is the only real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-subtype orchestration tool, the description covers prerequisites, per-path branching, downstream tool chains, and error recovery. An output schema exists, so return-value detail is correctly omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema alone justifies a 3. The description still adds semantic value: it explains why segment_id has no default (audiences may contain multiple subtypes, no 'primary'), and it clarifies that hitl stages a matched re-upload rather than merely pausing workflows. compression and shard_count are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: refresh one named member segment against the current IAG, then refresh the audience's version/expiry. That is far more precise than the title. It does not, however, distinguish itself from the sibling refresh_segment, which an agent could plausibly confuse it with given the near-identical name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: call get_audience first to pick the right segment_id, then branch by subtype. It names the exact follow-up tools (wait_for_segment, wait_for_workflow, analyze_audience_upload, confirm_column_mappings) per case, states when delivery must not be attempted, and gives the remedy for legacy propensity segments. 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.
refresh_segmentRefresh SegmentADestructiveInspect
Re-derive a single stale or expired segment from the current IAG. Updates ONLY the segment — referencing audiences are never touched; the response lists them in affected_audiences so you can recount or refresh them (use refresh_audience for a whole-composition refresh). Behaviour is subtype-specific:
filter: synchronous — bumps current_version, nulls record_count, resets the 90-day TTL, returns status: active. If the segment is already fresh the call is a no-op (refreshed: false); pass force: true to bump anyway. Call count_segment afterwards for a fresh count.
matched: with hitl false/unset (default): returns status: pending + upload_url (24 h presign) targeting the canonical upload path — or upload_urls (an array) when shard_count > 1 — instruct the user to re-upload their identity list (one same-format file per URL for a sharded upload; every CSV shard needs its own header); identity resolution runs automatically once all shards are uploaded. Then call wait_for_segment(segment_id). With hitl: true: the upload is staged instead — after upload, follow the analyze_audience_upload -> confirm_column_mappings / cancel_matched_upload -> wait_for_segment sequence documented on create_segment(subtype=matched). Returns 409 SHARED_SOURCE_DATA for matched duplicates that reference another segment's data — the message names the source segment to refresh instead.
similarity: returns status: pending + workflow_run_id (re-launched scoring workflow). Call wait_for_workflow(workflow_run_id).
propensity: returns status: pending + workflow_run_id. 422 MISSING_POSITIVE_CLASS_ID for legacy segments that predate positive_class_segment_id storage — archive those with archive_segment and create a replacement. Returns 409 SEGMENT_ARCHIVED for archived segments — restore them first with archive_segment(restore=true). Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| hitl | No | If true: pauses re-launched similarity/propensity workflows at human-in-the-loop gates; stages a matched segment's re-upload instead of resolving automatically. Defaults to false. | |
| force | No | Filter subtype only: bump the version even when the segment already looks fresh. Defaults to false. | |
| segment_id | Yes | The segment ID to refresh | |
| compression | No | Matched subtype: replacement upload compression. | none |
| shard_count | No | Matched subtype: set > 1 for multiple same-format shards. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| subtype | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| next_step | Yes | |
| refreshed | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| upload_url | No | |
| audience_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| upload_urls | No | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Stored count; null means unknown. Call count_segment for a current count. |
| record_limit | No | Maximum members; null means no explicit cap |
| filter_groups | No | Complete saved filter definition; one AND group also represents a simple flat filter list |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| current_version | No | |
| workflow_run_id | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
| upload_expires_at | No | |
| affected_audiences | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare destructive=true, idempotent=false, and openWorld=true, the description adds substantial context: version bumping, TTL reset, no-op semantics, 409 SEGMENT_ARCHIVED and SHARED_SOURCE_DATA errors with remediation, 422 MISSING_POSITIVE_CLASS_ID, the 24-hour presign upload flow, and the required 'creator' scope. No statement contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is justified by four distinct subtypes and several error paths. It is front-loaded with the core scope and then structured as per-subtype bullets, with no obvious filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 technically optional, yet the description still names key response fields (affected_audiences, status, upload_url, workflow_run_id) and explains every subtype's downstream step. Given the destructive annotation and multi-path behavior, nothing an agent needs in order to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters, setting the baseline at 3. The description adds real semantic value by tying force to the filter no-op path, hitl to staged matched uploads and paused workflows, shard_count to the array of upload_urls, and compression to matched re-uploads.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Re-derive a single stale or expired segment from the current IAG') and immediately scopes it against siblings: it updates ONLY the segment and names refresh_audience for whole-composition refreshes. An agent can distinguish it from refresh_audience, count_segment, and create_segment without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives subtype-specific when-to-use behavior: filter is synchronous and calls count_segment afterwards; matched requires wait_for_segment and has a HITL staging path; similarity/propensity require wait_for_workflow. It also names alternatives and fallbacks (refresh_audience, archive_segment, create_segment) and states the exact conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
respond_to_workflow_gateRespond to Workflow GateADestructiveInspect
Submit a user response to a paused HITL gate in a running workflow. Only relevant when the segment was created with hitl=true. After responding, call wait_for_workflow again to continue monitoring. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| gate_id | Yes | The gate_id from the paused_gate payload returned by wait_for_workflow or get_workflow_status | |
| response | Yes | The user's chosen response — must be one of the options listed in the gate payload | |
| workflow_run_id | Yes | The workflow run ID |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| workflow_run_id | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is carried by structured data. The description adds genuinely non-redundant operational context: the creator-scope requirement and the required post-response monitoring call, which tell the agent this mutates run state and must be followed by a wait. It stops short of explaining what 'destructive' means here (e.g., whether a submitted response is final and cannot be revised).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct load: purpose, applicability condition, follow-up call, and auth requirement. The primary action is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 description covers prerequisites, scope, and next steps for a state-mutating tool. The remaining gap is failure-mode guidance: what happens if the response is not one of the offered options or if the gate was already resolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each of the three parameters is documented in-schema, including that gate_id comes from the paused_gate payload and response must match a gate option. The description adds no parameter semantics beyond what the schema already states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Submit a user response to a paused HITL gate in a running workflow.' The gate/response framing and the HITL qualifier distinguish it cleanly from siblings like wait_for_workflow and get_workflow_status, which only observe rather than resolve a gate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Only relevant when the segment was created with hitl=true'), the follow-up action ('After responding, call wait_for_workflow again to continue monitoring'), and the authorization requirement ('Requires creator scope'). An agent knows both when to call it and what to do next without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlink_audience_from_campaignUnlink Audience from CampaignADestructiveIdempotentInspect
Remove the link between an audience and a campaign, leaving the audience itself untouched. This is idempotent — calling it again for an already-unlinked pair is safe (returns ok:true). Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | The audience ID to unlink | |
| campaign_id | Yes | The campaign ID to unlink the audience from |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | Whether the requested action succeeded |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| audience_id | Yes | |
| campaign_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true and idempotentHint=true, so the description is not burdened with the safety profile. It still adds substantive context beyond structured data: the exact idempotent return (ok:true) and the required 'creator' scope, which no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core action and its scope-of-effect front-loaded, followed by the idempotency and auth facts. No filler and nothing repeated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A two-parameter mutation with an output schema, and the description covers effect boundaries, idempotency, and required scope. Return-shape details are unnecessary given the output schema, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema, so the baseline of 3 applies. The description adds no syntax, format, or ID-source guidance beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Remove the link) plus two named resources (audience, campaign), and the clause 'leaving the audience itself untouched' explicitly separates it from archive_audience. An agent can distinguish it from link_audience_to_campaign and the archive/patch siblings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context for use (dissolving a campaign-audience association) and an explicit safety note that repeat calls are acceptable. It stops short of naming alternatives or stating when-not-to-use, but the 'audience untouched' clause implicitly routes destructive intent away from archive_audience.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_campaignUpdate CampaignADestructiveIdempotentInspect
Update a campaign name, description, or status. Set status=archived to soft-archive it while preserving linked audiences; set status=active to restore an archived campaign. Requires 'creator' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name for the campaign | |
| status | No | New status for the campaign | |
| campaign_id | Yes | The campaign ID to update | |
| description | No | Campaign brief, goals, intended market, and desired outcomes; use an empty string to clear it |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| status | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| audiences | Yes | |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the description only needs to add context — and it does: it discloses that archiving is a soft archive that preserves linked audiences, that the operation is reversible via status=active, and that 'creator' scope is required. What is missing is whether unspecified fields are left untouched on a partial update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary action, then the status semantics, then the authorization prerequisite. Every sentence carries information an agent would otherwise have to guess at; no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation with full schema coverage, annotations covering safety and idempotency, and an output schema in place, the description covers the remaining unknowns an agent needs: reversibility, data preservation, and the required scope. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns an extra point by explaining the behavioral consequence of each status enum value (soft-archive vs restore) rather than just restating the field. It still says nothing about name/description constraints or clearing behavior, which the schema handles alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (campaign) plus the exact mutable fields (name, description, status), which cleanly separates it from create_campaign, get_campaign, and the audience-side patch tools. It stops short of naming a sibling it is commonly confused with, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditional guidance for the two status values: status=archived to soft-archive while preserving linked audiences, status=active to restore an archived campaign. It does not address when to prefer this over sibling tools like archive_audience or link_audience_to_campaign, so it is clear context without explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_deliveryWait For DeliveryARead-onlyIdempotentInspect
Block until a delivery completes or fails. Call this immediately after deliver_audience or deliver_file_match when the response has status: "processing". Polls GET /v1/audiences/{audience_id}/deliveries/{delivery_id} every 15 seconds. On success returns the full delivery object including download_urls[] — share these directly with the user. Each signed link is valid for 24 hours; expires_at is the delivery artifact retention date, not the link expiry. Call get_delivery for a fresh link while the artifact remains available. Throws DELIVERY_FAILED if the export failed (check failure_reason), or DELIVERY_TIMEOUT if it did not finish within timeout_seconds (default 30 seconds). A wait timeout does not cancel or fail the job; use the corresponding get tool to check it again. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| audience_id | Yes | Audience ID returned by the delivery or file-match job; do not assume it equals match_id or segment_id | |
| delivery_id | Yes | Delivery ID returned by deliver_audience or deliver_file_match | |
| timeout_seconds | No | Maximum seconds to wait (default 30). Prefer get_delivery for a single status check; a wait timeout is not an export failure. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | Current delivery state |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| download_urls | No | Fresh signed artifact URLs on an individual completed download delivery |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the 15s polling interval, the return shape (download_urls[], expires_at semantics vs link expiry), the 24h link validity, both error codes with their meanings, that a timeout does not cancel the job, and the required 'discovery' scope. Rich behavioral context that annotations alone could not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then branching into behavior, errors, and prerequisites. Every sentence carries operational value, though it is fairly dense; nothing is wasted but it is near the upper bound of length before becoming a reference doc.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a read-only, idempotent wait tool with an output schema and full schema coverage, the description covers the wait/poll semantics, failure modes, link retention nuances, retry/tool-switching guidance, and auth scope. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds meaning beyond the schema: it clarifies the timeout default (30s) and that a wait timeout is not an export failure, disambiguating timeout_seconds' true effect. The audience_id mis-assumption caveat is in the schema itself, so the description needn't repeat it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (block/wait) and resource (a delivery) with clear scope: until it completes or fails. The opening line plus the polling description makes it unambiguous how this differs from the sibling get_delivery, which is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives precise trigger conditions ('Call this immediately after deliver_audience or deliver_file_match when the response has status: processing') and names alternatives for adjacent cases (get_delivery for a fresh link, get tool to re-check after a timeout). Both when-to-use and when-to-switch are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_segmentWait For SegmentAIdempotentInspect
Poll a segment until its status is "active" or "failed". Use after create_segment(subtype=matched) once the file has been uploaded AND confirm_column_mappings has succeeded — the segment will not progress past "pending" before that (the upload is staged). Do not call this before confirm_column_mappings. Also use after create_segment(subtype=similarity/propensity) to wait for the async workflow to complete. Polls GET /v1/segments/{segment_id} every 15 seconds. On success returns the customer-facing segment details — pass segment_id in create_audience.segment_refs, then use the returned audience_id to quote_delivery and deliver_audience. Throws SEGMENT_FAILED if processing failed, or SEGMENT_TIMEOUT if it did not complete within timeout_seconds (default 30 seconds). A wait timeout does not cancel or fail the job; use the corresponding get tool to check it again. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| segment_id | Yes | The segment ID returned by create_segment | |
| timeout_seconds | No | Maximum seconds to wait (default 30). Prefer get_segment for a single status check; a wait timeout does not stop processing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| status | Yes | |
| subtype | Yes | |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | Yes | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| record_count | No | Stored count; null means unknown. Call count_segment for a current count. |
| record_limit | No | Maximum members; null means no explicit cap |
| filter_groups | No | Complete saved filter definition; one AND group also represents a simple flat filter list |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| current_version | No | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: 15-second polling against GET /v1/segments/{segment_id}, named error modes (SEGMENT_FAILED, SEGMENT_TIMEOUT), the crucial clarification that a timeout neither cancels nor fails the job, and the 'discovery' scope requirement. The only tension is a minor one—the description frames the tool as read-only polling while readOnlyHint is false—but this is a conservative annotation rather than a genuine contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and terminal states, and nearly every clause is functional (preconditions, error modes, downstream routing). It is dense and somewhat overstuffed—the sequencing advice is spread across three clauses that repeat the create_segment entry point—but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs to call it correctly: preconditions, poll cadence, timeout behavior, auth scope, failure modes, and what to do next with the result. With an output schema present, the description correctly omits return-field detail and instead explains how the returned handle is consumed downstream.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns a step up by giving segment_id downstream meaning ('pass segment_id in create_audience.segment_refs') and reinforcing timeout_seconds' non-destructive semantics. It does not add syntax detail beyond the schema, so it stops short of 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Poll a segment until its status is "active" or "failed"') plus the exact terminal states. This distinguishes it immediately from single-shot siblings get_segment and get_workflow_status without needing schema inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies preconditions ('once the file has been uploaded AND confirm_column_mappings has succeeded') and a hard prohibition ('Do not call this before confirm_column_mappings') for the matched subtype, plus a second valid entry point for similarity/propensity. It also names the alternative for the single-check case ('Prefer get_segment for a single status check').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_workflowWait For WorkflowADestructiveInspect
Block until a similarity or propensity segment workflow completes, fails, or hits a HITL gate. Call this after create_segment(subtype=similarity/propensity) returns a workflow_run_id. Polls GET /v1/workflows/{id} every 30 seconds. Returns completed status with segment_id/audience_id when done. If hitl=true and a gate is hit, returns the gate payload so you can call respond_to_workflow_gate then wait_for_workflow again. Returns an actionable failure code and message if the workflow fails, or WORKFLOW_TIMEOUT after timeout_seconds (default 30 seconds). A wait timeout does not cancel or fail the workflow. Requires 'discovery' scope.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_seconds | No | Maximum seconds to wait (default 30). Prefer get_workflow_status for a single status check; processing continues after a wait timeout. | |
| workflow_run_id | Yes | The workflow run ID returned by create_segment(subtype=similarity/propensity) |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| failure | No | Safe failure reason and next action when status is failed |
| guidance | No | Interpretation or recovery guidance for this result |
| count_unit | No | |
| page_count | No | Number of objects on this page, not the organization total |
| segment_id | No | |
| step_count | Yes | |
| audience_id | No | |
| count_state | No | Unknown means no count; available does not guarantee freshness. Recount for a current value. |
| paused_gate | No | |
| current_step | Yes | |
| next_actions | No | Suggested next calls using returned IDs and available scopes. Not executed and not user consent. |
| money_display | No | Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero. |
| workflow_run_id | Yes | |
| population_input | No | Population input used for the preview; IDs refer to their current saved definitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says this polls GET /v1/workflows/{id} and that a wait timeout does not cancel or fail the workflow, indicating a non-destructive read-only wait. The annotations declare destructiveHint=true and readOnlyHint=false, which directly conflicts with that behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core blocking behavior and then adds only operationally relevant details about polling, HITL handling, failure returns, timeout semantics, and required scope. Every sentence carries useful information for invoking the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex asynchronous/HITL workflow tool, the description covers when to call it, polling behavior, timeout outcomes, HITL gate continuation, failure returns, and required scope. The main remaining gaps are the undefined hitl reference and the contradictory destructive annotation, though the output schema reduces the need to explain return values in prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 some value by linking workflow_run_id to create_segment and explaining WORKFLOW_TIMEOUT behavior, but it also references hitl=true even though no hitl parameter exists in this tool's schema, creating ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb/resource and scope: it blocks until a similarity or propensity segment workflow completes, fails, or hits a HITL gate. It also distinguishes its role from a one-off status check by describing the blocking/polling behavior and the create_segment follow-up.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says to call this after create_segment returns a workflow_run_id and explains the HITL loop with respond_to_workflow_gate followed by another wait. It does not explicitly contrast the tool with get_workflow_status or wait_for_segment in the description, though the timeout parameter schema mentions get_workflow_status.
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.
60 tool updates
- Changed
analyze_audience_upload1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "analysis": { + "additionalProperties": {}, + "properties": { + "columns": { + "items": { + "additionalProperties": {}, + "properties": { + "source_column": { + "type": "string" + } + }, + "required": [ + "source_column" + ], + "type": "object" + }, + "type": "array" + }, + "recommendations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "unmapped_columns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "columns", + "unmapped_columns", + "recommendations" + ], + "type": "object" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "segment_id": { + "type": "string" + } + }, + "required": [ + "segment_id", + "analysis" + ], + "type": "object" +}
- Added
archive_audience - Added
archive_segment - Added
build_saved_integration_segment - Added
cancel_matched_upload - Added
check_balance - Added
check_topup_status - Added
confirm_column_mappings - Changed
count_segment1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "record_count": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Fresh segment count, or null when pending or failed" + }, + "segment_id": { + "type": "string" + } + }, + "required": [ + "segment_id", + "record_count" + ], + "type": "object" +}
- Added
create_audience - Added
create_campaign - Added
create_segment - Added
deliver_audience - Added
deliver_file_match - Changed
discovery_count21 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / criteriaRemoved value: -{ - "description": "Simple demographic criteria; choose this or one other population input, not both", - "properties": { - "age_max": { - "description": "Maximum age in years", - "type": "number" - }, - "age_min": { - "description": "Minimum age in years", - "type": "number" - }, - "genders": { - "description": "Gender labels to include", - "items": { - "type": "string" - }, - "type": "array" - }, - "income_max": { - "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.", - "type": "number" - }, - "income_min": { - "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.", - "type": "number" - }, - "interests": { - "description": "Interest labels to include", - "items": { - "type": "string" - }, - "type": "array" - }, - "states": { - "description": "US state abbreviations to include", - "items": { - "type": "string" - }, - "type": "array" - }, - "zip_codes": { - "description": "Five-digit ZIP codes to include", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" -} - changed
Input schema / properties / filter_groups / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / filter_groups / items / propertiesAdded value: +{ + "combinator": { + "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "description": "All conditions in this group must match", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "id": { + "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group", + "minLength": 1, + "type": "string" + } +} - removed
Input schema / properties / filter_groups / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / filter_groups / items / requiredAdded value: +[ + "id", + "combinator", + "filters" +] - changed
Input schema / properties / filters / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / filters / items / propertiesAdded value: +{ + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } +} - removed
Input schema / properties / filters / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / filters / items / requiredAdded value: +[ + "field", + "op" +] - changed
Input schema / properties / group_by / descriptionPrevious value: -"Field to group counts by; mutually exclusive with automatic breakdowns"New value: +"Field with groupable=true in get_field_catalog; mutually exclusive with automatic breakdowns" - removed
Output schema / properties / bytes_scannedRemoved value: -{ - "description": "Measured query bytes scanned", - "type": "number" -} - added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - removed
Output schema / properties / estimated_cost_usdRemoved value: -{ - "description": "Estimated query cost in US dollars", - "type": "number" -} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "count", - "bytes_scanned", - "estimated_cost_usd" -]New value: +[ + "count" +]
- Changed
discovery_crosstab12 fields changed- changed
Input schema / properties / col_field / descriptionPrevious value: -"Field name for pivot columns"New value: +"Different field with groupable=true from get_field_catalog for pivot columns" - changed
Input schema / properties / filter_groups / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / filter_groups / items / propertiesAdded value: +{ + "combinator": { + "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "description": "All conditions in this group must match", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "id": { + "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group", + "minLength": 1, + "type": "string" + } +} - removed
Input schema / properties / filter_groups / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / filter_groups / items / requiredAdded value: +[ + "id", + "combinator", + "filters" +] - changed
Input schema / properties / filters / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / filters / items / propertiesAdded value: +{ + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } +} - removed
Input schema / properties / filters / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / filters / items / requiredAdded value: +[ + "field", + "op" +] - changed
Input schema / properties / max_cols / maximumPrevious value: -50New value: +20 - changed
Input schema / properties / row_field / descriptionPrevious value: -"Field name for pivot rows (e.g. \"state\", \"age_band\", \"gender\")"New value: +"Field with groupable=true from get_field_catalog for pivot rows" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "cells": { + "additionalProperties": { + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "col_field": { + "type": "string" + }, + "col_label": { + "type": "string" + }, + "columns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "displayed_count": { + "type": "number" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "row_field": { + "type": "string" + }, + "row_label": { + "type": "string" + }, + "rows": { + "items": { + "type": "string" + }, + "type": "array" + }, + "total_count": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "required": [ + "row_field", + "col_field", + "row_label", + "col_label", + "rows", + "columns", + "cells", + "total_count", + "displayed_count", + "truncated" + ], + "type": "object" +}
- Changed
discovery_lookup23 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / criteriaRemoved value: -{ - "description": "Simple demographic criteria; choose this or one other population input, not both", - "properties": { - "age_max": { - "description": "Maximum age in years", - "type": "number" - }, - "age_min": { - "description": "Minimum age in years", - "type": "number" - }, - "genders": { - "description": "Gender labels to include", - "items": { - "type": "string" - }, - "type": "array" - }, - "income_max": { - "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.", - "type": "number" - }, - "income_min": { - "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.", - "type": "number" - }, - "interests": { - "description": "Interest labels to include", - "items": { - "type": "string" - }, - "type": "array" - }, - "states": { - "description": "US state abbreviations to include", - "items": { - "type": "string" - }, - "type": "array" - }, - "zip_codes": { - "description": "Five-digit ZIP codes to include", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" -} - added
Input schema / properties / fieldsAdded value: +{ + "description": "Non-PII audience fields to preview; defaults to a small demographic selection. Discover fields with get_field_catalog.", + "items": { + "type": "string" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / filter_groups / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / filter_groups / items / propertiesAdded value: +{ + "combinator": { + "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "description": "All conditions in this group must match", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "id": { + "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group", + "minLength": 1, + "type": "string" + } +} - removed
Input schema / properties / filter_groups / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / filter_groups / items / requiredAdded value: +[ + "id", + "combinator", + "filters" +] - changed
Input schema / properties / filters / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / filters / items / propertiesAdded value: +{ + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } +} - removed
Input schema / properties / filters / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / filters / items / requiredAdded value: +[ + "field", + "op" +] - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - changed
Output schema / properties / available_fields / descriptionPrevious value: -"Fields available in the audience graph"New value: +"Non-PII fields selected for this sample; use get_field_catalog to discover other fields" - removed
Output schema / properties / bytes_scannedRemoved value: -{ - "description": "Measured query bytes scanned", - "type": "number" -} - added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - removed
Output schema / properties / estimated_cost_usdRemoved value: -{ - "description": "Estimated query cost in US dollars", - "type": "number" -} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "rows", - "total_matched", - "bytes_scanned", - "estimated_cost_usd", - "available_fields" -]New value: +[ + "rows", + "total_matched", + "available_fields" +]
- Changed
discovery_overlap17 fields changed- changed
Input schema / properties / a / properties / filter_groups / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / a / properties / filter_groups / items / propertiesAdded value: +{ + "combinator": { + "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "description": "All conditions in this group must match", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "id": { + "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group", + "minLength": 1, + "type": "string" + } +} - removed
Input schema / properties / a / properties / filter_groups / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / a / properties / filter_groups / items / requiredAdded value: +[ + "id", + "combinator", + "filters" +] - changed
Input schema / properties / a / properties / filters / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / a / properties / filters / items / propertiesAdded value: +{ + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } +} - removed
Input schema / properties / a / properties / filters / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / a / properties / filters / items / requiredAdded value: +[ + "field", + "op" +] - changed
Input schema / properties / b / properties / filter_groups / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / b / properties / filter_groups / items / propertiesAdded value: +{ + "combinator": { + "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "description": "All conditions in this group must match", + "items": { + "additionalProperties": false, + "properties": { + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + "id": { + "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group", + "minLength": 1, + "type": "string" + } +} - removed
Input schema / properties / b / properties / filter_groups / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / b / properties / filter_groups / items / requiredAdded value: +[ + "id", + "combinator", + "filters" +] - changed
Input schema / properties / b / properties / filters / items / additionalPropertiesPrevious value: -{}New value: +false - added
Input schema / properties / b / properties / filters / items / propertiesAdded value: +{ + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } +} - removed
Input schema / properties / b / properties / filters / items / propertyNamesRemoved value: -{ - "type": "string" -} - added
Input schema / properties / b / properties / filters / items / requiredAdded value: +[ + "field", + "op" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "a_count": { + "type": "number" + }, + "a_name": { + "type": "string" + }, + "b_count": { + "type": "number" + }, + "b_name": { + "type": "string" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "demographic_deltas": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "overlap_count": { + "type": "number" + }, + "overlap_pct": { + "type": "number" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "warnings": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "a_name", + "b_name", + "a_count", + "b_count", + "overlap_count", + "overlap_pct", + "demographic_deltas" + ], + "type": "object" +}
- Added
duplicate_audience - Added
duplicate_segment - Added
get_account_usage - Changed
get_audience11 fields changed- changed
Input schema / properties / audience_id / descriptionPrevious value: -"The audience ID (from builder context, list_audiences, or direct reference)"New value: +"The audience ID returned by list_audiences or create_audience" - added
Output schema / properties / campaign_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / record_countAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Saved composition count; null is unknown. Use recount_audience for a current value." +} - added
Output schema / properties / set_logicAdded value: +{ + "description": "How included segments combine; excluded segments always subtract", + "enum": [ + "union", + "intersection" + ], + "type": "string" +}
- Changed
get_audience_demographics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "age_breakdown": { + "items": { + "additionalProperties": {}, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "audience_id": { + "type": "string" + }, + "audience_name": { + "type": "string" + }, + "breakdown_extra": { + "items": { + "additionalProperties": {}, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "extra_field": { + "type": "string" + }, + "generated_at": { + "description": "ISO timestamp of the demographic snapshot", + "type": "string" + }, + "geo_breakdown": { + "items": { + "additionalProperties": {}, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "total_count": { + "type": "number" + } + }, + "required": [ + "total_count", + "age_breakdown", + "geo_breakdown", + "generated_at", + "audience_id", + "audience_name" + ], + "type": "object" +}
- Changed
get_campaign7 fields changed- added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
get_data_release7 fields changed- added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
get_delivery1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "download_urls": { + "description": "Fresh signed artifact URLs on an individual completed download delivery", + "items": { + "type": "string" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "status": { + "description": "Current delivery state", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +}
- Changed
get_field_catalog43 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "next_cursor returned by the previous page", + "type": "string" +} - added
Input schema / properties / field_nameAdded value: +{ + "description": "Retrieve one exact field, including a page of its coded values", + "type": "string" +} - added
Input schema / properties / include_pricingAdded value: +{ + "default": false, + "description": "Include account-specific pricing; requires configured billing", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 20, + "description": "Maximum fields per page; response size may shorten the page", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / product_usageAdded value: +{ + "description": "Filter by supported product usage", + "enum": [ + "audience", + "feature_store" + ], + "type": "string" +} - added
Input schema / properties / purposeAdded value: +{ + "default": "filter", + "description": "Default filter: show fields usable for population filters. Use enrichment for all selectable output fields. Explicit product_usage, template_id or field_name overrides this default.", + "enum": [ + "filter", + "enrichment" + ], + "type": "string" +} - added
Input schema / properties / searchAdded value: +{ + "description": "Case-insensitive search across field names, accepted aliases, labels and descriptions", + "type": "string" +} - added
Input schema / properties / template_idAdded value: +{ + "description": "Show fields in this delivery template", + "enum": [ + "standard_iag", + "standard_enrichment" + ], + "type": "string" +} - added
Input schema / properties / value_cursorAdded value: +{ + "description": "values_next_cursor from a field; requires field_name", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / value_limitAdded value: +{ + "description": "Maximum enum values per field; defaults to 100 for one field or 25 in a list", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / fields / items / properties / coverage_basisAdded value: +{ + "type": "string" +} - added
Output schema / properties / fields / items / properties / coverage_rateAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / fields / items / properties / data_typeAdded value: +{ + "type": "string" +} - added
Output schema / properties / fields / items / properties / default_text_comparisonAdded value: +{ + "anyOf": [ + { + "enum": [ + "exact" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Exact by default for supported text comparisons; null otherwise" +} - added
Output schema / properties / fields / items / properties / descriptionAdded value: +{ + "type": "string" +} - added
Output schema / properties / fields / items / properties / enum_valuesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Exact request values, not display labels" +} - added
Output schema / properties / fields / items / properties / filterableAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / fields / items / properties / groupableAdded value: +{ + "description": "May be used as a group_by/crosstab dimension", + "type": "boolean" +} - added
Output schema / properties / fields / items / properties / labelAdded value: +{ + "type": "string" +} - added
Output schema / properties / fields / items / properties / operatorsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / fields / items / properties / text_comparison_modesAdded value: +{ + "description": "Supported comparison modes for text filter values; empty for non-text fields", + "items": { + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / fields / items / properties / trim_whitespace_supportedAdded value: +{ + "description": "Whether filter values can request trimming of outer whitespace", + "type": "boolean" +} - added
Output schema / properties / fields / items / properties / value_labelsAdded value: +{ + "anyOf": [ + { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / fields / items / properties / values_next_cursorAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / fields / items / requiredPrevious value: -[ - "field_name", - "product_usage" -]New value: +[ + "field_name", + "product_usage", + "text_comparison_modes", + "default_text_comparison", + "trim_whitespace_supported" +] - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / next_cursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - removed
Output schema / properties / pricing / additionalPropertiesRemoved value: -{} - added
Output schema / properties / pricing / anyOfAdded value: +[ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / pricing / descriptionPrevious value: -"Organization-specific prices"New value: +"Organization prices when include_pricing=true; otherwise null" - removed
Output schema / properties / pricing / propertyNamesRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / pricing / typeRemoved value: -"object" - changed
Output schema / properties / templates / descriptionPrevious value: -"Available field templates"New value: +"Templates; request template_id to page their fields" - added
Output schema / properties / templates / items / properties / field_countAdded value: +{ + "type": "number" +} - changed
Output schema / properties / templates / items / requiredPrevious value: -[ - "template_id", - "fields" -]New value: +[ + "template_id" +] - added
Output schema / properties / totalAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "fields", - "templates", - "pricing" -]New value: +[ + "fields", + "templates", + "total", + "next_cursor", + "pricing" +]
- Changed
get_file_match_job1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "match_id": { + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "status": { + "type": "string" + } + }, + "required": [ + "match_id", + "status" + ], + "type": "object" +}
- Changed
get_integration_run1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "connection_id": { + "type": "string" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "counts": { + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "created_at": { + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "kind": { + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "provider": { + "type": "string" + }, + "run_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "run_id", + "provider", + "connection_id", + "kind", + "status", + "counts", + "created_at", + "updated_at" + ], + "type": "object" +}
- Changed
get_match_run1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "input_record_count": { + "type": "number" + }, + "match_count": { + "type": "number" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "run_id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "run_id", + "status", + "input_record_count", + "match_count" + ], + "type": "object" +}
- Changed
get_saved_integration_segment_build1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "collection_id": { + "type": "string" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "failure_code": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "failure_message": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "identity_count": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "materialization_id": { + "type": "string" + }, + "mode": { + "enum": [ + "new_segment", + "add_to_segment" + ], + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "preview": { + "anyOf": [ + { + "additionalProperties": {}, + "properties": { + "already_present": { + "type": "number" + }, + "duplicate_observations": { + "type": "number" + }, + "expired_identities": { + "type": "number" + }, + "net_additions": { + "type": "number" + }, + "source_observations": { + "type": "number" + }, + "suppressed_identities": { + "type": "number" + }, + "unique_identities": { + "type": "number" + } + }, + "required": [ + "source_observations", + "unique_identities", + "duplicate_observations", + "expired_identities", + "suppressed_identities", + "already_present", + "net_additions" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "status": { + "enum": [ + "created", + "processing", + "completed", + "failed" + ], + "type": "string" + }, + "target_segment_id": { + "type": "string" + } + }, + "required": [ + "materialization_id", + "collection_id", + "mode", + "status", + "target_segment_id", + "preview", + "identity_count", + "failure_code", + "failure_message" + ], + "type": "object" +}
- Changed
get_segment11 fields changed- added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / current_versionAdded value: +{ + "type": "number" +} - added
Output schema / properties / filter_groupsAdded value: +{ + "description": "Complete saved filter definition; one AND group also represents a simple flat filter list", + "items": { + "additionalProperties": {}, + "properties": { + "combinator": { + "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "items": { + "additionalProperties": {}, + "properties": { + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "combinator", + "filters" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / record_countAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Stored count; null means unknown. Call count_segment for a current count." +} - added
Output schema / properties / record_limitAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Maximum members; null means no explicit cap" +}
- Changed
get_segment_audiences1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "audience_count": { + "type": "number" + }, + "audiences": { + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "campaign_count": { + "type": "number" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "audiences", + "audience_count", + "campaign_count" + ], + "type": "object" +}
- Changed
get_segment_demographics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "age_breakdown": { + "items": { + "additionalProperties": {}, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "breakdown_extra": { + "items": { + "additionalProperties": {}, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "extra_field": { + "type": "string" + }, + "generated_at": { + "description": "ISO timestamp of the demographic snapshot", + "type": "string" + }, + "geo_breakdown": { + "items": { + "additionalProperties": {}, + "properties": { + "label": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "segment_id": { + "type": "string" + }, + "segment_name": { + "type": "string" + }, + "total_count": { + "type": "number" + } + }, + "required": [ + "total_count", + "age_breakdown", + "geo_breakdown", + "generated_at", + "segment_id", + "segment_name" + ], + "type": "object" +}
- Changed
get_workflow_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "audience_id": { + "type": "string" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "current_step": { + "type": "number" + }, + "failure": { + "additionalProperties": false, + "description": "Safe failure reason and next action when status is failed", + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paused_gate": { + "additionalProperties": false, + "properties": { + "gate_id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "options": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "gate_id", + "message", + "options" + ], + "type": "object" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "segment_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "step_count": { + "type": "number" + }, + "workflow_run_id": { + "type": "string" + } + }, + "required": [ + "workflow_run_id", + "status", + "current_step", + "step_count" + ], + "type": "object" +}
- Added
link_audience_to_campaign - Changed
list_all_deliveries1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "deliveries": { + "description": "Delivery summaries; signed download URLs are omitted from history", + "items": { + "additionalProperties": {}, + "properties": { + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "deliveries" + ], + "type": "object" +}
- Changed
list_audiences14 fields changed- added
Input schema / properties / campaign_idAdded value: +{ + "description": "Only audiences linked to this campaign (newest link first). Use list_campaigns to find campaign IDs.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / compactAdded value: +{ + "default": true, + "description": "Return small summaries by default. Use the matching get tool for a complete definition, or compact=false for full entries.", + "type": "boolean" +} - added
Input schema / properties / cursorAdded value: +{ + "description": "next_cursor from a previous response", + "type": "string" +} - added
Input schema / properties / include_archivedAdded value: +{ + "description": "Include archived objects so they can be found and restored", + "type": "boolean" +} - added
Input schema / properties / limit / defaultAdded value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of audiences to return (default 50; REST maximum 100)"New value: +"Maximum number of audiences to return (default 10; maximum 100)" - added
Input schema / properties / unlinkedAdded value: +{ + "description": "When true, only audiences that belong to no campaign. Do not combine with campaign_id.", + "type": "boolean" +} - added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
list_campaigns10 fields changed- added
Input schema / properties / compactAdded value: +{ + "default": true, + "description": "Return small name/status summaries by default; set false for each saved brief and timestamps. Call get_campaign for linked audiences.", + "type": "boolean" +} - added
Input schema / properties / limit / defaultAdded value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum campaigns per page (default 25)"New value: +"Maximum campaigns per page (default 10)" - added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
list_deliveries1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "deliveries": { + "description": "Delivery summaries; signed download URLs are omitted from history", + "items": { + "additionalProperties": {}, + "properties": { + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "deliveries" + ], + "type": "object" +}
- Changed
list_file_match_deliveries1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "deliveries": { + "description": "Delivery summaries; signed download URLs are omitted from history", + "items": { + "additionalProperties": {}, + "properties": { + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "deliveries" + ], + "type": "object" +}
- Changed
list_file_match_jobs3 fields changed- changed
Input schema / properties / before / descriptionPrevious value: -"ISO timestamp cursor for pagination"New value: +"Legacy ISO timestamp cursor for pagination" - added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor from the preceding page; mutually exclusive with before", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "has_more": { + "type": "boolean" + }, + "jobs": { + "items": { + "additionalProperties": {}, + "properties": { + "match_id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "match_id", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "next_cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "jobs", + "has_more" + ], + "type": "object" +}
- Changed
list_integration_runs3 fields changed- changed
Input schema / properties / kind / enumPrevious value: -[ - "enrichment", - "onboarding", - "activation", - "sync", - "file_match", - "delivery" -]New value: +[ + "batch_enrichment", + "file_enrichment", + "ingest", + "activation", + "export" +] - changed
Input schema / properties / status / enumPrevious value: -[ - "created", - "processing", - "awaiting_provider_writeback", - "completed", - "failed", - "expired" -]New value: +[ + "created", + "processing", + "awaiting_boundary", + "settling", + "completed", + "failed", + "cancelled" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "has_more": { + "type": "boolean" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "next_cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "runs": { + "items": { + "additionalProperties": {}, + "properties": { + "connection_id": { + "type": "string" + }, + "counts": { + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "created_at": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "run_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "run_id", + "provider", + "connection_id", + "kind", + "status", + "counts", + "created_at", + "updated_at" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "runs", + "has_more", + "next_cursor" + ], + "type": "object" +}
- Changed
list_match_runs3 fields changed- changed
Input schema / properties / before / descriptionPrevious value: -"ISO timestamp cursor — returns runs created before this time. Use the created_at of the last run in a previous response to paginate."New value: +"Legacy ISO timestamp cursor — returns runs created before this time. Use the created_at of the last run in a previous response to paginate." - added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor from the preceding page; mutually exclusive with before", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "has_more": { + "type": "boolean" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "next_cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "runs": { + "items": { + "additionalProperties": {}, + "properties": { + "input_record_count": { + "type": "number" + }, + "match_count": { + "type": "number" + }, + "run_id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "run_id", + "status", + "input_record_count", + "match_count" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "runs", + "has_more" + ], + "type": "object" +}
- Changed
list_saved_integration_matches1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "collections": { + "items": { + "additionalProperties": {}, + "properties": { + "collection_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "collection_id", + "name", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "collections" + ], + "type": "object" +}
- Changed
list_segments12 fields changed- added
Input schema / properties / compactAdded value: +{ + "default": true, + "description": "Return small summaries by default. Set false to include saved filter_groups on filter segments; get_segment retrieves one complete definition.", + "type": "boolean" +} - added
Input schema / properties / cursorAdded value: +{ + "description": "next_cursor from a previous response", + "type": "string" +} - added
Input schema / properties / include_archivedAdded value: +{ + "description": "Include archived objects so they can be found and restored", + "type": "boolean" +} - added
Input schema / properties / limit / defaultAdded value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of segments to return (default 50; REST maximum 100)"New value: +"Maximum number of segments to return (default 10; maximum 100)" - added
Output schema / properties / count_stateAdded value: +{ + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" +} - added
Output schema / properties / count_unitAdded value: +{ + "const": "records", + "type": "string" +} - added
Output schema / properties / guidanceAdded value: +{ + "description": "Interpretation or recovery guidance for this result", + "type": "string" +} - added
Output schema / properties / money_displayAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - added
Output schema / properties / next_actionsAdded value: +{ + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / page_countAdded value: +{ + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / population_inputAdded value: +{ + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Added
match_records - Added
patch_audience - Added
patch_segment - Changed
preview_saved_integration_segment1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "cutoff_at": { + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "preview": { + "additionalProperties": {}, + "properties": { + "already_present": { + "type": "number" + }, + "duplicate_observations": { + "type": "number" + }, + "expired_identities": { + "type": "number" + }, + "net_additions": { + "type": "number" + }, + "source_observations": { + "type": "number" + }, + "suppressed_identities": { + "type": "number" + }, + "unique_identities": { + "type": "number" + } + }, + "required": [ + "source_observations", + "unique_identities", + "duplicate_observations", + "expired_identities", + "suppressed_identities", + "already_present", + "net_additions" + ], + "type": "object" + } + }, + "required": [ + "cutoff_at", + "preview" + ], + "type": "object" +}
- Changed
quote_delivery1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "already_delivered": { + "type": "boolean" + }, + "audience_id": { + "type": "string" + }, + "cost_estimate": { + "additionalProperties": {}, + "description": "Expected license-aware charge in USD", + "properties": { + "base_cost": { + "type": "number" + }, + "billing_count": { + "type": "number" + }, + "destination_cost": { + "type": "number" + }, + "field_cost": { + "type": "number" + }, + "match_cost": { + "type": "number" + }, + "total_cost": { + "type": "number" + } + }, + "required": [ + "base_cost", + "match_cost", + "field_cost", + "destination_cost", + "total_cost", + "billing_count" + ], + "type": "object" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "destination": { + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "license_pricing": { + "additionalProperties": {}, + "properties": { + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "max_cost_estimate": { + "additionalProperties": {}, + "description": "Worst-case charge ceiling in USD", + "properties": { + "base_cost": { + "type": "number" + }, + "billing_count": { + "type": "number" + }, + "destination_cost": { + "type": "number" + }, + "field_cost": { + "type": "number" + }, + "match_cost": { + "type": "number" + }, + "total_cost": { + "type": "number" + } + }, + "required": [ + "base_cost", + "match_cost", + "field_cost", + "destination_cost", + "total_cost", + "billing_count" + ], + "type": "object" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "shortfall": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "sufficient_balance": { + "type": "boolean" + } + }, + "required": [ + "audience_id", + "destination", + "already_delivered", + "cost_estimate", + "max_cost_estimate", + "sufficient_balance", + "shortfall", + "license_pricing" + ], + "type": "object" +}
- Changed
recount_audience1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "audience_id": { + "type": "string" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "record_count": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Fresh audience count, or null when unavailable" + } + }, + "required": [ + "audience_id", + "record_count" + ], + "type": "object" +}
- Added
refresh_audience - Added
refresh_segment - Added
respond_to_workflow_gate - Added
unlink_audience_from_campaign - Added
update_campaign - Changed
wait_for_delivery5 fields changed- changed
Input schema / properties / audience_id / descriptionPrevious value: -"Audience ID the delivery belongs to (same as match_id for matched audiences)"New value: +"Audience ID returned by the delivery or file-match job; do not assume it equals match_id or segment_id" - changed
Input schema / properties / timeout_seconds / defaultPrevious value: -900New value: +30 - changed
Input schema / properties / timeout_seconds / descriptionPrevious value: -"Maximum seconds to wait. Default 900 (15 min)."New value: +"Maximum seconds to wait (default 30). Prefer get_delivery for a single status check; a wait timeout is not an export failure." - changed
Input schema / properties / timeout_seconds / minimumPrevious value: -30New value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "download_urls": { + "description": "Fresh signed artifact URLs on an individual completed download delivery", + "items": { + "type": "string" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "status": { + "description": "Current delivery state", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +}
- Changed
wait_for_segment4 fields changed- changed
Input schema / properties / timeout_seconds / defaultPrevious value: -900New value: +30 - changed
Input schema / properties / timeout_seconds / descriptionPrevious value: -"Maximum seconds to wait before giving up. Default 900 (15 min). Use up to 7200 (2hr) for propensity/similarity workflows."New value: +"Maximum seconds to wait (default 30). Prefer get_segment for a single status check; a wait timeout does not stop processing." - changed
Input schema / properties / timeout_seconds / minimumPrevious value: -30New value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "current_version": { + "type": "number" + }, + "filter_groups": { + "description": "Complete saved filter definition; one AND group also represents a simple flat filter list", + "items": { + "additionalProperties": {}, + "properties": { + "combinator": { + "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "items": { + "additionalProperties": {}, + "properties": { + "field": { + "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values", + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "=", + "!=", + "<", + "<=", + ">", + ">=", + "IN", + "NOT IN", + "BETWEEN", + "LIKE", + "ARRAY_CONTAINS", + "ARRAY_CONTAINS_ANY", + "IS NULL", + "IS NOT NULL" + ], + "type": "string" + }, + "text_comparison": { + "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.", + "enum": [ + "exact", + "case_insensitive" + ], + "type": "string" + }, + "trim_whitespace": { + "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.", + "type": "boolean" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels" + } + }, + "required": [ + "field", + "op" + ], + "type": "object" + }, + "type": "array" + }, + "id": { + "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "id", + "combinator", + "filters" + ], + "type": "object" + }, + "type": "array" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "record_count": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Stored count; null means unknown. Call count_segment for a current count." + }, + "record_limit": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Maximum members; null means no explicit cap" + }, + "segment_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "subtype": { + "enum": [ + "filter", + "matched", + "similarity", + "propensity" + ], + "type": "string" + } + }, + "required": [ + "segment_id", + "name", + "subtype", + "status" + ], + "type": "object" +}
- Changed
wait_for_workflow4 fields changed- changed
Input schema / properties / timeout_seconds / defaultPrevious value: -7200New value: +30 - changed
Input schema / properties / timeout_seconds / descriptionPrevious value: -"Maximum seconds to wait (default 7200 = 2hr; BQML training routinely takes 10–60 min and a brief network blip near completion could cause a 1hr timeout to fire prematurely)"New value: +"Maximum seconds to wait (default 30). Prefer get_workflow_status for a single status check; processing continues after a wait timeout." - changed
Input schema / properties / timeout_seconds / minimumPrevious value: -60New value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "audience_id": { + "type": "string" + }, + "count_state": { + "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.", + "enum": [ + "unknown", + "available" + ], + "type": "string" + }, + "count_unit": { + "const": "records", + "type": "string" + }, + "current_step": { + "type": "number" + }, + "failure": { + "additionalProperties": false, + "description": "Safe failure reason and next action when status is failed", + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "guidance": { + "description": "Interpretation or recovery guidance for this result", + "type": "string" + }, + "money_display": { + "additionalProperties": { + "type": "string" + }, + "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "next_actions": { + "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.", + "items": { + "additionalProperties": false, + "properties": { + "arguments": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "tool", + "arguments", + "reason" + ], + "type": "object" + }, + "type": "array" + }, + "page_count": { + "description": "Number of objects on this page, not the organization total", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "paused_gate": { + "additionalProperties": false, + "properties": { + "gate_id": { + "type": "string" + }, + "message": { + "type": "string" + }, + "options": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "gate_id", + "message", + "options" + ], + "type": "object" + }, + "population_input": { + "additionalProperties": {}, + "description": "Population input used for the preview; IDs refer to their current saved definitions", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "segment_id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "step_count": { + "type": "number" + }, + "workflow_run_id": { + "type": "string" + } + }, + "required": [ + "workflow_run_id", + "status", + "current_step", + "step_count" + ], + "type": "object" +}
27 tool updates
- Removed
archive_segment - Removed
build_saved_integration_segment - Removed
bulk_archive_audiences - Removed
bulk_archive_segments - Removed
bulk_create_audiences - Removed
bulk_create_segments - Removed
bulk_deliver_audiences - Removed
bulk_patch_audiences - Removed
bulk_patch_segments - Removed
cancel_matched_upload - Removed
confirm_column_mappings - Removed
create_audience - Removed
create_campaign - Removed
create_segment - Removed
delete_audience - Removed
deliver_audience - Removed
deliver_file_match - Removed
duplicate_audience - Removed
duplicate_segment - Removed
link_audience_to_campaign - Removed
match_records - Removed
patch_audience - Removed
refresh_audience - Removed
refresh_segment - Removed
respond_to_workflow_gate - Removed
unlink_audience_from_campaign - Removed
update_campaign
63 tool updates
- First observed
analyze_audience_upload - First observed
archive_segment - First observed
build_saved_integration_segment - First observed
bulk_archive_audiences - First observed
bulk_archive_segments - First observed
bulk_create_audiences - First observed
bulk_create_segments - First observed
bulk_deliver_audiences - First observed
bulk_patch_audiences - First observed
bulk_patch_segments - First observed
cancel_matched_upload - First observed
confirm_column_mappings - First observed
count_segment - First observed
create_audience - First observed
create_campaign - First observed
create_segment - First observed
delete_audience - First observed
deliver_audience - First observed
deliver_file_match - First observed
discovery_count - First observed
discovery_crosstab - First observed
discovery_lookup - First observed
discovery_overlap - First observed
duplicate_audience - First observed
duplicate_segment - First observed
get_audience - First observed
get_audience_demographics - First observed
get_campaign - First observed
get_data_release - First observed
get_delivery - First observed
get_field_catalog - First observed
get_file_match_job - First observed
get_integration_run - First observed
get_match_run - First observed
get_saved_integration_segment_build - First observed
get_segment - First observed
get_segment_audiences - First observed
get_segment_demographics - First observed
get_workflow_status - First observed
link_audience_to_campaign - First observed
list_all_deliveries - First observed
list_audiences - First observed
list_campaigns - First observed
list_deliveries - First observed
list_file_match_deliveries - First observed
list_file_match_jobs - First observed
list_integration_runs - First observed
list_match_runs - First observed
list_saved_integration_matches - First observed
list_segments - First observed
match_records - First observed
patch_audience - First observed
preview_saved_integration_segment - First observed
quote_delivery - First observed
recount_audience - First observed
refresh_audience - First observed
refresh_segment - First observed
respond_to_workflow_gate - First observed
unlink_audience_from_campaign - First observed
update_campaign - First observed
wait_for_delivery - First observed
wait_for_segment - First observed
wait_for_workflow
Publisher details
- Operator
- NO FAIT
- Operator website
- https://infiniteaudience.ai
- Vendor relationship
- First-party
- Documentation
- https://docs.infiniteaudience.ai
- Trust center
- https://trust.infiniteaudience.ai
- Restrictions
- Requires paid plan
Related MCP Connectors
Enrich and search people and companies, resolve identities, and enrich IP addresses.
Query people, segments, campaigns, and message deliveries; send transactional email or broadcasts.
Find which CDPs connect to your tools, compare CDP catalogs, and check a whole stack
Send transactional email, verify domains, build contact segments, and draft marketing campaigns.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables clients to run paid technographic domain enrichment, search a shared prospect database with technology filters, manage saved lists, and reconstruct CSV export snapshots through authenticated tools. It supports both API-key stdio and hosted OAuth connections with scoped workspace consent and credit tracking.37 npmMIT

openpeoplerouterofficial
AlicenseAqualityBmaintenanceEnables people and company discovery, enrichment, identity resolution, and contact finding through unified MCP tools, with optional provider endpoint catalog access using your own API keys.121Apache 2.0
usagentleads-mcpofficial
AlicenseAqualityBmaintenanceEnables users to search masked contact previews, unlock selected records with approval and credit controls, and prepare suppression-aware CSV exports through hosted Streamable HTTP or a local stdio bridge.7MIT- AlicenseAqualityAmaintenanceAI-powered data integration platform. Onboard users and run DPF data workflows.16MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.