{
  "openapi": "3.0.3",
  "info": {
    "title": "Apollo API",
    "version": "1.0.0",
    "description": "Apollo API endpoints exposed through the AIsa unified gateway."
  },
  "servers": [
    {
      "url": "https://api.aisa.one/apis/v1"
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  },
  "paths": {
    "/apollo/people/match": {
      "post": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 1",
          "nominal_usd": 0.012,
          "observed_usd": {
            "min": 0.012,
            "p50": 0.012,
            "p95": 0.01975,
            "max": 0.17775
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "People Enrichment",
        "description": "Enrich one person: give whatever identifiers you have and get back Apollo's full record for them. Accepts `email`, `first_name` plus `last_name`, `name`, `domain`, `organization_name`, `linkedin_url` or `hashed_email` — the more you supply, the likelier the match. Returns a `person` object with `id`, `name`, `title`, `headline`, `linkedin_url`, `twitter_url`, `github_url`, `photo_url`, `organization_id` and an `employment_history` array, plus a `request_id`. Personal emails and phone numbers are withheld unless `reveal_personal_emails` or `reveal_phone_number` is set, and those cost extra credits. A 200 does not guarantee a match — check whether `person` actually came back. Use `post_apollo_people_bulk_match` for up to 10 people in one call; use `post_apollo_mixed_people_api_search` when you do not have an identifier and need to find candidates first.",
        "operationId": "post_apollo_people_match",
        "parameters": [
          {
            "name": "first_name",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The first name of the person. This is typically used in combination with the last_name parameter. Example: tim"
          },
          {
            "name": "last_name",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The last name of the person. This is typically used in combination with the first_name parameter. Example: zheng"
          },
          {
            "name": "name",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The full name of the person. This will typically be a first name and last name separated by a space. If you use this parameter, you do not need to use the first_name and last_name parameters. Example: tim zheng"
          },
          {
            "name": "email",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The email address of the person. Example: example@email.com"
          },
          {
            "name": "hashed_email",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The hashed email of the person. The email should adhere to either the MD5 or SHA-256 hash format. Example: 8d935115b9ff4489f2d1f9249503cadf (MD5) or 97817c0c49994eb500ad0a5e7e2d8aed51977b26424d508f66e4e8887746a152 (SHA-256)"
          },
          {
            "name": "organization_name",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The name of the person's employer. This can be the current employer or a previous employer. Example: apollo"
          },
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. Example: apollo.io or microsoft.com"
          },
          {
            "name": "id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The Apollo ID for the person. Each person in the Apollo database is assigned a unique ID. To find IDs, call the People API Search endpoint and identify the values for person_id. Example: 587cf802f65125cad923a266"
          },
          {
            "name": "linkedin_url",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The URL for the person's LinkedIn profile. Example: http://www.linkedin.com/in/tim-zheng-677ba010"
          },
          {
            "name": "run_waterfall_email",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true to enable email waterfall enrichment"
          },
          {
            "name": "run_waterfall_phone",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true to enable phone waterfall enrichment"
          },
          {
            "name": "reveal_personal_emails",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true if you want to enrich the person's data with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email."
          },
          {
            "name": "reveal_phone_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true if you want to enrich the person's data with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the person's phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
          },
          {
            "name": "webhook_url",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "person": {
                      "type": "object",
                      "description": "Response object"
                    },
                    "waterfall": {
                      "type": "object",
                      "description": "Response object"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/people/bulk_match": {
      "post": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 1",
          "nominal_usd": 0.012,
          "observed_usd": {
            "min": 0.012,
            "p50": 0.012,
            "p95": 0.012,
            "max": 0.1975
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "Bulk People Enrichment",
        "description": "Enrich up to 10 people in one call. Body takes `details`, an array of the same identifier objects `post_apollo_people_match` accepts. Returns `matches` alongside `status`, `total_requested_enrichments`, `unique_enriched_records`, `missing_records` and `credits_consumed` — read `missing_records` rather than assuming every input matched. Costs one credit per record enriched, not per call. Use this over a loop of single calls: same credits, one round trip. For a single person `post_apollo_people_match` is simpler.",
        "operationId": "post_apollo_people_bulk_match",
        "parameters": [
          {
            "name": "run_waterfall_email",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true to enable email waterfall enrichment"
          },
          {
            "name": "run_waterfall_phone",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true to enable phone waterfall enrichment"
          },
          {
            "name": "reveal_personal_emails",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true if you want to enrich all matched people with personal emails. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If a person resides in a GDPR -compliant region, Apollo will not reveal their personal email."
          },
          {
            "name": "reveal_phone_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Set to true if you want to enrich the data of all matched people with all available phone numbers, including mobile phone numbers. This potentially consumes credits as part of your Apollo pricing plan . The default value is false. If this parameter is set to true, you must enter a webhook URL for the webhook_url parameter. Apollo will asynchronously verify phone numbers for you, then send a JSON response that includes only details about the phone numbers to the webhook URL you provide. It can take several minutes for the phone numbers to be delivered."
          },
          {
            "name": "webhook_url",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "If you set the reveal_phone_number parameter to true, this parameter becomes mandatory. Otherwise, do not use this parameter. Enter the webhook URL that specifies where Apollo should send a JSON response that includes the phone number you requested. Apollo suggests testing this flow to ensure you receive the separate response with the phone number. If phone numbers are not revealed delivered to the webhook URL, try applying UTF-8 encoding to the webhook URL. Example: https://webhook.site/cc4cf44e-e047-4774-8dac-473d28474e40; https%3A%2F%2Fwebhook.site%2Fcc4cf44e-e047-4774-8dac-473d28474e40"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "description": "Response field"
                    },
                    "error_code": {
                      "type": "string",
                      "description": "Response field"
                    },
                    "error_message": {
                      "type": "string",
                      "description": "Response field"
                    },
                    "total_requested_enrichments": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "unique_enriched_records": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "missing_records": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "credits_consumed": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "matches": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    },
                    "waterfall": {
                      "type": "object",
                      "description": "Response object"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "details": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "description": "One person to enrich. Give whatever identifiers you have — the more, the likelier the match.",
                      "properties": {
                        "first_name": {
                          "type": "string",
                          "description": "First name, used with last_name. Example: tim"
                        },
                        "last_name": {
                          "type": "string",
                          "description": "Last name, used with first_name. Example: zheng"
                        },
                        "name": {
                          "type": "string",
                          "description": "Full name, e.g. \"tim zheng\"; replaces first_name + last_name."
                        },
                        "email": {
                          "type": "string",
                          "description": "Email address of the person."
                        },
                        "hashed_email": {
                          "type": "string",
                          "description": "MD5 or SHA-256 hash of the email address."
                        },
                        "organization_name": {
                          "type": "string",
                          "description": "Name of the person's employer. Example: apollo"
                        },
                        "domain": {
                          "type": "string",
                          "description": "Domain of the person's employer, without www. Example: apollo.io"
                        },
                        "id": {
                          "type": "string",
                          "description": "Apollo person id, e.g. from a people search."
                        },
                        "linkedin_url": {
                          "type": "string",
                          "description": "LinkedIn profile URL of the person."
                        }
                      }
                    },
                    "description": "Provide info for each person you want to enrich as an object within this array. Add up to 10 people."
                  }
                },
                "required": [
                  "details"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/organizations/enrich": {
      "get": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 2",
          "nominal_usd": 0.012,
          "observed_usd": {
            "min": 0.012,
            "p50": 0.012,
            "p95": 0.012,
            "max": 0.0395
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "Organization Enrichment",
        "description": "Enrich one company by domain. `domain` is the only parameter and it must be the bare domain (apple.com), not a full URL. Returns an `organization` object with `id`, `name`, `website_url`, `linkedin_url`, `twitter_url`, `facebook_url`, `angellist_url`, `phone`, `founded_year`, `alexa_ranking`, `publicly_traded_symbol`, `publicly_traded_exchange` and `languages`. Use it as the entry point when all you have is a domain. For several domains at once use `post_apollo_organizations_bulk_enrich`; for the full record including funding and technology detail use `get_apollo_organizations_id`, which needs the Apollo organization id this call returns.",
        "operationId": "get_apollo_organizations_enrich",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The domain of the company that you want to enrich. Do not include www., the @ symbol, or similar. Example: apollo.io or microsoft.com"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization": {
                      "type": "object",
                      "description": "Response object"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/organizations/bulk_enrich": {
      "post": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 2",
          "nominal_usd": 0.012,
          "observed_usd": {
            "min": 0.012,
            "p50": 0.012,
            "p95": 0.012,
            "max": 0.0395
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "Bulk Organization Enrichment",
        "description": "Enrich up to 10 companies in one call. Body takes `domains`, an array of bare domains. Returns the enriched organizations alongside `status`, `total_requested_domains`, `unique_domains`, `unique_records` and `unique_enriched_records` — compare the requested and enriched counts rather than assuming every domain resolved. For one domain `get_apollo_organizations_enrich` is a plain GET.",
        "operationId": "post_apollo_organizations_bulk_enrich",
        "parameters": [
          {
            "name": "domains[]",
            "in": "query",
            "required": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The domain of each company that you want to enrich. Do not include www., the @ symbol, or similar. Example: apollo.io and microsoft.com"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "description": "Response field"
                    },
                    "error_code": {
                      "type": "string",
                      "description": "Response field"
                    },
                    "error_message": {
                      "type": "string",
                      "description": "Response field"
                    },
                    "total_requested_domains": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "unique_domains": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "unique_enriched_records": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "missing_records": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "organizations": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/mixed_people/api_search": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "People API Search",
        "description": "Find people matching criteria rather than enriching someone you already identified. Filter by job title, seniority, location, company domain, headcount and industry, and page with `page` and `per_page`. Returns `total_entries` and a `people` array. Note what search deliberately withholds: entries carry `last_name_obfuscated` and boolean flags — `has_email`, `has_direct_phone`, `has_city`, `has_state`, `has_country` — instead of the values themselves. Search tells you a match exists; enrichment reveals the contact details. Feed the ids into `post_apollo_people_match` or `post_apollo_people_bulk_match` to get emails and phone numbers, which is also where the credits are spent.",
        "operationId": "post_apollo_mixed_people_api_search",
        "parameters": [
          {
            "name": "person_titles[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Job titles held by the people you want to find. For a person to be included in search results, they only need to match 1 of the job titles you add. Adding more job titles expands your search results. Results also include job titles with the same terms, even if they are not exact matches. For example, searching for marketing manager might return people with the job title content marketing manager. Use this parameter in combination with the person_seniorities[] parameter to find people based on specific job functions and seniority levels. Examples: sales development representative; marketing manager; research analyst"
          },
          {
            "name": "include_similar_titles",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "This parameter determines whether people with job titles similar to the titles you define in the person_titles[] parameter are returned in the response. Set this parameter to false when using person_titles[] to return only strict matches for job titles."
          },
          {
            "name": "q_keywords",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "A string of words over which we want to filter the results."
          },
          {
            "name": "person_locations[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The location where people live. You can search across cities, US states, and countries. To find people based on the headquarters locations of their current employer, use the organization_locations parameter. Examples: california; ireland; chicago"
          },
          {
            "name": "person_seniorities[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The job seniority that people hold within their current employer. This enables you to find people that currently hold positions at certain reporting levels, such as Director level or senior IC level. For a person to be included in search results, they only need to match 1 of the seniorities you add. Adding more seniorities expands your search results. Searches only return results based on their current job title, so searching for Director-level employees only returns people that currently hold a Director-level title. If someone was previously a Director, but is currently a VP, they would not be included in your search results. Use this parameter in combination with the person_titles[] parameter to find people based on specific job functions and seniority levels. The following options can be used for this parameter: owner founder c_suite partner vp head director manager senior entry intern"
          },
          {
            "name": "organization_locations[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The location of the company headquarters for a person's current employer. You can search across cities, US states, and countries. If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, people that work for the Boston-based company will not appear in your results, even if they match other parameters. To find people based on their personal location, use the person_locations parameter. Examples: texas; tokyo; spain"
          },
          {
            "name": "q_organization_domains_list[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. This parameter accepts up to 1,000 domains in a single request. Examples: apollo.io; microsoft.com"
          },
          {
            "name": "contact_email_status[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The email statuses for the people you want to find. You can add multiple statuses to expand your search. The statuses you can search include: verified unverified likely to engage unavailable"
          },
          {
            "name": "organization_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The Apollo IDs for the companies (employers) you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, call the Organization Search endpoint and identify the values for organization_id. Example: 5e66b6381e05b4008c8331b8"
          },
          {
            "name": "organization_num_employees_ranges[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The number range of employees working for the person's current company. This enables you to find people based on the headcount of their employer. You can add multiple ranges to expand your search results. Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma. Examples: 1,10; 250,500; 10000,20000"
          },
          {
            "name": "revenue_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The minimum revenue the person's current employer generates. Use this parameter in combination with revenue_range[max] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000"
          },
          {
            "name": "revenue_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The maximum revenue the person's current employer generates. Use this parameter in combination with revenue_range[min] to set a revenue range. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 500000; 1500000"
          },
          {
            "name": "currently_using_all_of_technology_uids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Find people based on all of the technologies their current employer uses. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org"
          },
          {
            "name": "currently_using_any_of_technology_uids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Find people based on any of the technologies their current employer uses. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org"
          },
          {
            "name": "currently_not_using_any_of_technology_uids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Exclude people from your search based on any of the technologies their current employer uses. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org"
          },
          {
            "name": "q_organization_job_titles[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The job titles that are listed in active job postings at the person's current employer. Examples: sales manager; research analyst"
          },
          {
            "name": "organization_job_locations[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The locations of the jobs being actively recruited by the person's employer. Examples: atlanta; japan"
          },
          {
            "name": "organization_num_jobs_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The minimum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500"
          },
          {
            "name": "organization_num_jobs_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The maximum number of job postings active at the person's current employer. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500"
          },
          {
            "name": "organization_job_posted_at_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The earliest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25"
          },
          {
            "name": "organization_job_posted_at_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The latest date when jobs were posted by the person's current employer. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "total_entries": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "people": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/mixed_companies/search": {
      "post": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 2",
          "nominal_usd": 0.012,
          "observed_usd": {
            "min": 0.012,
            "p50": 0.012,
            "p95": 0.0395,
            "max": 0.0395
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "Organization Search",
        "description": "Find companies matching criteria: name, domain, headcount, industry, location, funding stage and technologies in use. Returns `organizations` and `accounts` side by side — organizations are Apollo's global database, accounts are records that already exist in this Apollo workspace — plus `pagination` and `breadcrumbs` echoing the filters that were applied. Use it to build a target list. When you already know the domain, `get_apollo_organizations_enrich` answers directly and costs less.",
        "operationId": "post_apollo_mixed_companies_search",
        "parameters": [
          {
            "name": "q_organization_domains_list[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The domain name for the person's employer. This can be the current employer or a previous employer. Do not include www., the @ symbol, or similar. This parameter accepts up to 1,000 domains in a single request. Examples: apollo.io; microsoft.com"
          },
          {
            "name": "organization_num_employees_ranges[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The number range of employees working for the company. This enables you to find companies based on headcount. You can add multiple ranges to expand your search results. Each range you add needs to be a string, with the upper and lower numbers of the range separated only by a comma. Examples: 1,10; 250,500; 10000,20000"
          },
          {
            "name": "organization_locations[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The location of the company headquarters. You can search across cities, US states, and countries. If a company has several office locations, results are still based on the headquarters location. For example, if you search chicago but a company's HQ location is in boston, any Boston-based companies will not appearch in your search results, even if they match other parameters.. To exclude companies based on location, use the organization_not_locations parameter. Examples: texas; tokyo; spain"
          },
          {
            "name": "organization_not_locations[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Exclude companies from search results based on the location of the company headquarters. You can use cities, US states, and countries as locations to exclude. This parameter is useful for ensuring you do not prospect in an undesirable territory. For example, if you use ireland as a value, no Ireland-based companies will appear in your search results. Examples: minnesota; ireland; seoul"
          },
          {
            "name": "revenue_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Search for organizations based on their revenue. Use this parameter to set the lower range of organization revenue. Use the revenue_range[max] parameter to set the upper range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 300000"
          },
          {
            "name": "revenue_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Search for organizations based on their revenue. Use this parameter to set the upper range of organization revenue. Use the revenue_range[min] parameter to set the lower range of revenue. Do not enter currency symbols, commas, or decimal points in the figure. Example: 50000000"
          },
          {
            "name": "currently_using_any_of_technology_uids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Find organizations based on the technologies they currently use. Apollo supports filtering by 1,500+ technologies. Apollo calculates technologies data from multiple sources. This data is updated regularly. Check out the full list of supported technologies by downloading this CSV file . Use underscores (_) to replace spaces and periods for the technologies listed in the CSV file. Examples: salesforce; google_analytics; wordpress_org"
          },
          {
            "name": "q_organization_keyword_tags[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Filter search results based on keywords associated with companies. For example, you can enter mining as a value to return only companies that have an association with the mining industry. Examples: mining; sales strategy; consulting"
          },
          {
            "name": "q_organization_name",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filter search results to include a specific company name. If the value you enter for this parameter does not match with a company's name, the company will not appear in search results, even if it matches other parameters. Partial matches are accepted. For example, if you filter by the value marketing, a company called NY Marketing Unlimited would still be eligible as a search result, but NY Market Analysis would not be eligible. Example: apollo or mining"
          },
          {
            "name": "organization_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, identify the values for organization_id when you call this endpoint. Example: 5e66b6381e05b4008c8331b8"
          },
          {
            "name": "latest_funding_amount_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The minimum amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[max] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000"
          },
          {
            "name": "latest_funding_amount_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The maximium amount the company received with its most recent funding round. Use this parameter in combination with latest_funding_amount_range[min] to set a monetary range for the company's most recent funding round. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 5000000; 15000000"
          },
          {
            "name": "total_funding_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The minimum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[max] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000"
          },
          {
            "name": "total_funding_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The maximum amount the company received during all of its funding rounds combined. Use this parameter in combination with total_funding_range[min] to set a monetary range for all of the company's funding rounds. Do not enter currency symbols, commas, or decimal points in the figure. Examples: 50000000; 350000000"
          },
          {
            "name": "latest_funding_date_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The earliest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[max] to set a date range for when the company received its most recent funding round. Example: 2025-07-25"
          },
          {
            "name": "latest_funding_date_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The latest date when the company received its most recent funding round. Use this parameter in combination with latest_funding_date_range[min] to set a date range for when the company received its most recent funding round. Example: 2025-09-25"
          },
          {
            "name": "q_organization_job_titles[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The job titles that are listed in active job postings at the company. Examples: sales manager; research analyst"
          },
          {
            "name": "organization_job_locations[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The locations of the jobs being actively recruited by the company. Examples: atlanta; japan"
          },
          {
            "name": "organization_num_jobs_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The minimum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[max] to set a job postings range. Examples: 50; 500"
          },
          {
            "name": "organization_num_jobs_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The maximum number of job postings active at the company. Use this parameter in combination with organization_num_jobs_range[min] to set a job postings range. Examples: 50; 500"
          },
          {
            "name": "organization_job_posted_at_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The earliest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[max] to set a date range for when jobs posted. Example: 2025-07-25"
          },
          {
            "name": "organization_job_posted_at_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "The latest date when jobs were posted by the company. Use this parameter in combination with organization_job_posted_at_range[min] to set a date range for when jobs posted. Example: 2025-09-25"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "breadcrumbs": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    },
                    "partial_results_only": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "has_join": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "disable_eu_prospecting": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "partial_results_limit": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Response object"
                    },
                    "accounts": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    },
                    "organizations": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    },
                    "model_ids": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    },
                    "num_fetch_result": {
                      "type": "string",
                      "description": "Response field"
                    },
                    "derived_params": {
                      "type": "string",
                      "description": "Response field"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/organizations/{organization_id}/job_postings": {
      "get": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 2",
          "nominal_usd": 0.01975,
          "observed_usd": {
            "min": 0.012,
            "max": 0.01975
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "Organization Job Postings",
        "description": "Live job postings for one company, by Apollo organization id. Each posting carries its title, location, posted date and source URL. Useful as a hiring signal — which functions a company is expanding, and where. Get the organization id from `get_apollo_organizations_enrich` first. This reads Apollo's job board data, not the company's own careers page, so absence of postings is not proof a company is not hiring.",
        "operationId": "get_apollo_organizations_organization_id_job_postings",
        "parameters": [
          {
            "name": "organization_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The organization ID of the company for which you want to find job postings. Each company in the Apollo database is assigned a unique ID. To find IDs, call the Organization Search endpoint and identify the values for organization_id. Example: 5e66b6381e05b4008c8331b8"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization_job_postings": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/organizations/{id}": {
      "get": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 2",
          "nominal_usd": 0.012,
          "observed_usd": {
            "min": 0.012,
            "max": 0.012
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "Get Complete Organization Info",
        "description": "The complete Apollo record for one company, by Apollo organization id (not by domain). Returns an `organization` object carrying everything enrichment returns plus the deeper fields: funding history, technology stack, department headcounts and related organizations. Get the id from `get_apollo_organizations_enrich` or `post_apollo_mixed_companies_search` first — this endpoint cannot take a domain.",
        "operationId": "get_apollo_organizations_id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The Apollo ID for the organization that you want to research. To find organization IDs, call the Organization Search endpoint and identify the organizaton_id value for the organization. Example: 5e66b6381e05b4008c8331b8"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "organization": {
                      "type": "object",
                      "description": "Response object"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/news_articles/search": {
      "post": {
        "x-aisa-pricing": {
          "model": "dynamic",
          "currency": "USD",
          "basis": "provider_cost x 2",
          "nominal_usd": 0.01975,
          "observed_usd": {
            "min": 0.012,
            "max": 0.01975
          },
          "cost_drivers": [
            {
              "param": "records returned",
              "effect": "charge scales with number of records enriched/returned"
            }
          ],
          "cost_tier": "variable",
          "note": "nominal_usd is a static reference, NOT a guaranteed minimum; actual charge = provider_cost x multiplier and can be higher or lower"
        },
        "summary": "News Articles Search",
        "description": "News coverage for specific companies. `organization_ids[]` is required — omitting it returns HTTP 422 with \"organization_ids is required\", so resolve the companies first with `get_apollo_organizations_enrich` or `post_apollo_mixed_companies_search`. Narrow further with `categories[]` (funding, hires, launches and similar), `published_at[min]`, `published_at[max]`, and page with `page` and `per_page`. Returns `news_articles` and `pagination`. Use it to catch a trigger event before reaching out.",
        "operationId": "post_apollo_news_articles_search",
        "parameters": [
          {
            "name": "organization_ids[]",
            "in": "query",
            "required": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "The Apollo IDs for the companies you want to include in your search results. Each company in the Apollo database is assigned a unique ID. To find IDs, call the Organization Search endpoint and identify the values for organization_id. Example: 5e66b6381e05b4008c8331b8"
          },
          {
            "name": "categories[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Filter your search to include only certain categories or sub-categories of news. Use the News search filter for companies within Apollo to uncover all possible categories and sub-categories. Examples: hires; investment; contract"
          },
          {
            "name": "published_at[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Set the lower bound of the date range you want to search. Use this parameter in combination with the published_at[max] parameter. This date should fall before the published_at[max] date. The date should be formatted as YYYY-MM-DD. Example: 2025-02-15"
          },
          {
            "name": "published_at[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Set the upper bound of the date range you want to search. Use this parameter in combination with the published_at[min] parameter. This date should fall after the published_at[min] date. The date should be formatted as YYYY-MM-DD. Example: 2025-05-15"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The page number of the Apollo data that you want to retrieve. Use this parameter in combination with the per_page parameter to make search results for navigable and improve the performance of the endpoint. Example: 4"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "The number of search results that should be returned for each page. Limiting the number of results per page improves the endpoint's performance. Use the page parameter to search the different pages of data. Example: 10"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "pagination": {
                      "type": "object",
                      "description": "Response object"
                    },
                    "news_articles": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Response array"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/accounts": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Create an Account",
        "description": "Create an account — a company saved into this workspace. Duplicate domains are rejected, so search with `post_apollo_accounts_search` before creating. Requires a master API key. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation. To enrich a company without saving it, use `get_apollo_organizations_enrich`.",
        "operationId": "post_apollo_accounts",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "account": {
                      "type": "object",
                      "description": "Created account",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Account name"
                  },
                  "domain": {
                    "type": "string",
                    "description": "Account domain"
                  },
                  "owner_id": {
                    "type": "string",
                    "description": "Owner ID"
                  },
                  "account_stage_id": {
                    "type": "string",
                    "description": "Account stage ID"
                  }
                },
                "required": [
                  "name",
                  "domain"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/accounts/{account_id}": {
      "patch": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update an Account",
        "description": "Update one account by its Apollo id. Send only the fields you intend to change; anything you omit keeps its current value. Stage fields expect an id from `get_apollo_account_stages`. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "patch_apollo_accounts_account_id",
        "parameters": [
          {
            "name": "account_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Account ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "account": {
                      "type": "object",
                      "description": "Updated account",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Account name"
                  },
                  "domain": {
                    "type": "string",
                    "description": "Account domain"
                  },
                  "owner_id": {
                    "type": "string",
                    "description": "Owner ID"
                  },
                  "account_stage_id": {
                    "type": "string",
                    "description": "Account stage ID"
                  },
                  "raw_address": {
                    "type": "string",
                    "description": "Raw address"
                  },
                  "phone": {
                    "type": "string",
                    "description": "Phone number"
                  },
                  "typed_custom_fields": {
                    "type": "object",
                    "description": "Typed custom fields object"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/accounts/bulk_create": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Bulk Create Accounts",
        "description": "Create several accounts in one call. Same duplicate-domain rule as `post_apollo_accounts`, applied per record, so a partial success is normal — read the response rather than assuming every row was created. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_accounts_bulk_create",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "created_accounts": {
                      "type": "string",
                      "description": "Accounts created in this request"
                    },
                    "created_accounts[].id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "created_accounts[].name": {
                      "type": "string",
                      "description": "Account name"
                    },
                    "created_accounts[].domain": {
                      "type": "string",
                      "description": "Account domain"
                    },
                    "created_accounts[].team_id": {
                      "type": "string",
                      "description": "Team ID"
                    },
                    "created_accounts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "created_accounts[].account_stage_id": {
                      "type": "string",
                      "description": "Account stage ID"
                    },
                    "created_accounts[].phone": {
                      "type": "string",
                      "description": "Phone number"
                    },
                    "created_accounts[].created_at": {
                      "type": "string",
                      "description": "Created timestamp"
                    },
                    "created_accounts[].updated_at": {
                      "type": "string",
                      "description": "Updated timestamp"
                    },
                    "existing_accounts": {
                      "type": "string",
                      "description": "Accounts that already existed (dedupe matches)"
                    },
                    "existing_accounts[].id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "existing_accounts[].name": {
                      "type": "string",
                      "description": "Account name"
                    },
                    "existing_accounts[].domain": {
                      "type": "string",
                      "description": "Account domain"
                    },
                    "existing_accounts[].team_id": {
                      "type": "string",
                      "description": "Team ID"
                    },
                    "existing_accounts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "existing_accounts[].account_stage_id": {
                      "type": "string",
                      "description": "Account stage ID"
                    },
                    "existing_accounts[].phone": {
                      "type": "string",
                      "description": "Phone number"
                    },
                    "existing_accounts[].created_at": {
                      "type": "string",
                      "description": "Created timestamp"
                    },
                    "existing_accounts[].updated_at": {
                      "type": "string",
                      "description": "Updated timestamp"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "accounts": {
                    "type": "string",
                    "description": "Array of accounts to create"
                  },
                  "append_label_names": {
                    "type": "string",
                    "description": "Label names to append to each created account"
                  },
                  "run_dedupe": {
                    "type": "boolean",
                    "description": "Enable deduplication. Default false."
                  }
                },
                "required": [
                  "accounts"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/accounts/bulk_update": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Bulk Update Accounts",
        "description": "Update several accounts in one call, each identified by its Apollo id. Partial success is normal; check the response per record. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_accounts_bulk_update",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "accounts": {
                      "type": "string",
                      "description": "Updated accounts"
                    },
                    "accounts[].id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "accounts[].account_stage_id": {
                      "type": "string",
                      "description": "Account stage ID"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "account_ids": {
                    "type": "string",
                    "description": "IDs of accounts to update"
                  },
                  "account_attributes": {
                    "type": "string",
                    "description": "List of account attribute update objects"
                  },
                  "account_attributes[].name": {
                    "type": "string",
                    "description": "Account name"
                  },
                  "account_attributes[].owner_id": {
                    "type": "string",
                    "description": "Owner ID"
                  },
                  "account_attributes[].account_stage_id": {
                    "type": "string",
                    "description": "Account stage ID"
                  },
                  "async": {
                    "type": "boolean",
                    "description": "Run asynchronously. Default false."
                  }
                },
                "required": [
                  "account_ids",
                  "account_attributes"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/accounts/search": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Search for Accounts",
        "description": "Search accounts — the companies saved in this Apollo workspace, as opposed to Apollo's global database. Filter by name, owner, stage and custom fields; page with `page` and `per_page`. Returns `accounts` and `pagination`, plus `breadcrumbs` echoing the filters applied. ⚠️ This workspace is shared by every AIsa caller, so results include records other callers created. To search Apollo's global company database instead, use `post_apollo_mixed_companies_search`.",
        "operationId": "post_apollo_accounts_search",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "breadcrumbs": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "Breadcrumb",
                        "additionalProperties": true
                      },
                      "description": "Response array"
                    },
                    "partial_results_only": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "has_join": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "disable_eu_prospecting": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "partial_results_limit": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata",
                      "additionalProperties": true
                    },
                    "accounts": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "Account",
                        "additionalProperties": true
                      },
                      "description": "Response array"
                    },
                    "num_fetch_result": {
                      "type": "object",
                      "nullable": true,
                      "description": "Fetch-result metadata",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q_organization_name": {
                    "type": "string",
                    "description": "Organization name query"
                  },
                  "account_stage_ids": {
                    "type": "string",
                    "description": "Filter by account stage IDs"
                  },
                  "account_label_ids": {
                    "type": "string",
                    "description": "Filter by account label IDs"
                  },
                  "sort_by_field": {
                    "type": "string",
                    "description": "Sort field (e.g. account_last_activity_date, account_created_at, account_updated_at)"
                  },
                  "sort_ascending": {
                    "type": "boolean",
                    "description": "Sort ascending"
                  },
                  "page": {
                    "type": "integer",
                    "description": "Page number"
                  },
                  "per_page": {
                    "type": "integer",
                    "description": "Items per page"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/accounts/{id}": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "View an Account",
        "description": "One saved account by its Apollo id, with its full field set including custom fields and owner. Find the id with `post_apollo_accounts_search`. This reads the shared AIsa workspace, not Apollo's global database — for a company you have not saved, use `get_apollo_organizations_enrich`.",
        "operationId": "get_apollo_accounts_id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Account ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "account": {
                      "type": "object",
                      "description": "Account",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/accounts/update_owners": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update Account Owner for Multiple Accounts",
        "description": "Reassign the owner of several accounts at once. Owner ids come from `get_apollo_users_search`. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation. Reassignment is visible to whoever owned them before.",
        "operationId": "post_apollo_accounts_update_owners",
        "parameters": [
          {
            "name": "account_ids[]",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Account IDs"
          },
          {
            "name": "owner_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "New owner ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "accounts": {
                      "type": "string",
                      "description": "Updated accounts"
                    },
                    "accounts[].id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "accounts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "accounts[].crm_owner_id": {
                      "type": "string",
                      "description": "CRM owner ID"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/account_stages": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "List Account Stages",
        "description": "The account stages configured in this workspace, as an `account_stages` array of `id`, `name`, `display_name`, `display_order`, `category` and `is_meeting_set`. Takes no parameters. Call it before creating or updating accounts: stage fields expect a stage id, and the set is workspace-specific rather than a fixed enum.",
        "operationId": "get_apollo_account_stages",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "account_stages": {
                      "type": "string",
                      "description": "Account stages list"
                    },
                    "account_stages[].id": {
                      "type": "string",
                      "description": "Stage ID"
                    },
                    "account_stages[].team_id": {
                      "type": "string",
                      "description": "Team ID"
                    },
                    "account_stages[].display_name": {
                      "type": "string",
                      "description": "Display name"
                    },
                    "account_stages[].name": {
                      "type": "string",
                      "description": "Name"
                    },
                    "account_stages[].display_order": {
                      "type": "integer",
                      "description": "Display order"
                    },
                    "account_stages[].default_exclude_for_leadgen": {
                      "type": "boolean",
                      "description": "Default exclude for leadgen"
                    },
                    "account_stages[].category": {
                      "type": "string",
                      "description": "Category"
                    },
                    "account_stages[].is_meeting_set": {
                      "type": "boolean",
                      "description": "Is meeting set"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/contacts": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Create a Contact",
        "description": "Create a contact — a person saved into this workspace. Search with `post_apollo_contacts_search` first to avoid duplicates, which Apollo does not reject here the way it rejects duplicate account domains. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation. To look someone up without saving them, use `post_apollo_people_match`.",
        "operationId": "post_apollo_contacts",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contact": {
                      "type": "object",
                      "description": "Created contact",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "first_name": {
                    "type": "string",
                    "description": "First name"
                  },
                  "last_name": {
                    "type": "string",
                    "description": "Last name"
                  },
                  "organization_name": {
                    "type": "string",
                    "description": "Organization name"
                  },
                  "title": {
                    "type": "string",
                    "description": "Title"
                  },
                  "account_id": {
                    "type": "string",
                    "description": "Account ID"
                  },
                  "email": {
                    "type": "string",
                    "description": "Email"
                  },
                  "website_url": {
                    "type": "string",
                    "description": "Website URL"
                  },
                  "label_names": {
                    "type": "string",
                    "description": "Labels to set on the contact"
                  },
                  "contact_stage_id": {
                    "type": "string",
                    "description": "Contact stage ID"
                  },
                  "present_raw_address": {
                    "type": "string",
                    "description": "Raw address"
                  },
                  "direct_phone": {
                    "type": "string",
                    "description": "Direct phone"
                  },
                  "corporate_phone": {
                    "type": "string",
                    "description": "Corporate phone"
                  },
                  "mobile_phone": {
                    "type": "string",
                    "description": "Mobile phone"
                  },
                  "home_phone": {
                    "type": "string",
                    "description": "Home phone"
                  },
                  "other_phone": {
                    "type": "string",
                    "description": "Other phone"
                  },
                  "typed_custom_fields": {
                    "type": "object",
                    "description": "Typed custom fields object"
                  },
                  "run_dedupe": {
                    "type": "boolean",
                    "description": "Enable deduplication. Default false."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/contacts/{contact_id}": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "View a Contact",
        "description": "One saved contact by its Apollo id, with the full field set including custom fields, owner and stage. Find the id with `post_apollo_contacts_search`. Reads the shared workspace, not Apollo's global database.",
        "operationId": "get_apollo_contacts_contact_id",
        "parameters": [
          {
            "name": "contact_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Contact ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contact": {
                      "type": "object",
                      "description": "Contact object"
                    },
                    "contact.id": {
                      "type": "string",
                      "description": "Contact ID"
                    },
                    "contact.first_name": {
                      "type": "string",
                      "description": "First name"
                    },
                    "contact.last_name": {
                      "type": "string",
                      "description": "Last name"
                    },
                    "contact.organization_name": {
                      "type": "string",
                      "description": "Organization name"
                    },
                    "contact.title": {
                      "type": "string",
                      "description": "Title"
                    },
                    "contact.email": {
                      "type": "string",
                      "description": "Email"
                    },
                    "contact.phone_numbers": {
                      "type": "string",
                      "description": "Phone numbers"
                    },
                    "contact.phone_numbers[].raw_number": {
                      "type": "string",
                      "description": "Raw number"
                    },
                    "contact.phone_numbers[].sanitized_number": {
                      "type": "string",
                      "description": "Sanitized number"
                    },
                    "contact.owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "contact.account_id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "contact.present_raw_address": {
                      "type": "string",
                      "description": "Raw address"
                    },
                    "contact.linkedin_url": {
                      "type": "string",
                      "description": "LinkedIn URL"
                    },
                    "contact.updated_at": {
                      "type": "string",
                      "description": "Updated timestamp"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      },
      "patch": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update a Contact",
        "description": "Update one contact by its Apollo id. Send only the fields you intend to change. Stage fields expect an id from `get_apollo_contact_stages`. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "patch_apollo_contacts_contact_id",
        "parameters": [
          {
            "name": "contact_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Contact ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contact": {
                      "type": "object",
                      "description": "Updated contact"
                    },
                    "contact.id": {
                      "type": "string",
                      "description": "Contact ID"
                    },
                    "contact.first_name": {
                      "type": "string",
                      "description": "First name"
                    },
                    "contact.last_name": {
                      "type": "string",
                      "description": "Last name"
                    },
                    "contact.email": {
                      "type": "string",
                      "description": "Email"
                    },
                    "contact.title": {
                      "type": "string",
                      "description": "Title"
                    },
                    "contact.organization_name": {
                      "type": "string",
                      "description": "Organization name"
                    },
                    "contact.owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "contact.account_id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "contact.present_raw_address": {
                      "type": "string",
                      "description": "Raw address"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "first_name": {
                    "type": "string",
                    "description": "First name"
                  },
                  "last_name": {
                    "type": "string",
                    "description": "Last name"
                  },
                  "organization_name": {
                    "type": "string",
                    "description": "Organization name"
                  },
                  "title": {
                    "type": "string",
                    "description": "Title"
                  },
                  "account_id": {
                    "type": "string",
                    "description": "Account ID"
                  },
                  "email": {
                    "type": "string",
                    "description": "Email"
                  },
                  "website_url": {
                    "type": "string",
                    "description": "Website URL"
                  },
                  "label_names": {
                    "type": "string",
                    "description": "Labels to set on the contact"
                  },
                  "contact_stage_id": {
                    "type": "string",
                    "description": "Contact stage ID"
                  },
                  "present_raw_address": {
                    "type": "string",
                    "description": "Raw address"
                  },
                  "direct_phone": {
                    "type": "string",
                    "description": "Direct phone"
                  },
                  "corporate_phone": {
                    "type": "string",
                    "description": "Corporate phone"
                  },
                  "mobile_phone": {
                    "type": "string",
                    "description": "Mobile phone"
                  },
                  "home_phone": {
                    "type": "string",
                    "description": "Home phone"
                  },
                  "other_phone": {
                    "type": "string",
                    "description": "Other phone"
                  },
                  "typed_custom_fields": {
                    "type": "object",
                    "description": "Typed custom fields object"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/contacts/bulk_create": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Bulk Create Contacts",
        "description": "Create several contacts in one call. Partial success is normal; read the response per record rather than assuming every row landed. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_contacts_bulk_create",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "created_contacts": {
                      "type": "string",
                      "description": "Contacts created in this request"
                    },
                    "created_contacts[].id": {
                      "type": "string",
                      "description": "Contact ID"
                    },
                    "created_contacts[].first_name": {
                      "type": "string",
                      "description": "First name"
                    },
                    "created_contacts[].last_name": {
                      "type": "string",
                      "description": "Last name"
                    },
                    "created_contacts[].organization_name": {
                      "type": "string",
                      "description": "Organization name"
                    },
                    "created_contacts[].title": {
                      "type": "string",
                      "description": "Title"
                    },
                    "created_contacts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "created_contacts[].account_id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "created_contacts[].email": {
                      "type": "string",
                      "description": "Email"
                    },
                    "created_contacts[].phone_numbers": {
                      "type": "string",
                      "description": "Phone numbers"
                    },
                    "created_contacts[].typed_custom_fields": {
                      "type": "object",
                      "description": "Typed custom fields object"
                    },
                    "created_contacts[].updated_at": {
                      "type": "string",
                      "description": "Updated timestamp"
                    },
                    "existing_contacts": {
                      "type": "string",
                      "description": "Contacts that already existed (dedupe matches)"
                    },
                    "existing_contacts[].id": {
                      "type": "string",
                      "description": "Contact ID"
                    },
                    "existing_contacts[].first_name": {
                      "type": "string",
                      "description": "First name"
                    },
                    "existing_contacts[].last_name": {
                      "type": "string",
                      "description": "Last name"
                    },
                    "existing_contacts[].organization_name": {
                      "type": "string",
                      "description": "Organization name"
                    },
                    "existing_contacts[].title": {
                      "type": "string",
                      "description": "Title"
                    },
                    "existing_contacts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "existing_contacts[].account_id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "existing_contacts[].email": {
                      "type": "string",
                      "description": "Email"
                    },
                    "existing_contacts[].phone_numbers": {
                      "type": "string",
                      "description": "Phone numbers"
                    },
                    "existing_contacts[].typed_custom_fields": {
                      "type": "object",
                      "description": "Typed custom fields object"
                    },
                    "existing_contacts[].updated_at": {
                      "type": "string",
                      "description": "Updated timestamp"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "contacts": {
                    "type": "string",
                    "description": "Array of contacts to create"
                  },
                  "append_label_names": {
                    "type": "string",
                    "description": "Label names to append to each created contact"
                  },
                  "run_dedupe": {
                    "type": "boolean",
                    "description": "Enable deduplication. Default false."
                  }
                },
                "required": [
                  "contacts"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/contacts/bulk_update": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Bulk Update Contacts",
        "description": "Update several contacts in one call, each identified by its Apollo id. Partial success is normal. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_contacts_bulk_update",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contacts": {
                      "type": "string",
                      "description": "Updated contacts"
                    },
                    "contacts[].id": {
                      "type": "string",
                      "description": "Contact ID"
                    },
                    "contacts[].first_name": {
                      "type": "string",
                      "description": "First name"
                    },
                    "contacts[].last_name": {
                      "type": "string",
                      "description": "Last name"
                    },
                    "contacts[].email": {
                      "type": "string",
                      "description": "Email"
                    },
                    "contacts[].title": {
                      "type": "string",
                      "description": "Title"
                    },
                    "contacts[].organization_name": {
                      "type": "string",
                      "description": "Organization name"
                    },
                    "contacts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "contacts[].account_id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "contacts[].present_raw_address": {
                      "type": "string",
                      "description": "Raw address"
                    },
                    "contacts[].linkedin_url": {
                      "type": "string",
                      "description": "LinkedIn URL"
                    },
                    "contacts[].updated_at": {
                      "type": "string",
                      "description": "Updated timestamp"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/contacts/search": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Search for Contacts",
        "description": "Search contacts — the people saved in this Apollo workspace. Filter by name, title, account, owner, stage and custom fields; page with `page` and `per_page`. Returns `contacts` with `id`, `name`, `first_name`, `last_name`, `title`, `organization_name`, `linkedin_url`, `contact_stage_id`, `owner_id`, `person_id` and `source`, alongside `pagination` and `model_ids`. ⚠️ The workspace is shared across AIsa callers, so results include contacts other callers created. To find people who are not saved here, use `post_apollo_mixed_people_api_search`.",
        "operationId": "post_apollo_contacts_search",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contacts": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "Contact",
                        "additionalProperties": true
                      },
                      "description": "Response array"
                    },
                    "breadcrumbs": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "Breadcrumb",
                        "additionalProperties": true
                      },
                      "description": "Response array"
                    },
                    "partial_results_only": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "has_join": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "disable_eu_prospecting": {
                      "type": "boolean",
                      "description": "Response field"
                    },
                    "partial_results_limit": {
                      "type": "integer",
                      "description": "Response field"
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata",
                      "additionalProperties": true
                    },
                    "num_fetch_result": {
                      "type": "object",
                      "nullable": true,
                      "description": "Fetch-result metadata",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q_keywords": {
                    "type": "string",
                    "description": "Keyword query"
                  },
                  "contact_stage_ids": {
                    "type": "string",
                    "description": "Filter by contact stage IDs"
                  },
                  "contact_label_ids": {
                    "type": "string",
                    "description": "Filter by contact label IDs"
                  },
                  "sort_by_field": {
                    "type": "string",
                    "description": "Sort field (e.g. contact_last_activity_date, contact_created_at, contact_updated_at)"
                  },
                  "sort_ascending": {
                    "type": "boolean",
                    "description": "Sort ascending. Default false."
                  },
                  "per_page": {
                    "type": "integer",
                    "description": "Items per page"
                  },
                  "page": {
                    "type": "integer",
                    "description": "Page number"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/contacts/update_stages": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update Contact Stage for Multiple Contacts",
        "description": "Move several contacts to a different stage at once. The stage id must come from `get_apollo_contact_stages` — stages are workspace-specific rather than a fixed enum, and an unknown id is rejected. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation. Stage changes can trigger workspace automations.",
        "operationId": "post_apollo_contacts_update_stages",
        "parameters": [
          {
            "name": "contact_ids[]",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Contact IDs"
          },
          {
            "name": "contact_stage_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "New contact stage ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contacts": {
                      "type": "string",
                      "description": "Updated contacts"
                    },
                    "contacts[].id": {
                      "type": "string",
                      "description": "Contact ID"
                    },
                    "contacts[].first_name": {
                      "type": "string",
                      "description": "First name"
                    },
                    "contacts[].last_name": {
                      "type": "string",
                      "description": "Last name"
                    },
                    "contacts[].contact_stage_id": {
                      "type": "string",
                      "description": "Contact stage ID"
                    },
                    "contacts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "contacts[].email": {
                      "type": "string",
                      "description": "Email"
                    },
                    "contacts[].organization_name": {
                      "type": "string",
                      "description": "Organization name"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/contacts/update_owners": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update Contact Owner for Multiple Contacts",
        "description": "Reassign the owner of several contacts at once. Owner ids come from `get_apollo_users_search`. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_contacts_update_owners",
        "parameters": [
          {
            "name": "contact_ids[]",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Contact IDs"
          },
          {
            "name": "owner_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "New owner ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contacts": {
                      "type": "string",
                      "description": "Updated contacts"
                    },
                    "contacts[].id": {
                      "type": "string",
                      "description": "Contact ID"
                    },
                    "contacts[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "contacts[].crm_owner_id": {
                      "type": "string",
                      "description": "CRM owner ID"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/contact_stages": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "List Contact Stages",
        "description": "The contact stages configured in this workspace, as a `contact_stages` array of `id`, `name`, `display_name`, `display_order`, `category` and `is_meeting_set`. Takes no parameters. Call it before setting a contact's stage: `post_apollo_contacts_update_stages` expects a stage id from this list, and the set is workspace-specific.",
        "operationId": "get_apollo_contact_stages",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contact_stages": {
                      "type": "string",
                      "description": "Contact stages list"
                    },
                    "contact_stages[].id": {
                      "type": "string",
                      "description": "Stage ID"
                    },
                    "contact_stages[].team_id": {
                      "type": "string",
                      "description": "Team ID"
                    },
                    "contact_stages[].display_name": {
                      "type": "string",
                      "description": "Display name"
                    },
                    "contact_stages[].name": {
                      "type": "string",
                      "description": "Name"
                    },
                    "contact_stages[].display_order": {
                      "type": "integer",
                      "description": "Display order"
                    },
                    "contact_stages[].ignore_trigger_override": {
                      "type": "boolean",
                      "description": "Ignore trigger override"
                    },
                    "contact_stages[].category": {
                      "type": "string",
                      "description": "Category"
                    },
                    "contact_stages[].is_meeting_set": {
                      "type": "boolean",
                      "description": "Is meeting set"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/opportunities": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Create Deal",
        "description": "Create a deal. Stage ids come from `get_apollo_opportunity_stages`, and the account it belongs to comes from `post_apollo_accounts_search`. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation. Deals feed the workspace's forecast, so a test record distorts numbers other people read.",
        "operationId": "post_apollo_opportunities",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opportunity": {
                      "type": "object",
                      "description": "Created opportunity",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Deal name"
                  },
                  "owner_id": {
                    "type": "string",
                    "description": "Owner ID"
                  },
                  "account_id": {
                    "type": "string",
                    "description": "Account ID"
                  },
                  "amount": {
                    "type": "number",
                    "description": "Deal amount"
                  },
                  "opportunity_stage_id": {
                    "type": "string",
                    "description": "Deal stage ID"
                  },
                  "closed_date": {
                    "type": "string",
                    "description": "Closed date (date string)"
                  },
                  "typed_custom_fields": {
                    "type": "object",
                    "description": "Typed custom fields object"
                  }
                },
                "required": [
                  "name"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/opportunities/search": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "List All Deals",
        "description": "Search deals in this workspace. Filter by owner, stage, amount and close date; page with `page` and `per_page`. Returns `opportunities` with `id`, `name`, `amount`, `closed_date`, `stage_name`, `opportunity_stage_id`, `account_id`, `owner_id`, `is_closed`, `is_won` and `description`. ⚠️ Shared workspace: results include deals other AIsa callers created.",
        "operationId": "get_apollo_opportunities_search",
        "parameters": [
          {
            "name": "sort_by_field",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Sort field"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Items per page"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opportunities": {
                      "type": "string",
                      "description": "Opportunities list"
                    },
                    "opportunities[].id": {
                      "type": "string",
                      "description": "Opportunity ID"
                    },
                    "opportunities[].owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "opportunities[].account_id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "opportunities[].amount": {
                      "type": "number",
                      "description": "Amount"
                    },
                    "opportunities[].name": {
                      "type": "string",
                      "description": "Name"
                    },
                    "opportunities[].opportunity_stage_id": {
                      "type": "string",
                      "description": "Stage ID"
                    },
                    "opportunities[].is_closed": {
                      "type": "boolean",
                      "description": "Is closed"
                    },
                    "opportunities[].is_won": {
                      "type": "boolean",
                      "description": "Is won"
                    },
                    "opportunities[].created_at": {
                      "type": "string",
                      "description": "Created timestamp"
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination object"
                    },
                    "pagination.page": {
                      "type": "integer",
                      "description": "Page number"
                    },
                    "pagination.per_page": {
                      "type": "integer",
                      "description": "Items per page"
                    },
                    "pagination.total_entries": {
                      "type": "integer",
                      "description": "Total entries"
                    },
                    "pagination.total_pages": {
                      "type": "integer",
                      "description": "Total pages"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/opportunities/{opportunity_id}": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "View Deal",
        "description": "One deal by its Apollo id, with the full field set. Find the id with `get_apollo_opportunities_search`.",
        "operationId": "get_apollo_opportunities_opportunity_id",
        "parameters": [
          {
            "name": "opportunity_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Opportunity ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opportunity": {
                      "type": "object",
                      "description": "Opportunity object"
                    },
                    "opportunity.id": {
                      "type": "string",
                      "description": "Opportunity ID"
                    },
                    "opportunity.owner_id": {
                      "type": "string",
                      "description": "Owner ID"
                    },
                    "opportunity.account_id": {
                      "type": "string",
                      "description": "Account ID"
                    },
                    "opportunity.amount": {
                      "type": "number",
                      "description": "Amount"
                    },
                    "opportunity.name": {
                      "type": "string",
                      "description": "Name"
                    },
                    "opportunity.opportunity_stage_id": {
                      "type": "string",
                      "description": "Stage ID"
                    },
                    "opportunity.is_closed": {
                      "type": "boolean",
                      "description": "Is closed"
                    },
                    "opportunity.is_won": {
                      "type": "boolean",
                      "description": "Is won"
                    },
                    "opportunity.created_at": {
                      "type": "string",
                      "description": "Created timestamp"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      },
      "patch": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update Deal",
        "description": "Update one deal by its Apollo id — amount, close date, stage or owner. Send only what changes. Moving a deal to a closed stage is what marks it won or lost, since `is_won` and `is_closed` come from the stage rather than being set directly. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "patch_apollo_opportunities_opportunity_id",
        "parameters": [
          {
            "name": "opportunity_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Opportunity ID"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opportunity": {
                      "type": "object",
                      "description": "Updated opportunity",
                      "additionalProperties": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "owner_id": {
                    "type": "string",
                    "description": "Owner ID"
                  },
                  "name": {
                    "type": "string",
                    "description": "Opportunity name"
                  },
                  "amount": {
                    "type": "number",
                    "description": "Amount"
                  },
                  "opportunity_stage_id": {
                    "type": "string",
                    "description": "Stage ID"
                  },
                  "closed_date": {
                    "type": "string",
                    "description": "Closed date (date string)"
                  },
                  "typed_custom_fields": {
                    "type": "object",
                    "description": "Typed custom fields object"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/opportunity_stages": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "List Deal Stages",
        "description": "The deal stages configured in this workspace, as an `opportunity_stages` array of `id`, `name`, `display_order`, `probability`, `is_won`, `is_closed`, `forecast_category_cd` and `type`. Takes no parameters. Call it before creating or moving a deal: stage fields expect an id from this list, and `probability` is what turns a stage into a forecast number.",
        "operationId": "get_apollo_opportunity_stages",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "opportunity_stages": {
                      "type": "string",
                      "description": "Opportunity stages list"
                    },
                    "opportunity_stages[].id": {
                      "type": "string",
                      "description": "Stage ID"
                    },
                    "opportunity_stages[].team_id": {
                      "type": "string",
                      "description": "Team ID"
                    },
                    "opportunity_stages[].name": {
                      "type": "string",
                      "description": "Name"
                    },
                    "opportunity_stages[].display_order": {
                      "type": "integer",
                      "description": "Display order"
                    },
                    "opportunity_stages[].forecast_category_cd": {
                      "type": "string",
                      "description": "Forecast category code"
                    },
                    "opportunity_stages[].is_won": {
                      "type": "boolean",
                      "description": "Is won"
                    },
                    "opportunity_stages[].is_closed": {
                      "type": "boolean",
                      "description": "Is closed"
                    },
                    "opportunity_stages[].probability": {
                      "type": "number",
                      "description": "Probability"
                    },
                    "opportunity_stages[].description": {
                      "type": "string",
                      "description": "Description"
                    },
                    "opportunity_stages[].opportunity_pipeline_id": {
                      "type": "string",
                      "description": "Opportunity pipeline ID"
                    },
                    "opportunity_stages[].type": {
                      "type": "string",
                      "description": "Type"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_campaigns/search": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Search for Sequences",
        "description": "Search email sequences in this workspace. Returns `emailer_campaigns` with `pagination` and `breadcrumbs`. Use it to find a sequence id before adding contacts to it or changing its state. ⚠️ Sequences here are shared: activating or archiving one affects every AIsa caller, and a live sequence sends real email from the workspace's connected accounts.",
        "operationId": "post_apollo_emailer_campaigns_search",
        "parameters": [
          {
            "name": "q_name",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Keywords to match sequence names."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Results per page."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "emailer_campaigns": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Sequence records (when returned)."
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_campaigns/{sequence_id}/add_contact_ids": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Add Contacts to a Sequence",
        "description": "Add contacts to an email sequence. ⚠️ This is the endpoint that causes real email to be sent: once added to an active sequence, contacts start receiving its steps from the workspace's connected mailboxes. Get the sequence id from `post_apollo_emailer_campaigns_search` and confirm its state before adding anyone. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation. Sending cannot be recalled once a step goes out.",
        "operationId": "post_apollo_emailer_campaigns_add_contact_ids",
        "parameters": [
          {
            "name": "sequence_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Sequence (emailer campaign) ID."
          },
          {
            "name": "emailer_campaign_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Sequence ID (same as sequence_id)."
          },
          {
            "name": "contact_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Contact IDs to add. Provide either contact_ids[] or label_names[] (or both)."
          },
          {
            "name": "label_names[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Label names for contacts to add. Provide either label_names[] or contact_ids[] (or both)."
          },
          {
            "name": "send_email_from_email_account_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Email account ID (or IDs) to send from."
          },
          {
            "name": "send_email_from_email_address",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional from-address alias."
          },
          {
            "name": "sequence_no_email",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Allow contacts without email."
          },
          {
            "name": "sequence_unverified_email",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Allow contacts with unverified email."
          },
          {
            "name": "sequence_job_change",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Allow contacts with job change."
          },
          {
            "name": "sequence_active_in_other_campaigns",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Allow contacts active in other sequences."
          },
          {
            "name": "sequence_finished_in_other_campaigns",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Allow contacts finished in other sequences."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the add succeeded (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_campaigns/remove_or_stop_contact_ids": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update Contact Status in a Sequence",
        "description": "Remove contacts from a sequence, or stop it for them without removing them. Use it to halt sending to someone who replied or asked to stop. Already-sent messages are unaffected — this only prevents future steps. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_emailer_campaigns_remove_or_stop_contact_ids",
        "parameters": [
          {
            "name": "emailer_campaign_ids[]",
            "in": "query",
            "required": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Sequence IDs."
          },
          {
            "name": "contact_ids[]",
            "in": "query",
            "required": true,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Contact IDs."
          },
          {
            "name": "mode",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "One of: mark_as_finished, remove, stop."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": {
                      "type": "boolean",
                      "description": "Whether the update succeeded (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_campaigns/{sequence_id}/approve": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Activate a Sequence",
        "description": "Activate a sequence, which makes it start sending. ⚠️ Every contact already in it begins receiving steps from the workspace's connected mailboxes. Check membership with `post_apollo_emailer_campaigns_search` and mailbox health with `get_apollo_email_accounts` first. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation. Activation affects everyone using this workspace.",
        "operationId": "post_apollo_emailer_campaigns_sequence_id_approve",
        "parameters": [
          {
            "name": "sequence_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Sequence ID."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "emailer_campaign": {
                      "type": "object",
                      "description": "Sequence object (when returned)."
                    },
                    "emailer_steps": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Sequence steps (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_campaigns/{sequence_id}/abort": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Deactivate a Sequence",
        "description": "Deactivate a sequence so it stops sending. Contacts stay in it and already-sent messages are unaffected; only future steps are halted. Use it as the stop switch when something is going wrong. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_emailer_campaigns_sequence_id_abort",
        "parameters": [
          {
            "name": "sequence_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Sequence ID."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "emailer_campaign": {
                      "type": "object",
                      "description": "Sequence object (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_campaigns/{sequence_id}/archive": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Archive a Sequence",
        "description": "Archive a sequence, removing it from the active list while keeping its history. Archiving does not stop an active sequence on its own — deactivate it with `post_apollo_emailer_campaigns_sequence_id_abort` first if it is still sending. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_emailer_campaigns_sequence_id_archive",
        "parameters": [
          {
            "name": "sequence_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Sequence ID."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "emailer_campaign": {
                      "type": "object",
                      "description": "Archived sequence object (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_messages/search": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Search for Outreach Emails",
        "description": "Search individual outreach emails already sent or scheduled from this workspace. Returns `emailer_messages` alongside `emailer_steps`, which say where in a sequence each message sits. Use it to see what actually went out. For per-message engagement — opens, clicks, replies — use `get_apollo_emailer_messages_id_activities`.",
        "operationId": "get_apollo_emailer_messages_search",
        "parameters": [
          {
            "name": "emailer_message_stats[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Filter by message stats (e.g., open, click)."
          },
          {
            "name": "emailer_message_reply_classes[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Filter by reply classes."
          },
          {
            "name": "user_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Filter by user IDs."
          },
          {
            "name": "email_account_id_and_aliases",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filter by email account and aliases."
          },
          {
            "name": "emailer_campaign_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Only include these sequence IDs."
          },
          {
            "name": "not_emailer_campaign_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Exclude these sequence IDs."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Results per page."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "emailer_messages": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Outreach emails (when returned)."
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/emailer_messages/{id}/activities": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Check Email Stats",
        "description": "Engagement events for one sent email: opens, clicks, replies and bounces, with timestamps. Get the message id from `get_apollo_emailer_messages_search`. Use this rather than inferring engagement from the message record itself, which carries delivery state but not recipient behaviour.",
        "operationId": "get_apollo_emailer_messages_id_activities",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Emailer message ID."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "emailer_message": {
                      "type": "object",
                      "description": "Email object (when returned)."
                    },
                    "activities": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Activity events (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/tasks": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Create a Task",
        "description": "Create a task assigned to a workspace user, optionally linked to a contact or account. Owner ids come from `get_apollo_users_search`. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_tasks",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "task": {
                      "type": "object",
                      "description": "Created task (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "user_id": {
                    "type": "string",
                    "description": "Task owner user ID."
                  },
                  "contact_id": {
                    "type": "string",
                    "description": "Contact ID."
                  },
                  "type": {
                    "type": "string",
                    "description": "Task type."
                  },
                  "priority": {
                    "type": "string",
                    "description": "Task priority (default: medium)."
                  },
                  "status": {
                    "type": "string",
                    "description": "Task status."
                  },
                  "due_at": {
                    "type": "string",
                    "description": "ISO 8601 due datetime."
                  },
                  "title": {
                    "type": "string",
                    "description": "Optional title."
                  }
                },
                "required": [
                  "user_id",
                  "contact_id",
                  "type",
                  "status",
                  "due_at"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/tasks/bulk_create": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Bulk Create Tasks",
        "description": "Create several tasks in one call. Partial success is normal; read the response per record. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_tasks_bulk_create",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tasks": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Created tasks (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "user_id": {
                    "type": "string",
                    "description": "Task owner user ID."
                  },
                  "contact_ids": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Contact IDs."
                  },
                  "type": {
                    "type": "string",
                    "description": "Task type."
                  },
                  "priority": {
                    "type": "string",
                    "description": "Task priority (default: medium)."
                  },
                  "status": {
                    "type": "string",
                    "description": "Task status."
                  },
                  "due_at": {
                    "type": "string",
                    "description": "ISO 8601 due datetime."
                  },
                  "title": {
                    "type": "string",
                    "description": "Optional title."
                  }
                },
                "required": [
                  "user_id",
                  "contact_ids",
                  "type",
                  "status",
                  "due_at"
                ]
              }
            }
          }
        }
      }
    },
    "/apollo/tasks/search": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Search for Tasks",
        "description": "Search tasks in this workspace. Returns `tasks` with `pagination`, `breadcrumbs`, `faceting` and `pipeline_total`. ⚠️ Shared workspace: results include tasks other AIsa callers created.",
        "operationId": "post_apollo_tasks_search",
        "parameters": [
          {
            "name": "sort_by_field",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Sort field."
          },
          {
            "name": "open_factor_names[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Optional open factors."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Results per page."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "tasks": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Tasks (when returned)."
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/reports/sync_report": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Query Analytics Report",
        "description": "Run an analytics report and get its rows back. Despite being a POST this reads rather than writes; the method reflects that the query goes in the body. Reports cover the shared workspace, so figures include other callers' activity.",
        "operationId": "post_apollo_reports_sync_report",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "report": {
                      "type": "object",
                      "description": "Report result (shape depends on request)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "metrics": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Metrics to compute."
                  },
                  "group_by": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Dimensions to group by."
                  },
                  "pivot_group_by": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Optional pivot dimensions."
                  },
                  "sorts": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Sort specs."
                  },
                  "filters": {
                    "type": "string",
                    "description": "Filter specs."
                  },
                  "date_range": {
                    "type": "object",
                    "description": "Date range filter (when supported)."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/phone_calls": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Create Call Records",
        "description": "Log a call record against a contact. This writes history into Apollo — it does not place a call and does not connect to any telephony system. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_phone_calls",
        "parameters": [
          {
            "name": "logged",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Whether to create an individual record."
          },
          {
            "name": "user_id[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Caller user IDs."
          },
          {
            "name": "contact_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Contact ID."
          },
          {
            "name": "account_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Account ID."
          },
          {
            "name": "to_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Dialed phone number."
          },
          {
            "name": "from_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Caller phone number."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Call status."
          },
          {
            "name": "start_time",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ISO 8601 start time."
          },
          {
            "name": "end_time",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ISO 8601 end time."
          },
          {
            "name": "duration",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Duration in seconds."
          },
          {
            "name": "phone_call_purpose_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Purpose ID."
          },
          {
            "name": "phone_call_outcome_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Outcome ID."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "phone_call": {
                      "type": "object",
                      "description": "Call record (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/phone_calls/search": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Search for Calls",
        "description": "Search logged calls in this workspace. Returns `phone_calls` with `pagination`, `breadcrumbs`, `faceting` and `pipeline_total`. These are call records written into Apollo, not telephony data — a call only appears here if something logged it.",
        "operationId": "get_apollo_phone_calls_search",
        "parameters": [
          {
            "name": "date_range[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Upper bound for call date range (YYYY-MM-DD)."
          },
          {
            "name": "date_range[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Lower bound for call date range (YYYY-MM-DD)."
          },
          {
            "name": "duration[max]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Upper bound for duration (seconds)."
          },
          {
            "name": "duration[min]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Lower bound for duration (seconds)."
          },
          {
            "name": "inbound",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Inbound or outbound."
          },
          {
            "name": "user_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "User IDs."
          },
          {
            "name": "contact_label_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Contact label IDs."
          },
          {
            "name": "phone_call_purpose_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Purpose IDs."
          },
          {
            "name": "phone_call_outcome_ids[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Outcome IDs."
          },
          {
            "name": "q_keywords",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Keyword filter."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Results per page."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "phone_calls": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Calls (when returned)."
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/phone_calls/{id}": {
      "put": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Update Call Records",
        "description": "Update a logged call by its id — outcome, notes, duration. Send only what changes. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "put_apollo_phone_calls_id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Call record ID."
          },
          {
            "name": "logged",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Whether to create an individual record."
          },
          {
            "name": "user_id[]",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Caller user IDs."
          },
          {
            "name": "contact_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Contact ID."
          },
          {
            "name": "account_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Account ID."
          },
          {
            "name": "to_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Dialed phone number."
          },
          {
            "name": "from_number",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Caller phone number."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Call status."
          },
          {
            "name": "start_time",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ISO 8601 start time."
          },
          {
            "name": "end_time",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ISO 8601 end time."
          },
          {
            "name": "duration",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Duration in seconds."
          },
          {
            "name": "phone_call_purpose_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Purpose ID."
          },
          {
            "name": "phone_call_outcome_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Outcome ID."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "phone_call": {
                      "type": "object",
                      "description": "Updated call record (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/usage_stats/api_usage_stats": {
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "View API Usage Stats and Rate Limits",
        "description": "Current API usage and rate-limit state for the Apollo key in use: consumption per window and how much headroom is left. Despite being a POST this reads rather than writes. ⚠️ The limits are the AIsa account's, shared across all callers — one caller exhausting a window affects everyone. Check it when calls start failing on rate limits rather than on their arguments.",
        "operationId": "post_apollo_usage_stats_api_usage_stats",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "api_usage_stats": {
                      "type": "object",
                      "description": "Usage stats and rate limits (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/users/search": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Get a List of Users",
        "description": "The user accounts in this Apollo workspace, as a `users` array with `id`, `first_name`, `last_name`, `email`, `title`, `team_id` and the various credit limits, plus `pagination`. Use it to resolve an `owner_id` seen on a contact, account or deal into a person. ⚠️ This exposes the workspace's own members and their email addresses, and the workspace belongs to AIsa rather than to the caller. Expect it to be slow — measured at roughly 16 seconds.",
        "operationId": "get_apollo_users_search",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Results per page."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "users": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Users (when returned)."
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/email_accounts": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Get a List of Email Accounts",
        "description": "The mailboxes connected to this workspace, as an `email_accounts` array with sending limits and per-account state. Takes no parameters. Check it before activating a sequence: a sequence with no healthy connected mailbox will not send.",
        "operationId": "get_apollo_email_accounts",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "email_accounts": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Email accounts (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/labels": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Get a List of All Lists",
        "description": "The lists (labels) defined in this workspace. The HTTP response is a bare JSON array; called as an MCP tool it arrives wrapped as `{\"result\": [...]}`, because a top-level array is not a valid structured result. Takes no parameters. Empty is a normal answer when no lists exist. Use it to resolve a list name into the id that contact and account filters expect.",
        "operationId": "get_apollo_labels",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "[]": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "List objects (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/typed_custom_fields": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Get a List of All Custom Fields",
        "description": "The custom fields defined in this workspace, as a `typed_custom_fields` array of `id`, `name`, `system_name`, `type`, `modality`, `picklist_options` and CRM mapping state. Takes no parameters. Call it before writing a custom field: the field key and, for picklists, the allowed values are workspace-specific, and a wrong value is rejected rather than coerced.",
        "operationId": "get_apollo_typed_custom_fields",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "typed_custom_fields": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Custom field definitions (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/apollo/fields": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Get a List of Fields",
        "description": "Every field Apollo exposes, standard and custom, as `fields` (roughly 323 entries with `id`, `field_name`, `label`, `type`, `category`, `modality`, `description` and `example`) plus `field_groups` describing how they are organised. Takes no parameters. This is the reference for what can be filtered or written anywhere else in the API. For custom fields alone, `get_apollo_typed_custom_fields` is much smaller.",
        "operationId": "get_apollo_fields",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "fields": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Field definitions (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      },
      "post": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Create a Custom Field",
        "description": "Create a custom field. ⚠️ This changes the workspace's schema rather than its data: the field appears on every record of that modality, for every caller, and removing it later is not something this API offers. Check `get_apollo_typed_custom_fields` first — the field you want may already exist. Writes land in the AIsa workspace, which every caller shares: the record becomes visible and editable by others, and there is no per-caller isolation.",
        "operationId": "post_apollo_fields",
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "typed_custom_fields": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Created field(s) (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        },
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "label": {
                    "type": "string",
                    "description": "Field label."
                  },
                  "modality": {
                    "type": "string",
                    "description": "Entity modality (e.g., contact)."
                  },
                  "type": {
                    "type": "string",
                    "description": "Field type (e.g., textarea)."
                  },
                  "meta": {
                    "type": "object",
                    "description": "Additional field config."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/apollo/notes": {
      "get": {
        "x-aisa-pricing": {
          "model": "per_request",
          "currency": "USD",
          "price_usd": 0.012,
          "cost_tier": "med"
        },
        "summary": "Get a List of Notes",
        "description": "Notes attached to workspace records. ⚠️ At least one filter is required — calling it bare returns HTTP 400 with \"At least one argument is required\". Pass one of `contact_id`, `account_id`, `opportunity_id`, `calendar_event_id`, `conversation_id`, `conversation_ids`, `contact_ids` or a `start_date`. The spec marks every one of them optional individually, which is true only in the sense that no single one is mandatory.",
        "operationId": "get_apollo_notes",
        "parameters": [
          {
            "name": "contact_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filter by a contact ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "account_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filter by an account ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "opportunity_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filter by an opportunity ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "calendar_event_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filter by a calendar event ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "conversation_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filter by a conversation ID. At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "conversation_ids",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Filter by conversation IDs. At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "contact_ids",
            "in": "query",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "description": "Filter by contact IDs. At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "start_date",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Only include notes created on/after this date (when supported). At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number (when supported). At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Results per page (when supported). At least one filter is required on this endpoint; calling it with none returns HTTP 400 \"At least one argument is required\"."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Notes (when returned)."
                    },
                    "pagination": {
                      "type": "object",
                      "description": "Pagination metadata (when returned)."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "429": {
            "description": "Rate limit exceeded"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    }
  }
}
