Skip to main content
Glama

AIsa Sales

Bulk Update Contacts

post_apollo_contacts_bulk_update
Destructive

Bulk update contacts. Requires a master API key.

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

Input Schema

NameRequiredDescriptionDefault
bodyYes

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • addedInput schema / properties / body
      Added value: +{
      +  "anyOf": [
      +    {
      +      "required": [
      +        "contact_ids"
      +      ]
      +    },
      +    {
      +      "required": [
      +        "contact_attributes"
      +      ]
      +    }
      +  ],
      +  "properties": {
      +    "account_id": {
      +      "description": "When using contact_ids, apply this account ID to all contacts",
      +      "example": "63f53afe4ceeca00016bdd2f",
      +      "type": "string"
      +    },
      +    "async": {
      +      "description": "Force asynchronous processing. Automatically enabled for >100 contacts.",
      +      "example": false,
      +      "type": "boolean"
      +    },
      +    "contact_attributes": {
      +      "description": "Array of contact objects with individual updates. Use this for applying different updates to each contact.",
      +      "items": {
      +        "properties": {
      +          "account_id": {
      +            "description": "The Apollo account ID to associate with the contact",
      +            "example": "63f53afe4ceeca00016bdd2f",
      +            "type": "string"
      +          },
      +          "email": {
      +            "description": "The contact's email address",
      +            "example": "john.doe@example.com",
      +            "type": "string"
      +          },
      +          "first_name": {
      +            "description": "The contact's first name",
      +            "example": "John",
      +            "type": "string"
      +          },
      +          "id": {
      +            "description": "The contact ID to update",
      +            "example": "66e34b81740c50074e3d1bd4",
      +            "type": "string"
      +          },
      +          "last_name": {
      +            "description": "The contact's last name",
      +            "example": "Doe",
      +            "type": "string"
      +          },
      +          "linkedin_url": {
      +            "description": "The contact's LinkedIn profile URL",
      +            "example": "https://www.linkedin.com/in/john-doe-3f9a7c21",
      +            "type": "string"
      +          },
      +          "organization_name": {
      +            "description": "The contact's organization name",
      +            "example": "Example Corp",
      +            "type": "string"
      +          },
      +          "owner_id": {
      +            "description": "The Apollo user ID to assign as owner",
      +            "example": "66302798d03b9601c7934ebf",
      +            "type": "string"
      +          },
      +          "present_raw_address": {
      +            "description": "The contact's location",
      +            "example": "San Francisco, CA",
      +            "type": "string"
      +          },
      +          "title": {
      +            "description": "The contact's job title",
      +            "example": "Senior Manager",
      +            "type": "string"
      +          },
      +          "typed_custom_fields": {
      +            "additionalProperties": {
      +              "type": "string"
      +            },
      +            "description": "Custom field values as key-value pairs",
      +            "example": {
      +              "60c39ed82bd02f01154c470a": "2025-08-07"
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "id"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "contact_ids": {
      +      "description": "Array of contact IDs to update with the same values. Use this for applying the same updates to multiple contacts.",
      +      "example": [
      +        "66e34b81740c50074e3d1bd4",
      +        "66e370fbf5f5c003f0e1d0cf"
      +      ],
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "email": {
      +      "description": "When using contact_ids, apply this email to all contacts",
      +      "example": "updated@example.com",
      +      "type": "string"
      +    },
      +    "first_name": {
      +      "description": "When using contact_ids, apply this first name to all contacts",
      +      "example": "Updated",
      +      "type": "string"
      +    },
      +    "last_name": {
      +      "description": "When using contact_ids, apply this last name to all contacts",
      +      "example": "Name",
      +      "type": "string"
      +    },
      +    "linkedin_url": {
      +      "description": "When using contact_ids, apply this LinkedIn URL to all contacts",
      +      "example": "https://www.linkedin.com/in/updated",
      +      "type": "string"
      +    },
      +    "organization_name": {
      +      "description": "When using contact_ids, apply this organization name to all contacts",
      +      "example": "Updated Corp",
      +      "type": "string"
      +    },
      +    "owner_id": {
      +      "description": "When using contact_ids, apply this owner to all contacts",
      +      "example": "66302798d03b9601c7934ebf",
      +      "type": "string"
      +    },
      +    "present_raw_address": {
      +      "description": "When using contact_ids, apply this address to all contacts",
      +      "example": "New York, NY",
      +      "type": "string"
      +    },
      +    "title": {
      +      "description": "When using contact_ids, apply this title to all contacts",
      +      "example": "Updated Title",
      +      "type": "string"
      +    },
      +    "typed_custom_fields": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "description": "When using contact_ids, apply these custom fields to all contacts",
      +      "example": {
      +        "60c39ed82bd02f01154c470a": "2025-08-07"
      +      },
      +      "type": "object"
      +    },
      +    "visible_entity_ids": {
      +      "description": "Specific contact IDs to return in the response (for performance)",
      +      "example": [
      +        "66e34b81740c50074e3d1bd4"
      +      ],
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / required
      Previous value: -[]New value: +[
      +  "body"
      +]
  2. First observed

TDQS

B3.1/5.0
Behavior3/5

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

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

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

Conciseness4/5

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

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

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

Completeness2/5

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

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

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

Parameters3/5

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

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

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

Purpose4/5

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

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

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

Usage Guidelines2/5

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

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

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources