{"openapi":"3.1.0","info":{"title":"Explee Public API","description":"\n> **Tip**: This documentation is designed for humans. To integrate with AI agents, provide them with the OpenAPI schema at https://api.explee.com/public/api/openapi.json instead.\n\n&nbsp;\n\nSearch millions of companies worldwide using natural language queries and structured filters!\n\n**Rate limit**: 10000 requests per hour, 150 concurrent requests per organization. Timeout: 90s.\n","version":"1.0.0","x-logo":{"url":"https://explee.com/static/logo/explee/logo-large--light.png","altText":"Explee Logo"},"contact":{"name":"Explee Support","email":"support@explee.com","url":"https://explee.com"}},"paths":{"/public/api/v1/search/companies":{"post":{"tags":["Search"],"summary":"Companies","description":"Search for companies using structured definitions.\n\n## How It Works\n\nProvide a structured definition of your target companies in the `definition` field — our AI will find matching companies.\nAll other filters are optional.\nSee the request schema below for the full list of available filters.\n\n**Definition examples:**\n- `\"YouTube video summarization tool\"`\n- `\"electronic signature platform\"`\n- `\"AI B2B SaaS\"`\n- `\"real estate company\"`\n\n\n## AI Enrichment\n\nUse the `criteria` parameter to score companies against custom criteria.\nEach company will be evaluated and scored (0-5) with reasoning for each criterion.\n\n## Pricing\n\n- **First 10 results are free** (including AI enrichment)\n- A **positive credit balance is required for every request**, free results included (an organization at 0 credits gets a 402)\n- Entirely-free requests are limited per organization by plan: **free 50/day + 10/min · starter 200/day + 15/min · growth 500/day + 20/min · pro 750/day + 25/min · agency 1500/day + 30/min · enterprise 3000/day + 30/min** (429 beyond); billable requests are not affected\n- **0.5 credits** per company after the first 10\n- **+0.1 credits** per company per criterion after the first 10\n\nExample: 150 companies with 2 criteria = 50 billable × (0.5 + 0.1 × 2) = 35 credits (first 10 are free)\n\nEmpty results = 0 credits.\n\n## Deduplication\n\nPass dedup list ids in `exclude_lists` to skip companies you already own — they are not returned\nand not charged. Free results zone does not apply. See the Deduplication endpoints.","operationId":"search_companies_endpoint_public_api_v1_search_companies_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchCompaniesPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchCompaniesResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/search/companies-by-domains":{"post":{"tags":["Search"],"summary":"Companies by Domains","description":"Find companies by their domains.\n\n**How it works:**\n1. Provide a list of company domains (up to 1000)\n2. The system looks up each domain and returns **at most one** company profile per domain (the best match by quality score)\n\n**Pricing:**\n- **0.5 credit(s)** per company found\n- **0 credits** for domains not found\n\n**Limits:**\n- Maximum 1000 domains per request\n- Maximum 10000 companies per response\n\n**Deduplication:**\n- Pass dedup list ids in `exclude_lists` — matched companies are not returned and not charged","operationId":"search_companies_by_domains_endpoint_public_api_v1_search_companies_by_domains_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchCompaniesByDomainsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchCompaniesByDomainsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/search/people":{"post":{"tags":["Search"],"summary":"People","description":"Search for people (employees) at companies matching your criteria.\n\n## How It Works\n\nProvide `job_titles` in `people_filters` to find people by their role.\nUse `company_filters.definition` to narrow down which companies to search.\nUse `company_linkedin_ids` to restrict results to a specific list of company LinkedIn IDs.\n\n**Job title examples:**\n- `[\"Head of Sales\", \"VP Sales\"]`\n- `[\"CTO\", \"VP Engineering\"]`\n- `[\"Founder\", \"CEO\"]`\n\n## AI Enrichment\n\nUse the `criteria` parameter in `people_filters` to score people against custom criteria.\nEach person will be evaluated and scored (0-5) with reasoning for each criterion.\n\n## Pricing\n\n- **First 10 results are free** (including AI enrichment)\n- A **positive credit balance is required for every request**, free results included (an organization at 0 credits gets a 402)\n- Entirely-free requests are limited per organization by plan: **free 50/day + 10/min · starter 200/day + 15/min · growth 500/day + 20/min · pro 750/day + 25/min · agency 1500/day + 30/min · enterprise 3000/day + 30/min** (429 beyond); billable requests are not affected\n- **1.0 credit** per person after the first 10\n- **+0.1 credits** per person per criterion after the first 10\n\nExample: 150 people with 2 criteria = 50 billable × (1.0 + 0.1 × 2) = 60 credits (first 10 are free)\n\nEmpty results = 0 credits.\n\n## Deduplication\n\nPass dedup list ids in `exclude_lists` to skip people you already own — they are not returned\nand not charged. A companies list excludes everyone at its domains. Free results zone does not apply.\nSee the Deduplication endpoints.","operationId":"search_people_endpoint_public_api_v1_search_people_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPeoplePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPeopleResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/search/people-by-domains":{"post":{"tags":["Search"],"summary":"People by Domains","description":"Find people at companies by their domains.\n\n**How it works:**\n1. Provide a list of company domains (up to 1000) and job titles to search for\n2. The system finds companies by domains\n3. Returns up to `people_per_company` people per found company with matching job titles\n\n**Job title matching:**\n- Uses semantic search: \"Head of Sales\" will match \"VP Sales\", \"Sales Director\", etc.\n- Multiple job titles are combined with OR logic\n\n**Parameters:**\n- `people_per_company`: Number of people to return per company (1-1000, default: 1)\n\n**Limits:**\n- Maximum 1000 domains per request\n- Maximum 20 job titles per request\n- Maximum 1000 people per company\n- Maximum 10000 people per response (total)\n\n**Billing:**\n- 1 credit per person returned\n\n**Deduplication:**\n- Pass dedup list ids in `exclude_lists` — matched people are not returned and not charged","operationId":"search_people_by_domains_endpoint_public_api_v1_search_people_by_domains_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPeopleByDomainsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPeopleByDomainsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/search/nl-to-filters":{"post":{"tags":["Search"],"summary":"NL to Filters","description":"Convert a free-form natural language query into structured filters for companies and people search.\n\n## How It Works\n\nSend any query in plain English (or another language), for example:\n- `\"SaaS companies using Stripe\"`\n- `\"Founders of AI startups in Germany\"`\n- `\"B2B fintech companies in US and Canada\"`\n\nThe endpoint returns parsed filters in the same shape used by search endpoints:\n- `companies_filters`\n- `people_filters`\n- `focus` (`companies` or `people`)\n\nThis endpoint does not perform a search and does not charge credits.","operationId":"nl_to_filters_endpoint_public_api_v1_search_nl_to_filters_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NlToFiltersPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NlToFiltersResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/enrich/email":{"post":{"tags":["Contact"],"summary":"Find email by name","description":"Find email address for a single person.\n\n## How It Works\n\nProvide the person's first name, last name, and company domain.\n\n## Presets\n\n| Preset | Cost | Success Rate | Description |\n|--------|------|--------------|-------------|\n| **basic** | 1.5 credits | ~50% | Single provider, pattern-based lookup. Fast and cheap. |\n| **premium** | 5.0 credits | ~78% | 6 providers with cross-validation. Higher accuracy. |\n\n## Pricing\n\nYou are only charged when an email is found.\n\nEmail not found = 0 credits.","operationId":"enrich_email_endpoint_public_api_v1_enrich_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichEmailPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichEmailResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/enrich/phone":{"post":{"tags":["Contact"],"summary":"Find phone by LinkedIn URL","description":"Find the work phone number for a single person.\n\n## How It Works\n\nProvide the person's LinkedIn profile URL (`linkedin_url`) and we'll find their work\nphone. You can also pass a known `email` if you have one.\n\n## Presets\n\n| Preset | Cost | Success Rate | Description |\n|--------|------|--------------|-------------|\n| **basic_new** | 15.0 credits | ~45% | Faster, lower-cost lookup. |\n| **premium** | 30.0 credits | ~60% | Broader, multi-source lookup. Higher hit rate. |\n\n## Pricing\n\nYou are only charged when a phone is found.\n\nPhone not found = 0 credits.","operationId":"enrich_phone_endpoint_public_api_v1_enrich_phone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichPhonePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichPhoneResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/enrich/email/batch":{"post":{"tags":["Contact"],"summary":"Find email by name (batch request)","description":"Find email addresses for multiple contacts in one request (async).\n\n**How it works:**\n1. Submit up to 100 contacts with first_name, last_name, company_domain\n2. Receive a `task_id` immediately\n3. Poll GET endpoint with `task_id` to check status and retrieve results\n\n**Limits:**\n- Maximum 100 contacts per batch\n\n**Pricing:**\n- **basic**: 1.5 credits per found email\n- **premium**: 5 credits per found email\n- Only charged for emails found (not found = 0 credits)","operationId":"create_batch_enrichment_public_api_v1_enrich_email_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEnrichEmailPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchCreateResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/enrich/email/batch/{task_id}":{"get":{"tags":["Contact"],"summary":"Find email by name (batch results)","description":"Check status and retrieve results for a batch request.\n\n**Statuses (in meta.status):**\n- `pending` — processing in progress, poll again in a few seconds\n- `completed` — results ready, `contacts` array contains enriched data\n- `failed` — error occurred, see `meta.error` for details\n\n**Response structure:**\n- `contacts` — null while pending, array when completed\n- `meta.status` — current processing status\n- `meta.error` — error description (null if no error)\n- `meta.credits_charged` — credits used (only charged for found emails)\n\n**Typical workflow:**\n1. POST to submit batch, get `task_id`\n2. GET with `task_id`, check `meta.status`\n3. If `pending`, wait 2-5 seconds and poll again\n4. When `completed`, read `contacts` array","operationId":"get_batch_public_api_v1_enrich_email_batch__task_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","description":"Task ID returned from POST request","title":"Task Id"},"description":"Task ID returned from POST request"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Batch not found"}}}},"/public/api/v1/find-and-enrich":{"post":{"tags":["Contact"],"summary":"Find people and enrich their emails (async)","description":"Search for people matching your filters and enrich their emails in a single async job.\n\n**How it works:**\n1. Submit search filters + `max_contacts` (how many contacts with emails you want, max 500 per call)\n2. Receive a `task_id` immediately\n3. Poll the GET endpoint with `task_id` for `progress` (with `eta_seconds`) and results\n4. For more than `max_contacts`, call again with the previous response's `next_cursor`\n\n**Pricing:**\n- **Search is free** — you are never charged for people searched.\n- **basic**: 1.5 credits per found email · **premium**: 5 credits per found email.\n- You are charged ONLY for emails actually found. Worst-case credits are held up front (402 if insufficient).\n\n**Deduplication:** pass `exclude_lists` to skip people you already own — they are not enriched and not charged.\nA companies list skips everyone at its domains.","operationId":"create_find_and_enrich_public_api_v1_find_and_enrich_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindAndEnrichPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindAndEnrichCreateResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/find-and-enrich/{task_id}":{"get":{"tags":["Contact"],"summary":"Find-and-enrich job status and results","description":"Check progress and retrieve results for a find-and-enrich job.\n\n**Statuses (in meta.status):**\n- `pending` — running; read `meta.progress` (incl. `eta_seconds`) and poll again\n- `completed` — results ready; `contacts` holds the enriched contacts, `meta.next_cursor`/`meta.has_more` for paging\n- `failed` — error occurred (or timed out — credits released), see `meta.error`\n\nOnly contacts with a found email are returned. `meta.credits_charged` reflects found emails only.","operationId":"get_find_and_enrich_public_api_v1_find_and_enrich__task_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","description":"Task ID returned from POST request","title":"Task Id"},"description":"Task ID returned from POST request"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindAndEnrichResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Job not found"}}}},"/public/api/v1/tasks":{"get":{"tags":["Tasks"],"summary":"List async tasks","description":"List all async tasks for your organization, including find-and-enrich jobs,\nbatch email enrichments, and campaign lead imports.\n\n**Use cases:**\n- Track async jobs across every API key owned by the same organization\n- Find task IDs you may have lost\n- Monitor pending vs completed tasks\n\n**Response:**\n- `tasks` — array of task objects with status and result URL\n- `total` — total count for pagination\n\n**Filtering:**\n- Use `status` parameter to filter by task status (pending, completed, failed)","operationId":"list_tasks_public_api_v1_tasks_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["pending","completed","failed"],"type":"string"},{"type":"null"}],"description":"Filter by task status","title":"Status"},"description":"Filter by task status"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of tasks to return","default":20,"title":"Limit"},"description":"Maximum number of tasks to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of tasks to skip (for pagination)","default":0,"title":"Offset"},"description":"Number of tasks to skip (for pagination)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/public/api/v1/agents":{"get":{"tags":["Agents"],"summary":"List Explee agents","description":"Returns all pre-built Explee agents. Each agent has a fixed system prompt, input/output schema, and search strategy. Use the agent `id` with the \"Run Explee agent\" endpoint.","operationId":"list_agents_public_api_v1_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListAgentsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/agents/{agent_id}/runs":{"post":{"tags":["Agents"],"summary":"Run Explee agent","description":"Run a pre-built Explee agent by its ID. Explee agents come with a tuned system prompt, search strategy, and output schema — you only provide the input data.\n\nUse `GET /public/api/v1/agents` to browse available agents and their expected input schemas.\n\n**Cost**: 1 credit per run.","operationId":"start_agent_run_by_id_public_api_v1_agents__agent_id__runs_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAgentRunByIdPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAgentRunResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Agent not found"}}}},"/public/api/v1/agents/runs":{"post":{"tags":["Agents"],"summary":"Run custom agent","description":"Run a fully custom agent — you provide the system prompt, input/output schemas, and input data.\n\nUse this when Explee's pre-built agents don't fit your use case. The agent will execute asynchronously; poll `GET /agents/runs/{job_id}` for results.\n\n**Cost**: 1 credit per run.","operationId":"start_agent_run_public_api_v1_agents_runs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAgentRunPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAgentRunResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/agents/runs/{run_id}":{"get":{"tags":["Agents"],"summary":"Get agent run status","description":"Get the current status of an agent run.\n\nReturns `input` (original input data), `result` (agent output on success), and `meta` (status, progress, timing).","operationId":"get_agent_run_status_public_api_v1_agents_runs__run_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRunStatusResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/billing/balance":{"get":{"tags":["Billing"],"summary":"Get balance","description":"Return your organization's net credit balance — the same number shown on the\nExplee dashboard.\n\nPoll this to decide when to top up — when `remain` drops below the threshold you\nneed for upcoming requests, add credits on your billing page\n(https://explee.com/app-auto-gtm/billing).\n\n## Response\n```json\n{ \"remain\": 4200 }\n```\n`remain` is the net balance in credits (1 credit = $0.01): prepaid funds minus\nany active postpaid (outreach) usage that hasn't been collected yet. It can be\n**negative** if the org is carrying postpaid debt.","operationId":"balance_endpoint_public_api_v1_billing_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/autogtm/projects":{"get":{"tags":["Outreach"],"summary":"List outreach projects","description":"List the outreach projects owned by your organization.\n\nAuthenticated by the same `X-API-Key` as the rest of this API — the key resolves\nto your organization, and its active projects are returned newest first.\n\n**Response:**\n- `projects` — active projects with `id`, `domain` (the project's identity in\n  the app), and `daily_budget_usd` (the project-wide daily budget anchor,\n  `null` when not set).\n- `total` — number of projects returned.\n\nUse a project `id` to filter the campaigns list\n(`GET /public/api/v1/autogtm/campaigns?project_id=…`).","operationId":"list_projects_public_api_v1_autogtm_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectListResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/autogtm/campaigns":{"get":{"tags":["Outreach"],"summary":"List outreach campaigns","description":"List the outreach campaigns owned by your organization.\n\nAuthenticated by the same `X-API-Key` as the rest of this API — the key resolves\nto your organization, and campaigns are returned across all of its projects.\nPass `project_id` (see `GET /public/api/v1/autogtm/projects`) to get one\nproject's campaigns only.\n\n**Response:**\n- `campaigns` — non-archived campaigns with `id`, `project_id`, `name`,\n  `target_url`, `daily_limit_usd`, and lifecycle `status`.\n- `total` — number of campaigns returned.\n\nUse a campaign `id` to scope follow-up management calls (inbox replies, budget,\nstart/stop, analytics).","operationId":"list_campaigns_public_api_v1_autogtm_campaigns_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Return only this project's campaigns (see `GET /public/api/v1/autogtm/projects`).","title":"Project Id"},"description":"Return only this project's campaigns (see `GET /public/api/v1/autogtm/projects`)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignListResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown `project_id` (or not your project).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}":{"get":{"tags":["Outreach"],"summary":"Get campaign definition","description":"Read everything that decides who a campaign contacts and what it says — the\napp's **Campaign** tab in one call.\n\n**Who it targets:** `offer`, `customer_problem`, `target_role`,\n`target_geography`, `target_company_size`, `positive_criteria`,\n`negative_criteria`, `example_clients`, and the derived `keywords`.\n\n**What it says:** `instructions` (first email), `followup_instructions` (shared\nby every follow-up), `language`, and the project-level `reply_instructions`.\n\n**When it says it:** `schedule` (the send days) and `followups` (how many\nemails the sequence has and how far apart — a project-level setting, the\nsame for every campaign of the project).\n\n`targeting_editable` is `false` for a campaign built from your own imported\nlead list — its audience is that list, so the targeting fields are locked.\n\nFree, and the natural first call when auditing an account: one request per\ncampaign tells you whether it is aimed at the right people, before a single\nemail goes out.","operationId":"get_campaign_definition_public_api_v1_autogtm_campaigns__campaign_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDefinition"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Outreach"],"summary":"Update campaign definition","description":"Correct a campaign's definition — send only the fields you are changing.\n\nAn omitted field keeps its value; an empty string, empty list or `null` clears\nit — except `name`, which a campaign always has, so clearing it is a `422`.\nAn unknown field name is rejected with `422` rather than silently ignored, so\na typo can never look like a successful write. Returns the full definition as\nit now stands.\n\n**Re-aiming costs leads.** Changing `target_role`, `target_geography`,\n`target_company_size`, `positive_criteria` or `negative_criteria` is a retarget,\nexactly as in the app: the leads this campaign has not contacted yet are dropped\nand Explee searches again against the new targeting. Editing the offer or the\nemail briefs does not — it only changes what is written to the leads still to\ncome. Emails already sent are never affected.\n\nThe rule for this endpoint: **anything a person can edit on the campaign in the\napp, you can edit here** — with the exceptions below, each of which exists\nbecause the app validates it in a second step this endpoint cannot reproduce.\n\nRead-only here: `instructions` and `followup_instructions` (the copy briefs —\nthe app moderates them right after saving and shows you the verdict; this\nendpoint has no preview to show, and an unmoderated brief only fails later, at\nsend time), `target_url` and `reply_instructions` (their own two-step save),\n`keywords` (Explee derives it; read-only in the app too) and `followups` (a\nproject-level setting shared by every campaign of the project: sending the\ncurrent values back is accepted, different ones are a `422`). Budget has\n`PATCH /public/api/v1/autogtm/campaigns/{campaign_id}/budget`, status has\n`start` / `stop`. You can still SET the briefs when you create a campaign —\n`POST /public/api/v1/autogtm/campaigns/import` takes `instructions`,\n`followup_instructions` and `language`.","operationId":"update_campaign_definition_public_api_v1_autogtm_campaigns__campaign_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDefinitionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignDefinition"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Targeting is locked: this campaign runs on your imported lead list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/autogtm/campaigns/import":{"post":{"tags":["Outreach"],"summary":"Create a campaign from your own leads (import)","description":"Create a new campaign from your own lead list (async).\n\nEach call creates a **new** campaign in the given project — the campaign is\nbuilt for your leads only (no agent lead discovery) and starts sending\nautomatically once live, within your project budget.\n\n**How it works:**\n1. Submit `project_id`, a campaign `name`, and up to 30,000 `leads`\n2. Receive a `task_id` immediately\n3. Poll `GET /public/api/v1/autogtm/campaigns/import/{task_id}` until `completed`\n4. `result.campaign_id` is your new campaign — it appears in the campaigns list\n\n**Per lead** — mandatory: `email`, `first_name`, `last_name`, `company_domain`,\n`job_title`; recommended: `linkedin_url` (enriches the lead from Explee's\ncontact base for a richer email). Leads missing mandatory fields are skipped\n(reported in the result), never a request-level error. Duplicates of leads\nalready contacted in the project and do-not-contact entries are dropped.\n\n**Your copy brief** — optional `instructions` (first email),\n`followup_instructions` (all follow-ups) and `language`: the same brief you\nwould type in the app's email editor, set here at import time so no manual\nstep is needed. Omit them and the campaign is briefed from your project\ndescription alone.\n\n**Pricing:** the import itself is free. Emails are verified at send time at\nExplee's cost; sending is billed as usual.","operationId":"create_campaign_import_public_api_v1_autogtm_campaigns_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignImportPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignImportCreateResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many pending imports.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Unknown `project_id` (or not your project).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/autogtm/campaigns/import/{task_id}":{"get":{"tags":["Outreach"],"summary":"Campaign import status/result","description":"Check status and retrieve the result of a campaign import.\n\n**Statuses:**\n- `pending` — import in progress; `progress` shows the current stage. Poll\n  every few seconds.\n- `completed` — done; `result.campaign_id` is the new campaign (or `null` if\n  no leads survived validation/dedup — then no campaign was created).\n- `failed` — see `error`.","operationId":"get_campaign_import_public_api_v1_autogtm_campaigns_import__task_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","description":"Task ID returned from the import POST.","title":"Task Id"},"description":"Task ID returned from the import POST."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignImportStatusResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Import task not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/autogtm/hot-leads":{"get":{"tags":["Outreach"],"summary":"List hot leads","description":"Every **hot lead** across your organization — people who replied to your\noutreach with real interest — newest first, as enriched contacts ready to\nmap into CRM fields.\n\n**Polling:** pass `since` (ISO 8601) with your last poll time to get only\nleads that went hot after it — the Zapier/Make pattern. `became_hot_at` of\nthe newest item is your next cursor.\n\nA lead leaves the feed when you dismiss it in the inbox («Not a hot lead»)\nor when it later unsubscribes. To read the full conversation or answer:\n`GET /autogtm/campaigns/{campaign_id}/inbox/{person_id}` and `…/reply`.","operationId":"list_hot_leads_public_api_v1_autogtm_hot_leads_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Only this campaign. Omit for the whole organization.","title":"Campaign Id"},"description":"Only this campaign. Omit for the whole organization."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only leads that became hot at/after this time (ISO 8601). Use for polling.","title":"Since"},"description":"Only leads that became hot at/after this time (ISO 8601). Use for polling."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Page size.","default":50,"title":"Limit"},"description":"Page size."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset.","default":0,"title":"Offset"},"description":"Pagination offset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HotLeadsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"`campaign_id` not found or not owned by your organization."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/inbox":{"get":{"tags":["Outreach"],"summary":"List inbox conversations","description":"List the campaign's conversations (contacted people), most recent first.\n\n**Tabs:** `need_reply` — replies awaiting a human answer (start here),\n`replied` — everyone who replied, `sent` — everyone contacted. Omit for the\nfull universe.","operationId":"list_inbox_public_api_v1_autogtm_campaigns__campaign_id__inbox_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"tab","in":"query","required":false,"schema":{"anyOf":[{"enum":["need_reply","replied","sent"],"type":"string"},{"type":"null"}],"description":"Filter: `need_reply`, `replied` or `sent`. Omit for all.","title":"Tab"},"description":"Filter: `need_reply`, `replied` or `sent`. Omit for all."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Page size.","default":50,"title":"Limit"},"description":"Page size."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset.","default":0,"title":"Offset"},"description":"Pagination offset."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxContactsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/inbox/{person_id}":{"get":{"tags":["Outreach"],"summary":"Read a conversation thread","description":"The full conversation with one contact: our outbound emails and their replies,\nin order, plus the reply gate (`can_reply`). Every message carries its `cc`\naddresses and the metadata of its `attachments` (name, type, size).\n\nTo answer, POST to `/reply` with just your message text.","operationId":"get_thread_public_api_v1_autogtm_campaigns__campaign_id__inbox__person_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"person_id","in":"path","required":true,"schema":{"type":"string","title":"Person Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreadResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/inbox/{person_id}/attachments/{attachment_id}":{"get":{"tags":["Outreach"],"summary":"Download an attachment","description":"Get a download link for a file attached to a message in this conversation —\none the lead sent you or one you sent. Take `attachment_id` from\n`messages[].attachments[].id` of the thread.\n\nReturns `url`, a signed link to the file valid for 5 minutes (`expires_at`):\nfetch it with a plain GET, no API key. A file listed with `stored: false` was\nreceived but could not be stored — `410`.","operationId":"download_attachment_public_api_v1_autogtm_campaigns__campaign_id__inbox__person_id__attachments__attachment_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"person_id","in":"path","required":true,"schema":{"type":"string","title":"Person Id"}},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"string","title":"Attachment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentLinkResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such attachment in this conversation, or campaign not found."},"410":{"description":"The file was received but could not be stored (`stored: false`)."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/attachments":{"post":{"tags":["Outreach"],"summary":"Upload an attachment","description":"Upload a file to attach to a reply in this campaign. Send it as\n`multipart/form-data` with the field `file`, then pass the returned `id` in\n`attachment_ids` of `…/inbox/{person_id}/reply`.\n\n**Limits:** up to 25 MB per file; PDF, PNG, JPEG, GIF, WebP, DOCX, PPTX, XLSX,\nTXT. Every file is checked by the same content moderation as uploads in the app\n— a refused file is `400` with the reason; if the check is briefly unavailable,\n`503` (retry). A reply carries up to 10 files, and their total must fit the\nsending mailbox (`413` on `…/reply`). Up to 200 uploads per hour per API key\n(`429` beyond that).","operationId":"upload_attachment_public_api_v1_autogtm_campaigns__campaign_id__attachments_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_attachment_public_api_v1_autogtm_campaigns__campaign_id__attachments_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadedAttachmentResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"More than 200 uploads in the last hour for this API key."},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization."},"400":{"description":"File refused by content moderation, or its type is not allowed."},"413":{"description":"File larger than 25 MB."},"503":{"description":"Moderation or file storage briefly unavailable — retry."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/inbox/{person_id}/reply":{"post":{"tags":["Outreach"],"summary":"Reply in a thread","description":"Reply to this contact — send just the message text.\n\nYou reply to the **lead**, not to an email address: the server resolves the\nrecipient, the subject (`Re: …`) and the threading from the contact's real\nconversation, so a reply can only ever go back to the person who wrote to you —\nnever to an address you supply. The message goes through the same compliance\ngate and content moderation as replies sent from the app.\n\n**Files:** upload each via `POST …/attachments` and pass the ids in\n`attachment_ids` (up to 10). Allowed only in a thread the lead has replied to.\n\n**Cc:** by default the reply keeps the people the lead had on Cc (`reply_all`)\nplus your campaign's `reply_cc_emails`. Add per-reply addresses in\n`cc_emails`; set `reply_all: false` to drop the lead's Cc.\n\nAllowed only for a contact who has **replied** and isn't `unsubscribe`\n— otherwise `403`. You may send at most three replies per message the lead sent\nyou (`429` if exceeded). The send is recorded under your organization's owner\nidentity (an API key carries no user).","operationId":"send_reply_public_api_v1_autogtm_campaigns__campaign_id__inbox__person_id__reply_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"person_id","in":"path","required":true,"schema":{"type":"string","title":"Person Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendReplyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendReplyResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many replies to this contact in the last 24h."},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization."},"403":{"description":"Reply blocked: `unsubscribe` thread, or the contact never replied."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/inbox/{person_id}/note":{"get":{"tags":["Outreach"],"summary":"Read the lead note","description":"The team-shared note on this lead — the same free-text field your team sees\nand edits in the Explee inbox (Lead info panel). `note` is `null` when no\nnote has been set.","operationId":"get_lead_note_public_api_v1_autogtm_campaigns__campaign_id__inbox__person_id__note_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"person_id","in":"path","required":true,"schema":{"type":"string","title":"Person Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadNoteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign or lead not found, or not owned by your organization."}}},"post":{"tags":["Outreach"],"summary":"Set the lead note","description":"Set (or clear) the lead's team-shared note. The note is one shared text per\nlead, last-write-wins — a write here replaces what a teammate typed in the\napp, and vice versa.\n\nPass `{\"note\": null}` (or an empty string) to clear it.","operationId":"set_lead_note_public_api_v1_autogtm_campaigns__campaign_id__inbox__person_id__note_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"person_id","in":"path","required":true,"schema":{"type":"string","title":"Person Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetLeadNoteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadNoteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign or lead not found, or not owned by your organization."}}}},"/public/api/v1/autogtm/projects/{project_id}/budget":{"get":{"tags":["Outreach"],"summary":"Get project daily budget","description":"Read the project's total daily outreach budget (the anchor the dashboard\nslider sets).\n\nPer-campaign allocations are derived from this number automatically — see\n`daily_limit_usd` on each campaign in `GET /autogtm/campaigns`.","operationId":"get_budget_public_api_v1_autogtm_projects__project_id__budget_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectBudgetInfo"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Project not found or not owned by your organization."}}},"patch":{"tags":["Outreach"],"summary":"Set project daily budget","description":"Set the project's total daily outreach budget.\n\nThe change is spread across the project's active campaigns proportionally —\nexactly what the dashboard slider does. **`0` pauses all sending** while\nkeeping campaigns configured (the explicit off switch).","operationId":"set_budget_public_api_v1_autogtm_projects__project_id__budget_patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProjectBudgetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectBudgetInfo"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Project not found or not owned by your organization."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/budget":{"patch":{"tags":["Outreach"],"summary":"Set campaign daily budget","description":"Set one campaign's daily budget.\n\nThe campaign's `daily_limit_usd` is set directly and the project's total daily\nbudget follows as the sum of its running campaigns — the other campaigns are not\ntouched (grow or shrink the total spend, not redistribute a fixed one).\n\n**Editable only while Autopilot is OFF** (`GET/PATCH …/projects/{id}/autopilot`):\nwhile it's ON the agent owns the split and this returns `409`. A paused / not-yet-\nrunning campaign holds no allocation, so setting its budget also returns `409` —\nresume it first. To set the whole-project budget instead, use\n`PATCH …/projects/{id}/budget`.","operationId":"set_campaign_budget_public_api_v1_autogtm_campaigns__campaign_id__budget_patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetCampaignBudgetBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignBudgetResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Auto-manage campaigns is ON (budget is agent-managed) or the campaign is not running.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/stop":{"post":{"tags":["Outreach"],"summary":"Stop campaign","description":"Stop a campaign **from any status**, idempotently: interrupts a running lead\nsearch, cancels queued outreach emails, and freezes a pending review's\nauto-approve countdown. Nothing sends until it is started again.\n\nAlways available, in either mode — stopping is the user's right; only\n(re)starting is agent-owned while Auto-manage campaigns is ON.","operationId":"stop_public_api_v1_autogtm_campaigns__campaign_id__stop_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlAccepted"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization."}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/start":{"post":{"tags":["Outreach"],"summary":"Start campaign","description":"Re-enable a stopped campaign — the status-aware inverse of stop:\n\n- stopped while sending → resumes sending (requires an affordable balance);\n- stopped in review → un-freezes the review countdown;\n- stopped during lead search → re-runs the search.\n\nAlready-running or archived campaigns are a no-op.\n\nReturns **409** while Auto-manage campaigns is enabled for the project — Explee decides\nwhen campaigns start. Exception: a campaign you parked yourself (stopped, or\nrestored from archive) can always be started again, in either mode. Turn\nAutopilot off (`PATCH …/projects/{project_id}/autopilot`) to start any other\ncampaign yourself.","operationId":"start_public_api_v1_autogtm_campaigns__campaign_id__start_post","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlAccepted"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization."},"409":{"description":"Auto-manage campaigns is ON for the project — Explee decides when campaigns start.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/autogtm/campaigns/{campaign_id}/analytics":{"get":{"tags":["Outreach"],"summary":"Campaign analytics","description":"Campaign performance for a period: emails sent, replies, reply rate, hot leads,\nspend, cost per lead, budget allocation, the leads pool and the manual lead\nfunnel. The same numbers the Explee dashboard shows — use them to drive your\nown budget/start/stop decisions.","operationId":"campaign_analytics_public_api_v1_autogtm_campaigns__campaign_id__analytics_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"integer","title":"Campaign Id"}},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d","all"],"type":"string","description":"Aggregation window.","default":"all","title":"Period"},"description":"Aggregation window."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignAnalyticsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Campaign not found or not owned by your organization."}}}},"/public/api/v1/autogtm/projects/{project_id}/analytics":{"get":{"tags":["Outreach"],"summary":"Project analytics","description":"Project-level performance for a period: the aggregate totals (emails, replies,\nreply rate, hot leads, spend) plus the per-campaign breakdown — exactly what the\nExplee dashboard shows for a project. Both the totals and the per-campaign rows\ncover the requested `period`.","operationId":"project_analytics_public_api_v1_autogtm_projects__project_id__analytics_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}},{"name":"period","in":"query","required":false,"schema":{"enum":["today","7d","30d","all"],"type":"string","description":"Aggregation window.","default":"all","title":"Period"},"description":"Aggregation window."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectAnalyticsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Project not found or not owned by your organization."}}}},"/public/api/v1/autogtm/suppress-list/people":{"get":{"tags":["Outreach"],"summary":"People suppress lists","description":"Your people lists — the ones on the app's Suppress list page, newest first.","operationId":"list_people_lists_public_api_v1_autogtm_suppress_list_people_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressListsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["Outreach"],"summary":"Suppress people","description":"Store a list of people to suppress — the same lists the **Suppress list** page\nin the app shows, so a list pushed from your CRM sits next to the CSVs your\nteam uploaded and behaves identically.\n\n\nThe suppress list is organization-wide: it applies to **every** outreach\ncampaign, running or not. Every email is checked against it right before it\ngoes out, so an address added here stops a sequence that is already mid-flight,\nnot just future ones.\n\nMatching is exact: a person by their email address (case-insensitive, but\n`jane+crm@acme.com` and `jane@acme.com` are two different entries), a company by\nits domain (the lead's company domain or the domain of its email address —\n`acme.com` does not cover `eu.acme.com`, list each domain you use).\n\n\nOne call = one list, exactly like uploading one CSV: a `list` name that is\nalready taken gets a `(2)` suffix rather than merging, and lists are\nindependent — the same person on two lists is suppressed until both are gone.\nDelete a list you no longer want.\n\nEach person needs at least one identifier: an email, a LinkedIn URL, or a full\nname; a row left without a usable one (including a malformed address) comes back\nin `skipped` instead of failing the whole batch. **Outreach stops on the email** — the name and LinkedIn fields are stored\nbut not actively used today; they are kept because a suppressed person is more\nthan their email address, and the day outreach runs somewhere other than email\n(LinkedIn and the like) those are the fields that will match. To suppress\neveryone at a company use the companies endpoint.","operationId":"add_people_public_api_v1_autogtm_suppress_list_people_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressPeopleBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressWriteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/autogtm/suppress-list/people/{list_name}":{"get":{"tags":["Outreach"],"summary":"Read a people list","description":"The people stored in one list. `total` is the exact size; page through it with `limit`/`offset`.","operationId":"read_people_list_public_api_v1_autogtm_suppress_list_people__list_name__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_name","in":"path","required":true,"schema":{"type":"string","maxLength":255,"description":"List name.","title":"List Name"},"description":"List name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Entries per page.","default":500,"title":"Limit"},"description":"Entries per page."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"description":"Entries to skip.","default":0,"title":"Offset"},"description":"Entries to skip."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressPeopleEntriesResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such list in your organization."}}},"delete":{"tags":["Outreach"],"summary":"Delete a people list","description":"Remove a whole list, exactly like deleting it on the Suppress list page — its people stop being suppressed unless another list still holds them.","operationId":"delete_people_list_public_api_v1_autogtm_suppress_list_people__list_name__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_name","in":"path","required":true,"schema":{"type":"string","maxLength":255,"description":"List name.","title":"List Name"},"description":"List name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressDeleteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such list in your organization."}}}},"/public/api/v1/autogtm/suppress-list/companies":{"get":{"tags":["Outreach"],"summary":"Company suppress lists","description":"Your blocked-company lists — the ones on the app's Suppress list page, newest first.","operationId":"list_company_lists_public_api_v1_autogtm_suppress_list_companies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressListsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["Outreach"],"summary":"Suppress companies","description":"Store a list of company domains to suppress — nobody at these companies is\ncontacted.\n\n\nThe suppress list is organization-wide: it applies to **every** outreach\ncampaign, running or not. Every email is checked against it right before it\ngoes out, so an address added here stops a sequence that is already mid-flight,\nnot just future ones.\n\nMatching is exact: a person by their email address (case-insensitive, but\n`jane+crm@acme.com` and `jane@acme.com` are two different entries), a company by\nits domain (the lead's company domain or the domain of its email address —\n`acme.com` does not cover `eu.acme.com`, list each domain you use).\n\n\nOne call = one list, exactly like uploading one CSV: a `list` name that is\nalready taken gets a `(2)` suffix rather than merging, and lists are\nindependent. Delete a list you no longer want.\n\nDomains are normalized (`https://www.acme.com/careers` → `acme.com`), so two\nspellings of one company collapse into a single entry. Values that are not a\ndomain come back as `skipped`. Subdomains are separate entries — `acme.com`\ndoes not cover `eu.acme.com`.","operationId":"add_companies_public_api_v1_autogtm_suppress_list_companies_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressCompaniesBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressWriteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/autogtm/suppress-list/companies/{list_name}":{"get":{"tags":["Outreach"],"summary":"Read a company list","description":"The domains stored in one list. `total` is the exact size; page through it with `limit`/`offset`.","operationId":"read_company_list_public_api_v1_autogtm_suppress_list_companies__list_name__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_name","in":"path","required":true,"schema":{"type":"string","maxLength":255,"description":"List name.","title":"List Name"},"description":"List name."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Entries per page.","default":500,"title":"Limit"},"description":"Entries per page."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"description":"Entries to skip.","default":0,"title":"Offset"},"description":"Entries to skip."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressCompaniesEntriesResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such list in your organization."}}},"delete":{"tags":["Outreach"],"summary":"Delete a company list","description":"Remove a whole list, exactly like deleting it on the Suppress list page — its companies stop being suppressed unless another list still blocks them.","operationId":"delete_company_list_public_api_v1_autogtm_suppress_list_companies__list_name__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_name","in":"path","required":true,"schema":{"type":"string","maxLength":255,"description":"List name.","title":"List Name"},"description":"List name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressDeleteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such list in your organization."}}}},"/public/api/v1/autogtm/projects/{project_id}/autopilot":{"get":{"tags":["Outreach"],"summary":"Get autopilot settings","description":"Read the project's autopilot and auto-reply settings.\n\n- `autopilot_enabled` — the Explee autopilot agent. While ON it manages\n  campaigns and the per-campaign budget split (per-campaign budget edits return\n  409); turn it OFF to control budgets yourself.\n- `auto_reply_enabled` / `auto_reply_delay_minutes` — AI auto-reply behaviour.\n- `reply_cc_emails` — project defaults added to CC on every manual or automatic reply.","operationId":"get_autopilot_public_api_v1_autogtm_projects__project_id__autopilot_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutopilotInfo"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Project not found or not owned by your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["Outreach"],"summary":"Set autopilot settings","description":"Update the project's autopilot / auto-reply settings. Send only the fields you\nwant to change — at least one is required.\n\nTurning `autopilot_enabled` **off** hands per-campaign budgets back to you\n(`PATCH …/campaigns/{id}/budget` stops returning 409); turning it **on** makes\nthem agent-managed again.","operationId":"set_autopilot_public_api_v1_autogtm_projects__project_id__autopilot_patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"integer","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetAutopilotBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutopilotInfo"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"No fields to update.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Project not found or not owned by your organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/feedback":{"post":{"tags":["Feedback"],"summary":"Send feedback","description":"Send us freeform feedback about the API: request a feature, report a problem,\ntell us data is missing or wrong — anything, in your own words.\n\nThe message lands directly with the Explee team. We read everything, though we\ndon't guarantee an individual reply. No credits are charged.","operationId":"submit_feedback_public_api_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/dedup/people":{"get":{"tags":["Deduplication"],"summary":"People Lists","operationId":"get_people_dedup_lists_public_api_v1_dedup_people_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["Deduplication"],"summary":"Create People List","description":"Create an immutable list of people you already own. Pass the person objects returned by people search or\nfind-and-enrich in `people`; they are matched by LinkedIn URL, normalized email, or first name + last name +\ncompany domain. Existing integrations can keep using the legacy `linkedin_urls` field.\n\nPass the returned id in `exclude_lists` on people search — matched people are not returned and not charged.\n\nLists can't be modified: to grow your ledger, create a new list per batch and pass all ids;\nconsolidate periodically. URLs are normalized on write; unparseable values are skipped and reported.\n\n**Limits:** 100,000 values per list; per search request: 100 lists, 500,000 values combined.","operationId":"create_people_dedup_list_public_api_v1_dedup_people_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupPeopleListPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListCreateResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/dedup/people/{list_id}":{"get":{"tags":["Deduplication"],"summary":"Get People List","description":"Returns the list metadata and all stored values.","operationId":"get_people_dedup_list_public_api_v1_dedup_people__list_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","description":"Dedup list id (returned on creation).","title":"List Id"},"description":"Dedup list id (returned on creation)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Dedup list not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Deduplication"],"summary":"Delete People List","description":"Removes the whole list. Excluded people will appear (and be charged) in search results again.","operationId":"delete_people_dedup_list_public_api_v1_dedup_people__list_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","description":"Dedup list id (returned on creation).","title":"List Id"},"description":"Dedup list id (returned on creation)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListDeleteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Dedup list not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/public/api/v1/dedup/companies":{"get":{"tags":["Deduplication"],"summary":"Companies Lists","operationId":"get_companies_dedup_lists_public_api_v1_dedup_companies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListsResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["Deduplication"],"summary":"Create Companies List","description":"Create an immutable list of companies you already own (`domain` values from search results).\nPass the returned id in `exclude_lists` on companies search — matched companies are not returned and not charged.\nThe same id works on people search, people-by-domains and find-and-enrich: everyone at a listed company is skipped\n(exact domain match, subdomains are separate companies). People and companies lists can be mixed in one request.\n\nLists can't be modified: to grow your ledger, create a new list per batch and pass all ids;\nconsolidate periodically. Domains are normalized on write; unparseable values are skipped and reported.\n\n**Limits:** 100,000 values per list; per search request: 100 lists, 500,000 values combined.","operationId":"create_companies_dedup_list_public_api_v1_dedup_companies_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupCompaniesListPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListCreateResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"APIKeyHeader":[]}]}},"/public/api/v1/dedup/companies/{list_id}":{"get":{"tags":["Deduplication"],"summary":"Get Companies List","description":"Returns the list metadata and all stored values.","operationId":"get_companies_dedup_list_public_api_v1_dedup_companies__list_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","description":"Dedup list id (returned on creation).","title":"List Id"},"description":"Dedup list id (returned on creation)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Dedup list not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["Deduplication"],"summary":"Delete Companies List","description":"Removes the whole list. Excluded companies will appear (and be charged) in search results again.","operationId":"delete_companies_dedup_list_public_api_v1_dedup_companies__list_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"list_id","in":"path","required":true,"schema":{"type":"string","description":"Dedup list id (returned on creation).","title":"List Id"},"description":"Dedup list id (returned on creation)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupListDeleteResponse"}}}},"401":{"description":"Invalid or missing API key. Include `X-API-Key` header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient credit balance. Every request needs a positive balance, including requests that fall entirely inside the free results zone. Top up your account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error. Check request body and parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded (10000/hour), concurrent limit reached (150 per organization), or free preview quota exceeded (search requests entirely within the free results zone; the quota depends on your plan).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal server error. Contact support if persists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"504":{"description":"Request timeout. Please try again later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Dedup list not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"AgentInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"category":{"type":"string","title":"Category"},"input_schema":{"type":"object","title":"Input Schema","example":{"properties":{"domain":{"type":"string"}},"required":["domain"],"type":"object"}},"output_schema":{"type":"object","title":"Output Schema","example":{"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"}}},"type":"object","required":["id","name","description","category","input_schema","output_schema"],"title":"AgentInfo"},"AgentRunMeta":{"properties":{"run_id":{"type":"string","title":"Run Id"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"trajectory_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trajectory Url"},"progress_percent":{"type":"integer","title":"Progress Percent","default":0},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"}},"type":"object","required":["run_id","status"],"title":"AgentRunMeta"},"AgentRunStatusResponse":{"properties":{"result":{"anyOf":[{"type":"object","example":{"name":"Stripe, Inc.","website":"stripe.com"}},{"type":"null"}],"title":"Result"},"input":{"type":"object","title":"Input","example":{"domain":"stripe.com"}},"meta":{"$ref":"#/components/schemas/AgentRunMeta"}},"type":"object","required":["input","meta"],"title":"AgentRunStatusResponse"},"AttachmentLinkResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Signed link to the file. Fetch it with a plain GET — no API key."},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename","description":"File name as sent."},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"MIME type, e.g. `application/pdf`."},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"When `url` stops working (5 minutes after this call)."}},"type":"object","required":["url","expires_at"],"title":"AttachmentLinkResponse","description":"A short-lived download link for one attachment."},"AutopilotInfo":{"properties":{"project_id":{"type":"integer","title":"Project Id","description":"Project the settings belong to."},"autopilot_enabled":{"type":"boolean","title":"Autopilot Enabled","description":"Auto-manage campaigns (the retrospective agent). When ON, auto-manage runs campaigns and the per-campaign budget split (per-campaign budget edits return 409); turn it OFF to control budgets yourself."},"auto_reply_enabled":{"type":"boolean","title":"Auto Reply Enabled","description":"AI auto-reply to hot-lead inbound emails."},"auto_reply_delay_minutes":{"type":"integer","title":"Auto Reply Delay Minutes","description":"Minutes to wait after a hot-lead reply before the auto-reply sends (0–1440)."},"reply_cc_emails":{"items":{"type":"string"},"type":"array","title":"Reply Cc Emails","description":"Persisted project defaults added to CC on every manual or automatic reply."}},"type":"object","required":["project_id","autopilot_enabled","auto_reply_enabled","auto_reply_delay_minutes","reply_cc_emails"],"title":"AutopilotInfo","description":"A project's autopilot / auto-reply settings."},"BalanceResponse":{"properties":{"remain":{"type":"integer","title":"Remain"}},"type":"object","required":["remain"],"title":"BalanceResponse"},"BatchCreateResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Unique identifier for this batch task. Use this ID to check status and retrieve results.","examples":["550e8400-e29b-41d4-a716-446655440000"]}},"type":"object","required":["task_id"],"title":"BatchCreateResponse","description":"Response after creating a batch enrichment request."},"BatchEnrichEmailPayload":{"properties":{"contacts":{"items":{"$ref":"#/components/schemas/ContactInput"},"type":"array","maxItems":100,"minItems":1,"title":"Contacts","description":"List of contacts to enrich (max 100)"},"preset":{"type":"string","enum":["basic","premium"],"title":"Preset","description":"Quality preset: basic (1 provider, fast) or premium (6 providers, validated)","default":"basic"}},"type":"object","required":["contacts"],"title":"BatchEnrichEmailPayload","description":"Request payload for batch email enrichment endpoint.","example":{"contacts":[{"company_domain":"x.ai","first_name":"Ma","last_name":"Lin"},{"company_domain":"tesla.com","first_name":"Elon","last_name":"Musk"}],"preset":"basic"}},"BatchResponse":{"properties":{"contacts":{"anyOf":[{"items":{"$ref":"#/components/schemas/ContactOutput"},"type":"array"},{"type":"null"}],"title":"Contacts","description":"Enriched contacts with emails. Null while pending, array when completed."},"meta":{"$ref":"#/components/schemas/BatchResponseMeta","description":"Request metadata including status, error, and credits charged."}},"type":"object","required":["meta"],"title":"BatchResponse","description":"Response for batch enrichment status and results."},"BatchResponseMeta":{"properties":{"status":{"type":"string","enum":["pending","completed","failed"],"title":"Status","description":"Current status: pending (processing), completed (results ready), failed (error occurred)","examples":["completed"]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error description when status is failed. Null otherwise."},"credits_charged":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Charged","description":"Credits charged for this batch. Null while pending, populated when completed.","examples":[7.5]}},"type":"object","required":["status"],"title":"BatchResponseMeta","description":"Metadata for batch enrichment response."},"Body_upload_attachment_public_api_v1_autogtm_campaigns__campaign_id__attachments_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"The file to attach."}},"type":"object","required":["file"],"title":"Body_upload_attachment_public_api_v1_autogtm_campaigns__campaign_id__attachments_post"},"CampaignAnalyticsResponse":{"properties":{"campaign_id":{"type":"integer","title":"Campaign Id","description":"Campaign identifier."},"name":{"type":"string","title":"Name","description":"Campaign name."},"status":{"type":"string","title":"Status","description":"Effective campaign status: `discovery` (not launched), `starting`, `searching` (finding leads), `review`, `outreach` (sending), `listening` (sending finished or paused — see `status_reason`), `budget_paused`, `card_paused`, `stopped`, `launch_failed`, `archived`, `error`. Note: a paused campaign reports `listening` with a pause reason in `status_reason` (e.g. `user_pause`, `billing_pause`) — the literal value `paused` is never emitted."},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason","description":"Machine-readable reason for the latest status change."},"period":{"type":"string","title":"Period","description":"The period these counts cover: `today`, `7d`, `30d` or `all`."},"emails_sent":{"type":"integer","title":"Emails Sent","description":"Cold + follow-up emails sent in the period."},"total_replies":{"type":"integer","title":"Total Replies","description":"Human replies received in the period (bounces/auto-replies excluded)."},"reply_rate_pct":{"type":"number","title":"Reply Rate Pct","description":"Replies ÷ emails sent, in percent (0 when nothing was sent)."},"hot_leads":{"type":"integer","title":"Hot Leads","description":"Distinct contacts classified as hot leads in the period."},"spend_usd":{"type":"number","title":"Spend Usd","description":"Spend in the period (derived from emails sent), USD."},"cost_per_lead_usd":{"type":"number","title":"Cost Per Lead Usd","description":"Spend ÷ hot leads, USD (0 when there are no hot leads yet)."},"daily_budget_usd":{"type":"number","title":"Daily Budget Usd","description":"The campaign's current daily budget allocation, USD/day."},"leads_pool_used":{"type":"integer","title":"Leads Pool Used","description":"Leads already contacted (first cold email sent, lifetime)."},"leads_pool_total":{"type":"integer","title":"Leads Pool Total","description":"Leads with a verified, send-ready email address (lifetime). Verification runs in batches just ahead of sending, so this figure grows with the campaign and usually stays only slightly ahead of `leads_pool_used`. It is NOT the full collected pool: for that, see `collected_leads_total`; leads still awaiting verification are in `leads_pool_pending`."},"leads_pool_pending":{"type":"integer","title":"Leads Pool Pending","description":"Collected leads still waiting for email finding or verification. They join `leads_pool_total` only after their address verifies as sendable."},"collected_leads_total":{"type":"integer","title":"Collected Leads Total","description":"All leads collected for this campaign (lifetime) — the lead count the campaign page shows. Includes verified, pending and unsendable (invalid or not-found address) leads."},"manual_status_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Manual Status Counts","description":"Lifetime manual lead-funnel counts `{status_name: lead_count}` (empty when none set). The `Lost` bucket counts only leads that were hot before the deal died — leads retired by an unsubscribe / GDPR / dead-address reply without ever replying with interest are reported separately as `cold_lost`."},"cold_lost":{"type":"integer","title":"Cold Lost","description":"Contacted leads retired as lost without ever being hot (unsubscribe, GDPR, dead address). Kept out of `manual_status_counts` so funnel sums stay pipeline-only.","default":0}},"type":"object","required":["campaign_id","name","status","period","emails_sent","total_replies","reply_rate_pct","hot_leads","spend_usd","cost_per_lead_usd","daily_budget_usd","leads_pool_used","leads_pool_total","leads_pool_pending","collected_leads_total"],"title":"CampaignAnalyticsResponse","description":"Per-campaign outreach analytics — the same numbers the Explee dashboard\nshows (one shared computation, no drift)."},"CampaignBudgetResponse":{"properties":{"campaign_id":{"type":"integer","title":"Campaign Id","description":"Campaign whose budget was set."},"daily_limit_usd":{"type":"integer","title":"Daily Limit Usd","description":"The campaign's new daily budget (USD/day)."},"project_daily_budget_usd":{"type":"integer","title":"Project Daily Budget Usd","description":"The project total after the edit (sum of the running campaigns)."}},"type":"object","required":["campaign_id","daily_limit_usd","project_daily_budget_usd"],"title":"CampaignBudgetResponse","description":"Result of a per-campaign budget edit."},"CampaignDefinition":{"properties":{"id":{"type":"integer","title":"Id","description":"Campaign identifier.","examples":[17518]},"project_id":{"type":"integer","title":"Project Id","description":"Project this campaign belongs to."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Human-readable campaign name."},"status":{"type":"string","title":"Status","description":"Raw lifecycle status: `discovery`, `review`, `outreach`, `listening`, `error`, `archived`.","examples":["outreach"]},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason","description":"Why a `listening` campaign stopped sending — `user_pause`, `budget_pause`, `lead_pool_exhausted`, …"},"daily_limit_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit Usd","description":"Campaign's daily budget cap in USD."},"target_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Url","description":"Booking link used in the emails. Read-only here — it is gated and shared across the project."},"offer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Offer","description":"What you offer this audience (\"What you offer\" in the app)."},"customer_problem":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Problem","description":"The problem this audience has (\"Customer problem\")."},"target_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Role","description":"Who to reach at the prospect, by responsibility (\"Target role\")."},"target_geography":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Geography","description":"Target geographies, free text (\"Target geography\")."},"target_company_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Company Size","description":"Target company size, free text."},"positive_criteria":{"items":{"type":"string"},"type":"array","title":"Positive Criteria","description":"Signals that qualify a company for this campaign."},"negative_criteria":{"items":{"type":"string"},"type":"array","title":"Negative Criteria","description":"Disqualifying signals — look-alikes that are NOT a fit."},"example_clients":{"items":{"type":"string"},"type":"array","title":"Example Clients","description":"Recognizable companies that fit this ICP."},"keywords":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keywords","description":"Comma-separated search keywords. Read-only: derived by Explee from the fields above."},"instructions":{"type":"string","title":"Instructions","description":"Your brief for the first email. Empty = briefed from the project alone.","default":""},"followup_instructions":{"type":"string","title":"Followup Instructions","description":"The shared brief for every follow-up in the sequence.","default":""},"language":{"type":"string","title":"Language","description":"Language code the emails are written in; `auto` picks per lead.","examples":["auto"]},"reply_instructions":{"type":"string","title":"Reply Instructions","description":"How replies are answered. **Project-level** — shared by every campaign in the project, and read-only here; it is edited in the app.","default":""},"schedule":{"$ref":"#/components/schemas/CampaignSchedule"},"followups":{"$ref":"#/components/schemas/CampaignFollowups","description":"How the follow-up sequence is shaped. A project-level setting: the same for every campaign of the project."},"targeting_editable":{"type":"boolean","title":"Targeting Editable","description":"False for a campaign created from your own imported lead list: its audience is the list you uploaded, so the two SEARCH fields — `target_geography` and `target_company_size` — are locked (a write returns `409`). `target_role`, `positive_criteria` and `negative_criteria` also shape the email copy, so they stay writable (`200`) and simply re-aim nothing. The offer and the email briefs stay editable either way."}},"type":"object","required":["id","project_id","status","language","schedule","followups","targeting_editable"],"title":"CampaignDefinition","description":"Everything that decides who a campaign contacts and what it says —\nthe app's \"Campaign\" tab, over the API."},"CampaignDefinitionUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"Campaign name."},"offer":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Offer","description":"What you offer this audience."},"customer_problem":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Customer Problem","description":"The problem this audience has."},"target_role":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Target Role","description":"Who to reach at the prospect, by responsibility (e.g. \"Head of Compliance\"). **Re-aims the campaign**, exactly like `target_geography`. On a campaign built from an imported lead list (`targeting_editable: false`) it is saved with `200` and re-aims nothing — the uploaded list is the audience, so there is no search to re-run."},"target_geography":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Target Geography","description":"Target geographies, free text (e.g. \"Spain, Portugal\"). **Re-aims the campaign**: changing it drops the leads it has not contacted yet and makes Explee search again against the new targeting."},"target_company_size":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Target Company Size","description":"Target company size, free text (e.g. \"10-200 employees\"). **Re-aims the campaign**, exactly like `target_geography`."},"positive_criteria":{"anyOf":[{"items":{"type":"string","maxLength":200},"type":"array","maxItems":20},{"type":"null"}],"title":"Positive Criteria","description":"Signals that qualify a company for this campaign. **Re-aims the campaign**, exactly like `target_geography`. On a campaign built from an imported lead list (`targeting_editable: false`) it is saved with `200` and re-aims nothing — the uploaded list is the audience, so there is no search to re-run."},"negative_criteria":{"anyOf":[{"items":{"type":"string","maxLength":200},"type":"array","maxItems":20},{"type":"null"}],"title":"Negative Criteria","description":"Disqualifying signals — look-alikes that are NOT a fit. **Re-aims the campaign**, exactly like `target_geography`. On a campaign built from an imported lead list (`targeting_editable: false`) it is saved with `200` and re-aims nothing — the uploaded list is the audience, so there is no search to re-run."},"example_clients":{"anyOf":[{"items":{"type":"string","maxLength":200},"type":"array","maxItems":50},{"type":"null"}],"title":"Example Clients","description":"Recognizable companies that fit this ICP."},"language":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Language","description":"Language to write in: one of `en-US`, `en-GB`, `de`, `fr`, `es`, `it`, `ja`, `pt`, `zh`, `ko`, `nl`, `id`, `tr`, `pl`, `ar`, `vi`, `th`, `ru`, `sv`, `he`, `hi`, `da`, `cs`, `ro`, `fi`, `hu`, `no`, `uk`, `el`, `sr`, `hr`, or `auto` to pick per lead. Note the short form: `de`, not `de-DE`."},"schedule":{"anyOf":[{"$ref":"#/components/schemas/CampaignScheduleUpdate"},{"type":"null"}],"description":"Send days. Only the sub-fields you send are changed."},"followups":{"anyOf":[{"$ref":"#/components/schemas/CampaignFollowupsUpdate"},{"type":"null"}],"description":"Read-only per campaign: the follow-up sequence is a project-level setting. Sending the current values back is accepted; different values are a `422`."}},"additionalProperties":false,"type":"object","title":"CampaignDefinitionUpdate","description":"Fields you may change on a campaign. Send only the ones you are changing —\nan omitted field keeps its value; an empty string or list (or `null`) clears\nit. The one exception is `name`: a campaign always has one, so an empty or\nnull name is a `422`."},"CampaignFollowups":{"properties":{"max_touches":{"type":"integer","title":"Max Touches","description":"Emails in the sequence including the first one: 1 up to the account plan's limit (3 on Standard)."},"delay_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delay Days","description":"Days between touches. `null` = Explee default."}},"type":"object","required":["max_touches"],"title":"CampaignFollowups","description":"How the follow-up sequence is shaped."},"CampaignFollowupsUpdate":{"properties":{"max_touches":{"anyOf":[{"type":"integer","maximum":4.0,"minimum":1.0},{"type":"null"}],"title":"Max Touches","description":"Emails in the sequence including the first one: 1 up to the account plan's limit (3 on Standard) (`1` = no follow-ups). The cap exists to keep sequences out of spam folders."},"delay_days":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Delay Days","description":"Days between touches."}},"additionalProperties":false,"type":"object","title":"CampaignFollowupsUpdate","description":"Send only what you are changing — the other value is kept."},"CampaignImportCreateResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Poll `GET /public/api/v1/autogtm/campaigns/import/{task_id}` for progress and the result."}},"type":"object","required":["task_id"],"title":"CampaignImportCreateResponse","description":"Acknowledgement that the import job was accepted."},"CampaignImportPayload":{"properties":{"project_id":{"type":"integer","title":"Project Id","description":"Project to create the campaign in (see `GET /public/api/v1/autogtm/projects`)."},"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name","description":"Name for the new campaign."},"leads":{"items":{"$ref":"#/components/schemas/ImportLeadIn"},"type":"array","maxItems":30000,"minItems":1,"title":"Leads","description":"Your leads (1–30,000 per import). Each import creates a new campaign."},"instructions":{"type":"string","maxLength":3000,"title":"Instructions","description":"Your brief for the first email: what to pitch, tone, call to action (optional, up to 3,000 characters). Written in plain language — the copy itself is still generated per lead. Omit it and the campaign is briefed from your project description alone, as it is today.","default":""},"followup_instructions":{"type":"string","maxLength":3000,"title":"Followup Instructions","description":"The same, for every follow-up in the sequence (optional). One shared brief covers all follow-ups.","default":""},"language":{"type":"string","maxLength":16,"title":"Language","description":"Language to write in (optional): one of `en-US`, `en-GB`, `de`, `fr`, `es`, `it`, `ja`, `pt`, `zh`, `ko`, `nl`, `id`, `tr`, `pl`, `ar`, `vi`, `th`, `ru`, `sv`, `he`, `hi`, `da`, `cs`, `ro`, `fi`, `hu`, `no`, `uk`, `el`, `sr`, `hr`. Omit it or send `auto` to pick the language per lead. Note the short form: `de`, not `de-DE`.","default":""}},"type":"object","required":["project_id","name","leads"],"title":"CampaignImportPayload","description":"Body for creating a campaign from your own lead list."},"CampaignImportResult":{"properties":{"campaign_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Campaign Id","description":"The new campaign. `null` when no leads survived validation/dedup — no campaign is created."},"project_id":{"type":"integer","title":"Project Id","description":"Project the campaign was created in."},"name":{"type":"string","title":"Name","description":"Campaign name."},"leads_total":{"type":"integer","title":"Leads Total","description":"Leads you submitted."},"leads_imported":{"type":"integer","title":"Leads Imported","description":"Leads inserted into the campaign."},"deduped":{"type":"integer","title":"Deduped","description":"Dropped as duplicates of leads already contacted in this project or on your do-not-contact list."},"enriched_from_base":{"type":"integer","title":"Enriched From Base","description":"Leads enriched from Explee's contact base (via `linkedin_url`/domain match)."},"skipped_missing":{"type":"integer","title":"Skipped Missing","description":"Skipped: missing mandatory fields."},"skipped_invalid_email":{"type":"integer","title":"Skipped Invalid Email","description":"Skipped: email failed the format check."},"flagged_freemail":{"type":"integer","title":"Flagged Freemail","description":"Imported, but with no company data: `company_domain` was a personal mailbox host (gmail.com, aol.com, comcast.net…), which is never a company. Send the company website in `company_domain` to get firmographics — the lead's own email address may stay a personal one.","default":0},"skipped":{"items":{"$ref":"#/components/schemas/ImportSkippedLead"},"type":"array","title":"Skipped","description":"Per-lead skip details (first 200 shown)."}},"type":"object","required":["project_id","name","leads_total","leads_imported","deduped","enriched_from_base","skipped_missing","skipped_invalid_email"],"title":"CampaignImportResult","description":"Outcome of a completed import."},"CampaignImportStatusResponse":{"properties":{"status":{"type":"string","title":"Status","description":"`pending` | `completed` | `failed`."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error description when `failed`."},"progress":{"anyOf":[{"$ref":"#/components/schemas/ImportProgress"},{"type":"null"}],"description":"Live progress while `pending` (may be absent early on)."},"result":{"anyOf":[{"$ref":"#/components/schemas/CampaignImportResult"},{"type":"null"}],"description":"The outcome, when `completed`."}},"type":"object","required":["status"],"title":"CampaignImportStatusResponse","description":"Status/result of an import task."},"CampaignItem":{"properties":{"id":{"type":"integer","title":"Id","description":"Campaign identifier. Use it to scope follow-up calls (inbox, budget, analytics).","examples":[17518]},"project_id":{"type":"integer","title":"Project Id","description":"Project this campaign belongs to.","examples":[4021]},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Human-readable campaign name.","examples":["US mid-market SaaS"]},"target_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Url","description":"Booking link used in the emails — the project's, shared by all its campaigns. Null when unset."},"daily_limit_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit Usd","description":"Campaign's daily budget cap in USD (the per-campaign allocation).","examples":[30]},"status":{"type":"string","title":"Status","description":"Raw lifecycle status: `discovery`, `review`, `outreach`, `listening`, or `error`. Archived campaigns are omitted from this list.","examples":["outreach"]}},"type":"object","required":["id","project_id","status"],"title":"CampaignItem","description":"A single outreach campaign (internally: a segment)."},"CampaignListResponse":{"properties":{"campaigns":{"items":{"$ref":"#/components/schemas/CampaignItem"},"type":"array","title":"Campaigns","description":"Non-archived campaigns owned by the API key's organization."},"total":{"type":"integer","title":"Total","description":"Number of campaigns returned."}},"type":"object","required":["campaigns","total"],"title":"CampaignListResponse","description":"Response for listing an organization's outreach campaigns."},"CampaignSchedule":{"properties":{"days":{"items":{"type":"string"},"type":"array","title":"Days","description":"Weekdays sending is allowed on, in calendar order: `mon`…`sun`. The project's default days unless this campaign has its own.","examples":[["mon","tue","wed","thu","fri"]]},"use_system_schedule":{"type":"boolean","title":"Use System Schedule","description":"True while the days are Explee-managed; any edit of `days` hands ownership to you."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"Timezone the sending window is read in. Read-only."},"working_hours":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Working Hours","description":"Sending window inside a send day, e.g. `09:00-17:00`. Read-only."}},"type":"object","required":["use_system_schedule"],"title":"CampaignSchedule","description":"When the campaign is allowed to send."},"CampaignScheduleUpdate":{"properties":{"days":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Days","description":"Weekdays sending is allowed on — any of `mon`…`sun`, in any order or case. At least one day: a campaign that should send on none is stopped, not emptied. Setting days (or `use_system_schedule`) gives this campaign its own days instead of the project's."},"use_system_schedule":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use System Schedule","description":"A command, not stored state: `true` re-adopts the Explee-managed default days (any `days` sent alongside are ignored), `false` keeps the current days as yours."}},"additionalProperties":false,"type":"object","title":"CampaignScheduleUpdate","description":"The two schedule controls a person has in the app."},"ContactInput":{"properties":{"first_name":{"type":"string","maxLength":100,"minLength":1,"title":"First Name","description":"First name of the person","examples":["Ma"]},"last_name":{"type":"string","maxLength":100,"minLength":1,"title":"Last Name","description":"Last name of the person","examples":["Lin"]},"company_domain":{"type":"string","maxLength":255,"minLength":1,"title":"Company Domain","description":"Company website domain. A full URL is accepted: scheme, www. and path are stripped. A value that cannot be read as a domain is forwarded as typed, not rejected.","examples":["x.ai"]}},"type":"object","required":["first_name","last_name","company_domain"],"title":"ContactInput","description":"Input contact for batch enrichment.","example":{"company_domain":"x.ai","first_name":"Ma","last_name":"Lin"}},"ContactOutput":{"properties":{"first_name":{"type":"string","title":"First Name","description":"First name of the person"},"last_name":{"type":"string","title":"Last Name","description":"Last name of the person"},"company_domain":{"type":"string","title":"Company Domain","description":"Company website domain"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Found email address (null if not found)","examples":["ma@x.ai"]},"email_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Status","description":"Email validation status: valid, catch_all, or catch_all_valid"}},"type":"object","required":["first_name","last_name","company_domain"],"title":"ContactOutput","description":"Output contact from batch enrichment."},"ControlAccepted":{"properties":{"accepted":{"type":"boolean","title":"Accepted","description":"Always `true` on success."}},"type":"object","required":["accepted"],"title":"ControlAccepted","description":"Acknowledgement for start/stop — the state change is applied (or was\nalready in effect: both calls are idempotent)."},"DedupCompaniesListPayload":{"properties":{"domains":{"items":{"type":"string"},"type":"array","maxItems":100000,"minItems":1,"title":"Domains","description":"Domains of companies to exclude (the `domain` field of search results). Normalized and deduplicated on write. Max 100000 per list.","examples":[["acme.com"]]},"name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Name","description":"Optional human-readable label (not unique, not used for matching).","examples":["client-x-portfolio"]}},"type":"object","required":["domains"],"title":"DedupCompaniesListPayload","description":"A companies dedup list, created whole (immutable)."},"DedupListCreateResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"id":{"type":"string","title":"Id","description":"Pass this id in the `exclude_lists` search parameter."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"total":{"type":"integer","title":"Total","description":"Stored values after normalization and deduplication."},"invalid_count":{"type":"integer","title":"Invalid Count","description":"Input values that could not be parsed (not stored).","default":0},"invalid_sample":{"items":{},"type":"array","title":"Invalid Sample","description":"Up to 20 unparseable input values."}},"type":"object","required":["id","total"],"title":"DedupListCreateResponse","description":"Result of creating an immutable dedup list."},"DedupListDeleteResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"id":{"type":"string","title":"Id"},"deleted":{"type":"integer","title":"Deleted","description":"Number of values removed together with the list."}},"type":"object","required":["id","deleted"],"title":"DedupListDeleteResponse","description":"Result of dropping a dedup list."},"DedupListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"total":{"type":"integer","title":"Total"},"items":{"items":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/DedupPersonIdentity"}]},"type":"array","title":"Items","description":"Stored normalized identities. People lists contain identity objects and may contain legacy LinkedIn URL strings; company lists contain domains."},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","total","items","created_at"],"title":"DedupListResponse","description":"One dedup list with its stored values."},"DedupListSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"total":{"type":"integer","title":"Total","description":"Number of stored values."},"created_at":{"type":"string","title":"Created At","description":"ISO 8601."}},"type":"object","required":["id","total","created_at"],"title":"DedupListSummary","description":"One dedup list (metadata only — items are write-only)."},"DedupListsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"lists":{"items":{"$ref":"#/components/schemas/DedupListSummary"},"type":"array","title":"Lists"}},"type":"object","required":["lists"],"title":"DedupListsResponse","description":"All dedup lists of one kind for your organization."},"DedupPeopleListPayload":{"properties":{"people":{"anyOf":[{"items":{"$ref":"#/components/schemas/DedupPersonIdentity"},"type":"array","maxItems":100000},{"type":"null"}],"title":"People","description":"People you already own. You can pass objects returned by people search or find-and-enrich directly. A person is matched by LinkedIn URL, normalized email, or first name + last name + company domain. Invalid identities are skipped and reported. Max 100000 total people and legacy URLs.","examples":[[{"company_domain":"acme.com","email":"jane@acme.com","first_name":"Jane","last_name":"Doe"}]]},"linkedin_urls":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100000},{"type":"null"}],"title":"Linkedin Urls","description":"Legacy shortcut for LinkedIn-only lists. Existing clients can keep sending this field unchanged. Normalized and deduplicated on write. Max 100000 total people and legacy URLs.","examples":[["https://linkedin.com/in/angel-lisinski"]]},"name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Name","description":"Optional human-readable label (not unique, not used for matching).","examples":["bought-2026-06-10"]}},"type":"object","title":"DedupPeopleListPayload","description":"A people dedup list, created whole (immutable)."},"DedupPersonIdentity":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"First Name","description":"First name returned by people search or find-and-enrich."},"last_name":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Last Name","description":"Last name returned by people search or find-and-enrich."},"company_domain":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Company Domain","description":"Company domain returned with the person."},"email":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"Email","description":"Email returned by find-and-enrich."},"linkedin_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Linkedin Url","description":"LinkedIn profile URL, when available."}},"type":"object","title":"DedupPersonIdentity","description":"One already-owned person, using every stable identity the client has."},"EnrichEmailMetadata":{"properties":{"credits_charged":{"type":"number","title":"","description":"Credits charged for this request (0 if email not found).","examples":[1.5]},"remaining_balance":{"type":"number","title":"","description":"Your remaining credit balance after this request.","examples":[950.0]}},"type":"object","required":["credits_charged","remaining_balance"],"title":"EnrichEmailMetadata","description":"Response metadata for email enrichment."},"EnrichEmailPayload":{"properties":{"first_name":{"type":"string","minLength":1,"title":"First Name","description":"First name of the person","examples":["Ma"]},"last_name":{"type":"string","minLength":1,"title":"Last Name","description":"Last name of the person","examples":["Lin"]},"company_domain":{"type":"string","minLength":1,"title":"Company Domain","description":"Company website domain. A full URL is accepted: scheme, www. and path are stripped. A value that cannot be read as a domain is forwarded as typed, not rejected.","examples":["x.ai"]},"preset":{"type":"string","enum":["basic","premium"],"title":"Preset","description":"Quality preset: basic (1 provider, fast) or premium (6 providers, validated)","default":"basic"}},"type":"object","required":["first_name","last_name","company_domain"],"title":"EnrichEmailPayload","description":"Request payload for email enrichment endpoint.","example":{"company_domain":"x.ai","first_name":"Ma","last_name":"Lin","preset":"basic"}},"EnrichEmailResponse":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Found email address (null if not found)","examples":["ma@x.ai"]},"email_status":{"anyOf":[{"type":"string","enum":["valid","catch_all","catch_all_valid"]},{"type":"null"}],"title":"","description":"Email validation status: valid, catch_all, or catch_all_valid"},"meta":{"$ref":"#/components/schemas/EnrichEmailMetadata","title":"","description":"Request metadata including credits charged"}},"type":"object","required":["meta"],"title":"EnrichEmailResponse","description":"Response from email enrichment endpoint."},"EnrichPhoneMetadata":{"properties":{"credits_charged":{"type":"number","title":"","description":"Credits charged for this request (0 if phone not found).","examples":[15.0]},"remaining_balance":{"type":"number","title":"","description":"Your remaining credit balance after this request.","examples":[950.0]}},"type":"object","required":["credits_charged","remaining_balance"],"title":"EnrichPhoneMetadata","description":"Response metadata for phone enrichment."},"EnrichPhonePayload":{"properties":{"linkedin_url":{"type":"string","minLength":1,"title":"Linkedin Url","description":"LinkedIn profile URL of the person — we look up the phone by it.","examples":["https://www.linkedin.com/in/satyanadella/"]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Optional known email — pass it if you have one.","examples":["satya@microsoft.com"]},"preset":{"type":"string","enum":["basic_new","premium"],"title":"Preset","description":"Quality preset: basic_new (faster, lower cost) or premium (broader, higher hit rate)","default":"basic_new"}},"type":"object","required":["linkedin_url"],"title":"EnrichPhonePayload","description":"Request payload for phone enrichment endpoint.","example":{"linkedin_url":"https://www.linkedin.com/in/satyanadella/","preset":"basic_new"}},"EnrichPhoneResponse":{"properties":{"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Found phone number in E.164 format (null if not found)","examples":["+14255551234"]},"meta":{"$ref":"#/components/schemas/EnrichPhoneMetadata","title":"","description":"Request metadata including credits charged"}},"type":"object","required":["meta"],"title":"EnrichPhoneResponse","description":"Response from phone enrichment endpoint."},"ErrorResponse":{"properties":{"detail":{"type":"string","title":"Detail","example":"Error description"}},"type":"object","required":["detail"],"title":"ErrorResponse","description":"Standard error response."},"FeedbackPayload":{"properties":{"message":{"type":"string","maxLength":10000,"minLength":1,"title":"Message","description":"Freeform feedback: a feature request, a problem report, missing data, anything. Up to 10,000 characters."}},"type":"object","required":["message"],"title":"FeedbackPayload"},"FeedbackResponse":{"properties":{"received":{"type":"boolean","title":"Received"}},"type":"object","required":["received"],"title":"FeedbackResponse"},"FindAndEnrichCreateResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Unique job identifier. Poll the GET endpoint with this ID for progress and results.","examples":["550e8400-e29b-41d4-a716-446655440000"]}},"type":"object","required":["task_id"],"title":"FindAndEnrichCreateResponse","description":"Response after submitting a find-and-enrich job."},"FindAndEnrichPayload":{"properties":{"people_filters":{"$ref":"#/components/schemas/PublicPeopleFilters","description":"People filters used to find candidates: job_titles, geo, followers, etc."},"company_filters":{"$ref":"#/components/schemas/PublicCompaniesFilters","description":"Company filters to narrow down which companies to search people from. Use `definition` for semantic company search."},"company_linkedin_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Company Linkedin Ids","description":"Optional list of company LinkedIn IDs to restrict the search to these companies."},"max_contacts":{"type":"integer","maximum":500.0,"minimum":1.0,"title":"Max Contacts","description":"How many enriched contacts (found emails) you want. The search runs as wide as needed to reach this many found emails — you are charged ONLY for emails actually found, never for the search. Capped by your plan export limit.","examples":[500]},"preset":{"type":"string","enum":["basic","premium"],"title":"Preset","description":"Quality preset: basic (1.5 credits per found email) or premium (5 credits per found email).","default":"basic"},"exclude_lists":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100},{"type":"null"}],"title":"Exclude Lists","description":"Ids of your dedup lists (see Deduplication endpoints). Results already present in these lists are excluded and never charged. People endpoints also accept companies lists: every person at a listed domain is excluded. When set, the free results zone does not apply. Max 100 lists / 500000 values combined per request.","examples":[["9f6c1c2e-1f7d-4b1a-9a55-3f1f8a2a4b10"]]},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"Pagination cursor. Omit for the first page; on later pages pass the `next_cursor` returned by the previous completed job (with the SAME filters/preset) to fetch the next batch."}},"type":"object","required":["people_filters","company_filters","max_contacts"],"title":"FindAndEnrichPayload","description":"Request payload for the find-and-enrich endpoint.","example":{"company_filters":{"definition":"B2B SaaS company"},"max_contacts":500,"people_filters":{"geo":["US","GB"],"job_titles":["Head of Sales","VP Sales"]},"preset":"basic"}},"FindAndEnrichProgress":{"properties":{"attempted":{"type":"integer","title":"Attempted","description":"People searched + enrichment-attempted so far."},"found":{"type":"integer","title":"Found","description":"Emails found so far."},"target":{"type":"integer","title":"Target","description":"Requested number of contacts (max_contacts)."},"progress_pct":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress Pct","description":"Approximate completion percentage (0-100).","examples":[42]},"eta_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Eta Seconds","description":"Approximate seconds remaining (rough — enrichment rate varies). Null if not yet estimable.","examples":[45]}},"type":"object","required":["attempted","found","target","progress_pct"],"title":"FindAndEnrichProgress","description":"Approximate progress of a running find-and-enrich job."},"FindAndEnrichResponse":{"properties":{"contacts":{"anyOf":[{"items":{"$ref":"#/components/schemas/FindEnrichContactOutput"},"type":"array"},{"type":"null"}],"title":"Contacts","description":"Enriched contacts (with found emails). Null while pending, array when completed."},"meta":{"$ref":"#/components/schemas/FindAndEnrichResponseMeta","description":"Job status, progress, error, and credits charged."}},"type":"object","required":["meta"],"title":"FindAndEnrichResponse","description":"Status and results for a find-and-enrich job."},"FindAndEnrichResponseMeta":{"properties":{"status":{"type":"string","enum":["pending","completed","failed"],"title":"Status","description":"pending (running — poll again), completed (results ready), failed (see error)."},"progress":{"anyOf":[{"$ref":"#/components/schemas/FindAndEnrichProgress"},{"type":"null"}],"description":"Approximate progress. Updated while pending; 100% when completed."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error description when status is failed. Null otherwise."},"credits_charged":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Charged","description":"Credits charged — only for emails found. Null while pending, populated when completed.","examples":[750.0]},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Pass as `cursor` in the next call to fetch the next page. Null when no more results."},"has_more":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has More","description":"True if more contacts are likely available — call again with `next_cursor`."},"excluded_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Excluded Total","description":"How many candidates were skipped because they matched your `exclude_lists` (across both search and enrichment) — never enriched, never charged. Null when no exclude_lists were passed; populated when completed.","examples":[12]}},"type":"object","required":["status"],"title":"FindAndEnrichResponseMeta","description":"Metadata for a find-and-enrich job."},"FindEnrichContactOutput":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name","description":"First name of the person"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name","description":"Last name of the person"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Job title","examples":["Head of Sales"]},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url","description":"LinkedIn profile URL"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name"},"company_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Domain","description":"Company website domain"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Found email address","examples":["ma@x.ai"]},"email_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Status","description":"Email validation status: valid, catch_all, or catch_all_valid"}},"type":"object","title":"FindEnrichContactOutput","description":"A single enriched contact returned by find-and-enrich (only contacts with a found email are returned)."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HotLeadItem":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Full name."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Email address."},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title","description":"Job title."},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name."},"company_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Domain","description":"Company website domain."},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url","description":"LinkedIn profile URL."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Country (ISO 3166-1 alpha-2, e.g. `GB`)."},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"Phone number."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Team-shared free-text note on this lead, as seen in the Explee inbox. Set it via `POST …/note`."},"note_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Note Updated At","description":"When the note was last edited."},"note_updated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Updated By","description":"Email of the teammate who last edited the note."},"person_id":{"type":"string","title":"Person Id","description":"Lead identifier — use it to fetch the thread and to reply."},"campaign_id":{"type":"integer","title":"Campaign Id","description":"Campaign that contacted this lead. Fetch the full conversation via `GET /autogtm/campaigns/{campaign_id}/inbox/{person_id}` and answer via `…/reply`."},"why_hot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why Hot","description":"The reply that qualified this lead as hot, verbatim."},"became_hot_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Became Hot At","description":"When that qualifying reply was received."}},"type":"object","required":["person_id","campaign_id"],"title":"HotLeadItem","description":"One hot lead: the enriched contact plus why it went hot."},"HotLeadsResponse":{"properties":{"leads":{"items":{"$ref":"#/components/schemas/HotLeadItem"},"type":"array","title":"Leads","description":"Hot leads, most recently qualified first."},"total":{"type":"integer","title":"Total","description":"Total hot leads matching the filter (for pagination)."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists."},"next_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Offset","description":"Offset to pass for the next page; `null` = no more."}},"type":"object","required":["leads","total","has_more"],"title":"HotLeadsResponse","description":"Paged hot-leads feed, newest-hot first."},"ImportLeadIn":{"properties":{"email":{"type":"string","title":"Email","description":"Work email to contact (mandatory; format-checked, verified at send time).","default":""},"first_name":{"type":"string","title":"First Name","description":"First name (mandatory).","default":""},"last_name":{"type":"string","title":"Last Name","description":"Last name (mandatory).","default":""},"company_domain":{"type":"string","title":"Company Domain","description":"Company website domain, e.g. `acme.com` (mandatory). A personal mailbox host (`gmail.com`, `aol.com`, `comcast.net`…) is not a company: such a lead imports on your fields alone, with no company data, and is counted in `flagged_freemail`.","default":""},"job_title":{"type":"string","title":"Job Title","description":"Job title (mandatory).","default":""},"linkedin_url":{"type":"string","title":"Linkedin Url","description":"LinkedIn profile URL (optional, strongly recommended — enrichment key).","default":""},"company_name":{"type":"string","title":"Company Name","description":"Company name (optional; derived from the domain when omitted).","default":""}},"type":"object","title":"ImportLeadIn","description":"One lead in a campaign import.\n\nAll fields are strings; a lead missing any of the mandatory five\n(`email`, `first_name`, `last_name`, `company_domain`, `job_title`) is not\nrejected — it is skipped and reported in the result's `skipped` list, like\nthe in-app CSV import. `linkedin_url` is strongly recommended: it's the key\nused to enrich the lead from Explee's contact base for a richer email."},"ImportProgress":{"properties":{"stage":{"type":"string","title":"Stage","description":"`validating` | `enriching` | `deduplicating` | `creating_campaign` | `saving`."},"done":{"type":"integer","title":"Done","description":"Items processed in the current stage (0 when not applicable).","default":0},"total":{"type":"integer","title":"Total","description":"Items in the current stage (0 when not applicable).","default":0}},"type":"object","required":["stage"],"title":"ImportProgress","description":"Live progress of a pending import."},"ImportSkippedLead":{"properties":{"index":{"type":"integer","title":"Index","description":"0-based index into the `leads` array you submitted."},"reason":{"type":"string","title":"Reason","description":"Why it was skipped, e.g. `missing: job_title` or `invalid email format`."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"The lead email, to help you locate the row."}},"type":"object","required":["index","reason"],"title":"ImportSkippedLead","description":"A lead that was not imported, and why."},"InboxContactItem":{"properties":{"person_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Person Id","description":"Person identifier — use it to fetch the thread and to reply."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"The contact's email address — returned only once they have replied. `null` for contacts who have not replied yet (their address stays hidden, the same as in the app). Use `person_id` as the stable handle."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"The contact's name, when known from their reply."},"latest_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Subject","description":"Subject of the latest outbound email in the thread."},"latest_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Intent","description":"Classifier intent of the latest reply: `hot_lead`, `not_interested`, `out_of_office`, `unsubscribe`, … `null` = no reply yet."},"sent_count":{"type":"integer","title":"Sent Count","description":"Outbound emails sent to this contact.","default":0},"reply_count":{"type":"integer","title":"Reply Count","description":"Human replies received from this contact.","default":0},"latest_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Sent At","description":"When we last emailed this contact."},"latest_reply_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Reply At","description":"When they last replied."}},"type":"object","title":"InboxContactItem","description":"One conversation in the campaign inbox (a contacted person)."},"InboxContactsResponse":{"properties":{"contacts":{"items":{"$ref":"#/components/schemas/InboxContactItem"},"type":"array","title":"Contacts","description":"Conversations, most recent first."},"total":{"type":"integer","title":"Total","description":"Total conversations matching the filter (for pagination)."},"has_more":{"type":"boolean","title":"Has More","description":"Whether another page exists."},"next_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Offset","description":"Offset to pass for the next page; `null` = no more."}},"type":"object","required":["contacts","total","has_more"],"title":"InboxContactsResponse","description":"Paged campaign inbox."},"LeadNoteResponse":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"The note text; `null` when no note is set."},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"When the note was last edited."},"updated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated By","description":"Who last edited it: a teammate email, or `api` for API writes."}},"type":"object","title":"LeadNoteResponse","description":"The lead's team-shared note — the same field the Explee inbox shows."},"LeadProfile":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Full name."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Email address."},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title","description":"Job title."},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name."},"company_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Domain","description":"Company website domain."},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url","description":"LinkedIn profile URL."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Country (ISO 3166-1 alpha-2, e.g. `GB`)."},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"Phone number."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Team-shared free-text note on this lead, as seen in the Explee inbox. Set it via `POST …/note`."},"note_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Note Updated At","description":"When the note was last edited."},"note_updated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note Updated By","description":"Email of the teammate who last edited the note."}},"type":"object","title":"LeadProfile","description":"Enriched lead attributes — who the contact is, ready to map into CRM\nfields. Any field is `null` when our data doesn't have it for this lead."},"ListAgentsResponse":{"properties":{"agents":{"items":{"$ref":"#/components/schemas/AgentInfo"},"type":"array","title":"Agents"}},"type":"object","required":["agents"],"title":"ListAgentsResponse"},"NlToFiltersPayload":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"Natural language query to convert into structured company and people filters.","example":"SaaS companies using Stripe"}},"type":"object","required":["query"],"title":"NlToFiltersPayload","description":"Request payload for NL to filters conversion.","example":{"query":"SaaS companies using Stripe"}},"NlToFiltersResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Always true for successful requests.","default":true,"example":true},"focus":{"type":"string","enum":["companies","people"],"title":"Focus","description":"Suggested focus area inferred from the query.","example":"companies"},"companies_filters":{"$ref":"#/components/schemas/PublicCompaniesFilters","description":"Structured companies filters generated from query."},"people_filters":{"$ref":"#/components/schemas/PublicPeopleFilters","description":"Structured people filters generated from query."}},"type":"object","required":["focus","companies_filters","people_filters"],"title":"NlToFiltersResponse","description":"Successful NL to filters response."},"ProjectAnalyticsResponse":{"properties":{"project_id":{"type":"integer","title":"Project Id","description":"Project identifier."},"period":{"type":"string","title":"Period","description":"The period these numbers cover: `today`, `7d`, `30d` or `all`."},"total_emails_sent":{"type":"integer","title":"Total Emails Sent","description":"Emails sent across all campaigns in the period."},"total_replies":{"type":"integer","title":"Total Replies","description":"Human replies across all campaigns in the period. This now excludes out-of-office and auto-acknowledgement answers, which are reported separately in `total_auto_replies`; on campaigns with heavy auto-responder traffic this number (and the rate below) is lower than it was before that change."},"total_auto_replies":{"type":"integer","title":"Total Auto Replies","description":"Out-of-office / auto-acknowledgement answers in the period, counted apart from replies."},"overall_reply_rate_pct":{"type":"number","title":"Overall Reply Rate Pct","description":"Replies ÷ emails sent across the project, percent."},"total_hot_leads":{"type":"integer","title":"Total Hot Leads","description":"Hot leads across all campaigns in the period."},"total_spend_usd":{"type":"number","title":"Total Spend Usd","description":"Spend across all campaigns in the period, USD."},"campaigns":{"items":{"$ref":"#/components/schemas/ProjectCampaignRollup"},"type":"array","title":"Campaigns","description":"Per-campaign breakdown (non-archived campaigns of the project)."}},"type":"object","required":["project_id","period","total_emails_sent","total_replies","total_auto_replies","overall_reply_rate_pct","total_hot_leads","total_spend_usd","campaigns"],"title":"ProjectAnalyticsResponse","description":"Project-level outreach analytics — the same aggregate + per-campaign\nbreakdown the Explee dashboard shows for a project. Totals and the rollup\nboth cover the requested `period`."},"ProjectBudgetInfo":{"properties":{"project_id":{"type":"integer","title":"Project Id","description":"Project the budget belongs to."},"daily_budget_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Budget Usd","description":"Total daily outreach budget for the whole project (USD/day). `null` = not set yet.","examples":[50]}},"type":"object","required":["project_id"],"title":"ProjectBudgetInfo","description":"The project's daily-budget anchor. Per-campaign allocations are derived\nfrom it automatically and visible as `daily_limit_usd` on each campaign in\nthe campaigns list."},"ProjectCampaignRollup":{"properties":{"campaign_id":{"type":"integer","title":"Campaign Id","description":"Campaign identifier."},"name":{"type":"string","title":"Name","description":"Campaign name."},"status":{"type":"string","title":"Status","description":"Effective campaign status."},"status_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Reason","description":"Reason for the latest status change."},"emails_sent":{"type":"integer","title":"Emails Sent","description":"Emails sent in the period."},"total_replies":{"type":"integer","title":"Total Replies","description":"Human replies in the period."},"reply_rate_pct":{"type":"number","title":"Reply Rate Pct","description":"Replies ÷ emails sent, percent."},"hot_leads":{"type":"integer","title":"Hot Leads","description":"Hot leads in the period."},"spend_usd":{"type":"number","title":"Spend Usd","description":"Spend in the period, USD."},"cost_per_lead_usd":{"type":"number","title":"Cost Per Lead Usd","description":"Spend ÷ hot leads, USD."},"daily_budget_usd":{"type":"number","title":"Daily Budget Usd","description":"The campaign's daily budget, USD/day."},"leads_pool_used":{"type":"integer","title":"Leads Pool Used","description":"Leads already contacted (first cold email sent, lifetime)."},"leads_pool_total":{"type":"integer","title":"Leads Pool Total","description":"Leads with a verified, send-ready email address (lifetime) — grows just ahead of sending; NOT the full collected pool (see `collected_leads_total`)."},"leads_pool_pending":{"type":"integer","title":"Leads Pool Pending","description":"Collected leads still waiting for email finding or verification."},"collected_leads_total":{"type":"integer","title":"Collected Leads Total","description":"All leads collected for this campaign (lifetime) — matches the campaign page."},"manual_status_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Manual Status Counts","description":"Lifetime manual lead-funnel counts. `Lost` is ever-hot only — see `cold_lost`."},"cold_lost":{"type":"integer","title":"Cold Lost","description":"Contacted leads retired as lost without ever being hot (unsubscribe, GDPR, dead address).","default":0}},"type":"object","required":["campaign_id","name","status","emails_sent","total_replies","reply_rate_pct","hot_leads","spend_usd","cost_per_lead_usd","daily_budget_usd","leads_pool_used","leads_pool_total","leads_pool_pending","collected_leads_total"],"title":"ProjectCampaignRollup","description":"One campaign's numbers inside the project analytics rollup — the same\nper-campaign row the dashboard's project table shows."},"ProjectItem":{"properties":{"id":{"type":"integer","title":"Id","description":"Project identifier. Use it to filter the campaigns list (`?project_id=…`).","examples":[4021]},"domain":{"type":"string","title":"Domain","description":"The project's company domain — its identity in the app.","examples":["acme.com"]},"daily_budget_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Budget Usd","description":"Project-wide daily outreach budget anchor (USD/day). `null` = not set.","examples":[50]},"paused_for_review":{"type":"boolean","title":"Paused For Review","description":"Outreach for the whole project is paused for a content review. Campaigns cannot be started until support lifts it (starting one returns 409).","default":false,"examples":[false]}},"type":"object","required":["id","domain"],"title":"ProjectItem","description":"A single outreach project (the workspace campaigns live under)."},"ProjectListResponse":{"properties":{"projects":{"items":{"$ref":"#/components/schemas/ProjectItem"},"type":"array","title":"Projects","description":"Active projects owned by the API key's organization, newest first."},"total":{"type":"integer","title":"Total","description":"Number of projects returned."}},"type":"object","required":["projects","total"],"title":"ProjectListResponse","description":"Response for listing an organization's outreach projects."},"PublicCompaniesFilters":{"properties":{"definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Structured definition of target companies. Describes what the company does using natural language. This is the primary search parameter.","example":"electronic signature platform"},"definition_exclude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Comma-separated keywords to exclude from search results.","example":"consulting, agency"},"min_relevance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Minimum relevance score (0.0-1.0). Higher values return more relevant results.","example":0.5},"geo_include":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Include companies from these countries. Use ISO 3166-1 alpha-2 codes (e.g., US, GB, DE).","example":["US","GB","DE"]},"geo_exclude":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Exclude companies from these countries. Use ISO 3166-1 alpha-2 codes.","example":["CN","RU"]},"geo_include_empty":{"type":"boolean","title":"","description":"Include companies with unknown location.","default":false},"geo_subdivision":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Filter by state/region using ISO 3166-2 codes (e.g., US-CA for California).","example":["US-CA","US-NY","US-TX"]},"geo_city":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Filter by city name. Case-insensitive.","example":["San Francisco","New York","London"]},"geo_subdivision_exclude":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Exclude companies from these states/regions. Use ISO 3166-2 codes.","example":["US-CA"]},"geo_city_exclude":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Exclude companies from these cities.","example":["Los Angeles"]},"geo_founders":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Filter by founders origin countries. Use ISO 3166-1 alpha-2 codes.","example":["US","IN","IL"]},"location_hq":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter by company headquarters location. When both location_hq and location_customer are false or both true, searches across all location fields."},"location_customer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter by customer locations. When both location_hq and location_customer are false or both true, searches across all location fields."},"founded":{"properties":{"min":{"type":"integer","description":"Minimum value (inclusive)"},"max":{"type":"integer","description":"Maximum value (inclusive)"}},"additionalProperties":false,"type":"object","title":"","description":"Filter by year company was founded. Specify min and/or max year.","example":{"max":2023,"min":2015}},"size":{"properties":{"min":{"type":"integer","description":"Minimum value (inclusive)"},"max":{"type":"integer","description":"Maximum value (inclusive)"}},"additionalProperties":false,"type":"object","title":"","description":"Filter by estimated number of employees. Specify min and/or max count.","example":{"max":500,"min":50}},"size_on_linkedin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Use LinkedIn-reported company size instead of estimated size."},"revenue_annual":{"properties":{"min":{"type":"integer","description":"Minimum value (inclusive)"},"max":{"type":"integer","description":"Maximum value (inclusive)"}},"additionalProperties":false,"type":"object","title":"","description":"Filter by estimated annual revenue in USD. Specify min and/or max value.","example":{"max":100000000,"min":1000000}},"is_b2b":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for B2B companies. true = B2B only, false = B2C only."},"is_saas":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for SaaS companies. true = SaaS only."},"is_startup":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for startups. true = startups only (young, VC-backed, fast-growing companies)."},"is_tech":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for technology companies. true = tech companies only."},"is_merchant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for merchants (companies selling physical goods). true = merchants only."},"is_digital":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for digital companies (providing digital services). true = digital only."},"is_ai":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for AI companies. true = AI-related companies only."},"is_alive_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Minimum website liveliness score (0.0-1.0). Filters out parked domains.","example":0.7},"is_alive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter for companies with active websites. true = active websites only."},"geo_employee_distribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Filter by employee geographic distribution. Format: \"COUNTRY_CODE OPERATOR PERCENTAGE\" with AND/OR.","example":"US >= 50%"},"geo_employees_country_count_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Minimum number of countries where company has employees.","example":3},"employees_growth":{"anyOf":[{"items":{"type":"string","enum":["high","growing","stable","declining"]},"type":"array"},{"type":"null"}],"title":"","description":"Filter by YoY employee growth. Values: high (>50%), growing (10-50%), stable (±10%), declining (<-10%). Multiple values use OR.","example":["high","growing"]},"hiring_is":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter by hiring status. true = currently hiring."},"funding_last_round_stage":{"anyOf":[{"items":{"type":"string","enum":["no_funding","pre_seed_seed","series_a","series_b_plus"]},"type":"array"},{"type":"null"}],"title":"","description":"Filter by last funding round stage. Values: no_funding, pre_seed_seed, series_a, series_b_plus. Multiple values use OR.","example":["series_a","series_b_plus"]},"funding_last_round_date":{"anyOf":[{"type":"string","enum":["6_months","1_year","any"]},{"type":"null"}],"title":"","description":"Filter by last funding round date. Values: 6_months, 1_year, any.","example":"1_year"},"technologies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Filter by technologies used. All specified technologies must be present (AND logic).","example":["react","aws","stripe"]},"traffic":{"anyOf":[{"items":{"type":"string","enum":["<1K","1K-10K","10K-100K","100K-1M","1M+","unknown"]},"type":"array"},{"type":"null"}],"title":"","description":"Filter by monthly website traffic range. Multiple values use OR.","example":["100K-1M","1M+"]},"traffic_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Minimum monthly website visitors.","example":10000},"traffic_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Maximum monthly website visitors.","example":1000000},"geo_countries_traffic":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Filter by countries where website has traffic. Use ISO 3166-1 alpha-2 codes.","example":["US","GB"]},"traffic_growth":{"anyOf":[{"items":{"type":"string","enum":["high","growing","stable","declining","unknown"]},"type":"array"},{"type":"null"}],"title":"","description":"Filter by YoY traffic growth. Values: high (>50%), growing (10-50%), stable (±10%), declining (<-10%), unknown. Multiple values use OR.","example":["high","growing"]},"is_b2b_score":{"properties":{"min":{"type":"number","description":"Minimum value (inclusive)"},"max":{"type":"number","description":"Maximum value (inclusive)"}},"additionalProperties":false,"type":"object","title":"","description":"B2B probability score range (0.0-1.0). Higher = more likely B2B.","example":{"max":1.0,"min":0.7}},"size_gm_branches":{"properties":{"min":{"type":"integer","description":"Minimum value (inclusive)"},"max":{"type":"integer","description":"Maximum value (inclusive)"}},"additionalProperties":false,"type":"object","title":"","description":"Filter by number of branches on Google Maps. Specify min and/or max.","example":{"max":100,"min":5}},"size_gm_reviews":{"properties":{"min":{"type":"integer","description":"Minimum value (inclusive)"},"max":{"type":"integer","description":"Maximum value (inclusive)"}},"additionalProperties":false,"type":"object","title":"","description":"Filter by number of reviews on Google Maps. Specify min and/or max.","example":{"max":10000,"min":100}},"employees_by_department":{"properties":{"department":{"type":"string","description":"Department name: administrative, consulting, customer_service, design, education, finance, general_management, hr, legal, marketing, medical, operations, other_department, product, project_management, real_estate, research, sales, technical, trades"},"min":{"type":"integer","description":"Minimum employee count"},"max":{"type":"integer","description":"Maximum employee count"}},"additionalProperties":false,"type":"object","required":["department"],"title":"","description":"Filter by employee count in a specific department.","example":{"department":"sales","max":50,"min":5}},"industry_nace_section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"NACE Rev. 2 section letter (A-U). Filters companies by broad industry sector. Independent from industry_nace_classes; when both are set, combined using OR.","example":"C"},"industry_nace_classes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"List of full NACE class codes with section prefix. Filters by specific industry activities. Independent from industry_nace_section; when both are set, combined using OR.","example":["C29","C25.1"]},"has_public_emails":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter by presence of public contact emails. true = has emails."},"has_company_phone":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter by presence of company phone numbers. true = has phone."},"has_linkedin_page":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter by presence of LinkedIn company page. true = has LinkedIn."},"has_employees_on_linkedin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Filter by presence of employees on LinkedIn. true = has employees listed."},"criteria":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"AI enrichment criteria. Each company will be evaluated and scored 0-5 with reasoning. Additional cost: +0.1 credits per company per criterion.","example":["Has enterprise customers","Uses modern tech stack"]}},"type":"object","title":"PublicCompaniesFilters"},"PublicCompanyResponse":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company website domain","example":"openai.com"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company name","example":"OpenAI"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Short company description","example":"AI research and deployment company"},"description_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Description from website metadata"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company industry (e.g. from LinkedIn)","example":"IT Services and IT Consulting"},"industries_nace":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"","description":"NACE industry classifications: list of {sector, code, description, sector_score, activity_score}","example":[{"code":"J63.1.2","description":"Web portals","sector":"Information and communication"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company website URL","example":"https://openai.com"},"linkedin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"LinkedIn company ID","example":14265142},"domain_is_alive":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Domain availability score (0-1)","example":0.95},"geo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Headquarters country (ISO 2-letter code)","example":"US"},"geo_subdivision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"State/region (ISO 3166-2)","example":"California"},"geo_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"City","example":"San Francisco"},"geo_countries":{"type":"object","title":"dict[string, integer]","description":"Countries where company operates (ISO code -> percentage)","example":{"DE":15,"GB":25,"US":60}},"geo_country_employees":{"type":"object","title":"dict[string, integer]","description":"Employee distribution by country (ISO code -> count)","example":{"CA":55,"GB":56,"IN":100,"US":1080,"total":1555}},"geo_countries_traffic":{"type":"object","title":"dict[string, number]","description":"Website traffic by country (ISO code -> percentage)","example":{"HK":3.13,"IN":6.71,"KR":2.88,"TW":2.83,"US":30.39}},"geo_founders":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Founders origin countries (ISO codes)","example":["US","IN"]},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Number of employees","example":2500},"employees_by_department":{"type":"object","title":"dict[string, integer]","description":"Employee count by department","example":{"employees_count_finance":73,"employees_count_hr":31,"employees_count_sales":7,"employees_count_technical":316}},"founded":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Year company was founded","example":2015},"traffic":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Monthly website visitors","example":25000000},"traffic_growth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Traffic growth rate (decimal)","example":0.12},"traffic_by_country":{"type":"object","title":"dict[string, number]","description":"Website visitors by country (ISO code -> absolute count)","example":{"GB":2100,"IN":3200,"US":15000}},"traffic_by_months":{"type":"object","title":"dict[string, number]","description":"Monthly website traffic history (date -> visitor count)","example":{"2025-01-01":4915.0,"2025-02-01":5341.0,"2025-03-01":4547.0}},"web_metrics_bounce_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Website bounce rate (0-1 decimal)","example":0.41},"web_metrics_pages_per_visit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Average pages per visit","example":3.2},"web_metrics_time_on_site":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Average time on site in seconds","example":185.5},"marketing_pixels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Advertising pixels detected on the website","example":["google_ads","meta","linkedin"]},"revenue_annual":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Annual revenue in USD","example":1000000000},"funding_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Last funding round stage","example":"Series C"},"funding_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Last funding round date"},"funding_last_round_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Last funding round stage (export-compatible field name)","example":"Series C"},"funding_last_round_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Last funding round date (export-compatible field name)"},"funding_last_round_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Last funding round amount in USD","example":50000000},"hiring":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Currently hiring","example":true},"hiring_is":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Currently hiring (export-compatible field name)"},"hiring_by_job_title":{"type":"object","title":"dict[string, integer]","description":"Hiring demand by job title","example":{"engineering":8,"sales":12}},"emails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Company contact emails"},"phones":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Company phone numbers"},"social_discord_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Discord page URLs"},"social_facebook_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Facebook page URLs"},"social_github_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"GitHub page URLs"},"social_instagram_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Instagram page URLs"},"social_pinterest_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Pinterest page URLs"},"social_reddit_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Reddit page URLs"},"social_tiktok_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"TikTok page URLs"},"social_x_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"X (Twitter) profile URLs"},"social_youtube_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"YouTube channel URLs"},"web_forms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Web form URLs found on the company website"},"social_links_other":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Other social / contact links (WhatsApp, Telegram, Google Maps, VK, etc.)"},"legal_entity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Legal entity name"},"legal_entity_legal_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Legal form (e.g. GmbH, LLC, S.A.)"},"legal_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Legal entity registration ID"},"legal_entity_id_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Type of registration ID (e.g. company_number)"},"legal_entity_vat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"VAT number"},"legal_entity_tax_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Tax ID"},"legal_entity_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Country of legal entity registration"},"criteria":{"type":"object","title":"dict[string, CriteriaScore]","description":"AI enrichment scores. Format: {\"criterion\": {\"score\": 0-5, \"reasoning\": \"explanation\"}}","example":{"Has enterprise customers":{"reasoning":"Works with Fortune 500 companies","score":4},"Uses modern tech stack":{"reasoning":"Website mentions React, AWS","score":5}}},"match":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Match level based on criteria scores: 1=no match, 2=weak match, 3=strong match","example":3}},"type":"object","title":"PublicCompanyResponse","description":"Company data returned by Public API."},"PublicPeopleFilters":{"properties":{"job_titles":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Job titles to search for. Supports abbreviations (e.g., \"CTO\" expands to \"Chief Technology Officer\"). Multiple titles use OR.","example":["Head of Sales","VP Sales","Chief Revenue Officer"]},"min_relevance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Minimum relevance score (0.0-1.0). Higher values return more relevant job title matches.","example":0.5},"job_titles_exclude":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Comma-separated job title keywords to exclude from results.","example":"intern, assistant, junior"},"geo":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Filter people by their location. Use ISO 3166-1 alpha-2 country codes.","example":["US","GB","DE"]},"followers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"","description":"LinkedIn follower count range for the person. Provide `min`, `max`, or both.","example":{"max":50000,"min":1000}},"people_per_company_limit":{"type":"integer","title":"","description":"Maximum number of people to return per company. Default: 2.","default":2,"example":5},"criteria":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"AI enrichment criteria for people. Each person will be evaluated and scored 0-5 with reasoning. Additional cost: +0.1 credits per person per criterion.","example":["Has lead generation experience","Worked at Fortune 500"]}},"type":"object","title":"PublicPeopleFilters"},"PublicPersonResponse":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"First name","example":"John"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Last name","example":"Smith"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Job title","example":"Head of Sales"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"LinkedIn headline","example":"Sales Leader | B2B SaaS"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"LinkedIn profile URL","example":"https://linkedin.com/in/johnsmith"},"geo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Person location (ISO 2-letter code)","example":"US"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"LinkedIn summary"},"geo_origin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Country of origin"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Time in current position"},"follower_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"LinkedIn follower count","example":1234},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company name","example":"Acme Inc"},"company_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company website domain","example":"acme.com"},"company_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company website URL","example":"https://acme.com"},"company_linkedin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"LinkedIn company ID","example":12345678},"company_linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"LinkedIn company URL"},"company_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company size range","example":"51-200"},"company_geo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company headquarters (ISO 2-letter code)","example":"US"},"company_geo_subdivision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company state/region"},"company_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company city","example":"San Francisco"},"company_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company description"},"company_industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company industry (e.g. from LinkedIn)","example":"IT Services and IT Consulting"},"company_industries_nace":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"","description":"Company NACE industry classifications: list of {sector, code, description, sector_score, activity_score}","example":[{"code":"J63.1.2","description":"Web portals","sector":"Information and communication"}]},"company_founded":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Year company was founded","example":2015},"company_traffic":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Monthly website visitors","example":25000000},"company_traffic_growth":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Traffic growth rate YoY (decimal)","example":0.12},"company_web_metrics_bounce_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Website bounce rate (0-1 decimal)","example":0.41},"company_web_metrics_pages_per_visit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Average pages per visit","example":3.2},"company_web_metrics_time_on_site":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"","description":"Average time on site in seconds","example":185.5},"company_marketing_pixels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Advertising pixels detected on the website","example":["google_ads","meta","linkedin"]},"company_revenue_annual":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Annual company revenue in USD","example":100000000},"company_hiring_is":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"","description":"Company is actively hiring"},"company_funding_last_round_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Last funding round stage"},"company_funding_last_round_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Last funding round date"},"company_funding_last_round_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Last funding round amount in USD"},"company_emails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Company contact emails"},"company_geo_country_employees":{"type":"object","title":"dict[string, integer]","description":"Employee distribution by country (ISO code -> count)","example":{"GB":56,"IN":100,"US":1080,"total":1555}},"company_geo_founders":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Founders origin countries (ISO codes)","example":["US","IN"]},"company_geo_countries":{"type":"object","title":"dict[string, integer]","description":"Countries where company operates (ISO code -> percentage)","example":{"DE":15,"GB":25,"US":60}},"company_geo_countries_traffic":{"type":"object","title":"dict[string, number]","description":"Website traffic by country (ISO code -> percentage)","example":{"HK":3.13,"IN":6.71,"US":30.39}},"company_employees_by_department":{"type":"object","title":"dict[string, integer]","description":"Employee count by department","example":{"employees_count_sales":7,"employees_count_technical":316}},"company_social_discord_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Discord page URLs"},"company_social_facebook":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Facebook page URLs"},"company_social_facebook_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Facebook page URLs (export-compatible field name)"},"company_social_github_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"GitHub page URLs"},"company_social_instagram_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Instagram page URLs"},"company_social_pinterest_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Pinterest page URLs"},"company_social_reddit_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Reddit page URLs"},"company_social_tiktok_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"TikTok page URLs"},"company_social_x":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"X (Twitter) profile URLs"},"company_social_x_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"X (Twitter) profile URLs (export-compatible field name)"},"company_social_youtube_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"YouTube channel URLs"},"company_web_forms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Web form URLs found on the company website"},"company_social_links_other":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"","description":"Other company social / contact links (WhatsApp, Telegram, Google Maps, VK, etc.)"},"company_legal_entity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company legal entity name"},"company_legal_entity_legal_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company legal form (e.g. GmbH, LLC, S.A.)"},"company_legal_entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company legal entity registration ID"},"company_legal_entity_id_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company legal entity ID type (e.g. company_number)"},"company_legal_entity_vat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company VAT number"},"company_legal_entity_tax_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Company tax ID"},"company_legal_entity_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"","description":"Country of company legal entity registration"},"criteria":{"type":"object","title":"dict[string, CriteriaScore]","description":"AI enrichment scores. Format: {\"criterion\": {\"score\": 0-5, \"reasoning\": \"explanation\"}}","example":{"Has lead gen experience":{"reasoning":"Profile mentions 5+ years in lead generation","score":4}}},"match":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"Match level based on criteria scores: 1=no match, 2=weak match, 3=strong match","example":3}},"type":"object","title":"PublicPersonResponse","description":"Person data returned by Public API."},"SearchCompaniesByDomainsPayload":{"properties":{"domains":{"items":{"type":"string","maxLength":256},"type":"array","maxItems":1000,"minItems":1,"title":"Domains","description":"List of company domains (max 1000). Each domain will be normalized.","example":["bmw.com","mercedes-benz.com","audi.com"]},"exclude_lists":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100},{"type":"null"}],"title":"Exclude Lists","description":"Ids of your dedup lists (see Deduplication endpoints). Results already present in these lists are excluded and never charged. People endpoints also accept companies lists: every person at a listed domain is excluded. When set, the free results zone does not apply. Max 100 lists / 500000 values combined per request.","examples":[["9f6c1c2e-1f7d-4b1a-9a55-3f1f8a2a4b10"]]}},"type":"object","required":["domains"],"title":"SearchCompaniesByDomainsPayload","description":"Request payload for companies search by domains (bulk).","example":{"domains":["bmw.com","mercedes-benz.com","audi.com"]}},"SearchCompaniesByDomainsResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Always true for successful requests.","default":true,"example":true},"companies":{"items":{"$ref":"#/components/schemas/PublicCompanyResponse"},"type":"array","title":"Companies","description":"List of companies found by domains (at most one per domain). Empty if no domains matched."},"meta":{"$ref":"#/components/schemas/SearchMetadata","description":"Metadata with billing info and result counts."}},"type":"object","required":["companies","meta"],"title":"SearchCompaniesByDomainsResponse","description":"Response for companies search by domains (bulk)."},"SearchCompaniesPayload":{"properties":{"filters":{"$ref":"#/components/schemas/PublicCompaniesFilters","description":"Search filters. Only `definition` is required. Use `criteria` for AI enrichment (+0.1 credits per company per criterion).","example":{"criteria":["Has enterprise customers","Uses modern tech stack"],"definition":"electronic signature platform"}},"page":{"type":"integer","minimum":1.0,"title":"Page","description":"Page number, starting from 1.","default":1,"example":1},"page_size":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Page Size","description":"Number of companies per page. Default: 100, max: 1000.","default":100,"example":100},"exclude_lists":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100},{"type":"null"}],"title":"Exclude Lists","description":"Ids of your dedup lists (see Deduplication endpoints). Results already present in these lists are excluded and never charged. People endpoints also accept companies lists: every person at a listed domain is excluded. When set, the free results zone does not apply. Max 100 lists / 500000 values combined per request.","examples":[["9f6c1c2e-1f7d-4b1a-9a55-3f1f8a2a4b10"]]}},"type":"object","required":["filters"],"title":"SearchCompaniesPayload","description":"Request payload for company search.","example":{"filters":{"criteria":["Has enterprise customers","Uses modern tech stack"],"definition":"electronic signature platform"},"page":1,"page_size":10}},"SearchCompaniesResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Always true for successful requests.","default":true,"example":true},"companies":{"items":{"$ref":"#/components/schemas/PublicCompanyResponse"},"type":"array","title":"Companies","description":"List of companies matching the search criteria."},"meta":{"$ref":"#/components/schemas/SearchMetadata","description":"Totals and billing information."}},"type":"object","required":["companies","meta"],"title":"SearchCompaniesResponse","description":"Successful search response with companies and metadata."},"SearchMetadata":{"properties":{"total":{"type":"integer","title":"","description":"Total number of results matching your filters (cached, may be slightly stale). Not affected by `exclude_lists` — this is the pool size before deduplication.","example":12500},"results_count":{"type":"integer","title":"","description":"Number of results returned in this response.","example":100},"credits_charged":{"type":"number","title":"","description":"Credits charged for this request (0.5 per company returned).","example":50.0},"remaining_balance":{"type":"number","title":"","description":"Your remaining credit balance after this request.","example":950.0},"excluded_total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"","description":"How many already-owned results were excluded by your `exclude_lists` while building this response (the scanned slice of the pool, like \"previous exports hidden\" on the website). Only present in dedup mode.","example":37}},"type":"object","required":["total","results_count","credits_charged","remaining_balance"],"title":"SearchMetadata","description":"Response metadata with totals and billing info."},"SearchPeopleByDomainsPayload":{"properties":{"domains":{"items":{"type":"string","maxLength":256},"type":"array","maxItems":1000,"minItems":1,"title":"Domains","description":"List of company domains (max 1000). Each domain will be normalized.","example":["bmw.com","mercedes-benz.com","audi.com"]},"job_titles":{"items":{"type":"string","maxLength":256},"type":"array","maxItems":20,"minItems":1,"title":"Job Titles","description":"Job titles to search for (max 20, OR logic). Supports semantic matching.","example":["Head of Sales","VP Marketing"]},"people_per_company":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"People Per Company","description":"Number of people to return per company (1-1000). Default: 1.","default":1,"example":3},"exclude_lists":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100},{"type":"null"}],"title":"Exclude Lists","description":"Ids of your dedup lists (see Deduplication endpoints). Results already present in these lists are excluded and never charged. People endpoints also accept companies lists: every person at a listed domain is excluded. When set, the free results zone does not apply. Max 100 lists / 500000 values combined per request.","examples":[["9f6c1c2e-1f7d-4b1a-9a55-3f1f8a2a4b10"]]}},"type":"object","required":["domains","job_titles"],"title":"SearchPeopleByDomainsPayload","description":"Request payload for people search by domains (batch mode).","example":{"domains":["bmw.com","mercedes-benz.com","audi.com"],"job_titles":["Head of Sales","VP Marketing"],"people_per_company":3}},"SearchPeopleByDomainsResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Always true for successful requests.","default":true,"example":true},"people":{"items":{"$ref":"#/components/schemas/PublicPersonResponse"},"type":"array","title":"People","description":"List of people matching the search criteria. Returns up to people_per_company people per found company. Empty if no domains found or no matching people."},"meta":{"$ref":"#/components/schemas/SearchMetadata","description":"Metadata with billing info and result counts."}},"type":"object","required":["people","meta"],"title":"SearchPeopleByDomainsResponse","description":"Response for people search by domains (batch mode)."},"SearchPeoplePayload":{"properties":{"people_filters":{"$ref":"#/components/schemas/PublicPeopleFilters","description":"People filters: job_titles, geo, criteria for AI enrichment (+0.1 credits per person per criterion).","example":{"criteria":["Has lead gen experience"],"geo":["US","GB"],"job_titles":["Head of Sales","VP Sales"]}},"company_filters":{"$ref":"#/components/schemas/PublicCompaniesFilters","description":"Company filters to narrow down which companies to search people from. Use `definition` for semantic company search.","example":{"definition":"B2B SaaS company"}},"company_linkedin_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"items":{"type":"integer","format":"int64","title":"int"},"type":"array","title":"int","description":"Optional list of company LinkedIn IDs to restrict the search to these companies.","example":[123456,789012]},"page":{"type":"integer","minimum":1.0,"title":"Page","description":"Page number, starting from 1.","default":1,"example":1},"page_size":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Page Size","description":"Number of people per page. Default: 100, max: 1000.","default":100,"example":100},"exclude_lists":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":100},{"type":"null"}],"title":"Exclude Lists","description":"Ids of your dedup lists (see Deduplication endpoints). Results already present in these lists are excluded and never charged. People endpoints also accept companies lists: every person at a listed domain is excluded. When set, the free results zone does not apply. Max 100 lists / 500000 values combined per request.","examples":[["9f6c1c2e-1f7d-4b1a-9a55-3f1f8a2a4b10"]]}},"type":"object","required":["people_filters","company_filters"],"title":"SearchPeoplePayload","description":"Request payload for people search.","example":{"company_filters":{"definition":"B2B SaaS company"},"company_linkedin_ids":[],"page":1,"page_size":10,"people_filters":{"criteria":["Has lead gen experience"],"geo":["US","GB"],"job_titles":["Head of Sales","VP Sales"]}}},"SearchPeopleResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Always true for successful requests.","default":true,"example":true},"people":{"items":{"$ref":"#/components/schemas/PublicPersonResponse"},"type":"array","title":"People","description":"List of people matching the search criteria."},"meta":{"$ref":"#/components/schemas/SearchMetadata","description":"Totals and billing information."}},"type":"object","required":["people","meta"],"title":"SearchPeopleResponse","description":"Successful search response with people and metadata."},"SendReplyBody":{"properties":{"body_text":{"type":"string","maxLength":10000,"minLength":1,"title":"Body Text","description":"Plain-text reply body."},"cc_emails":{"anyOf":[{"items":{"type":"string","format":"email"},"type":"array","maxItems":20},{"type":"null"}],"title":"Cc Emails","description":"Extra addresses to Cc on this reply only (up to 20). Each must be a deliverable address — a malformed one or a domain that cannot receive mail is refused with `422`."},"attachment_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":10},{"type":"null"}],"title":"Attachment Ids","description":"Files to attach (up to 10): ids returned by `POST /autogtm/campaigns/{campaign_id}/attachments`. Total size must fit the sending mailbox — 7 MB on some providers, 18 MB otherwise (`413`)."},"reply_all":{"type":"boolean","title":"Reply All","description":"Keep the people the lead had on Cc of their latest message (like «Reply all»). `false` drops them. The campaign's `reply_cc_emails` are added either way.","default":true}},"type":"object","required":["body_text"],"title":"SendReplyBody","description":"Body for replying to a contact — just the message text.\n\nYou reply to the *lead*, not to an email address: the server resolves the\nrecipient, the subject (`Re: …`), and the threading from the contact's real\nconversation, so a reply can only ever go back to the person who wrote to\nyou — never to an arbitrary address. Replies are allowed only to contacts\nwho have replied and aren't `unsubscribe`. Cc is yours to set per reply."},"SendReplyResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Whether the reply was accepted for sending."},"sent_email_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sent Email Id","description":"Identifier of the queued outbound email."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"`queued` — it sends within seconds to minutes."},"deduped":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Deduped","description":"`true` when an identical send was already in flight."}},"type":"object","required":["ok"],"title":"SendReplyResponse","description":"Result of enqueueing a reply."},"SetAutopilotBody":{"properties":{"autopilot_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Autopilot Enabled","description":"Turn the autopilot agent on/off."},"auto_reply_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Reply Enabled","description":"Turn AI auto-reply on/off."},"auto_reply_delay_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":0.0},{"type":"null"}],"title":"Auto Reply Delay Minutes","description":"Auto-reply send delay in minutes (0 = instant, max 1440)."},"reply_cc_emails":{"anyOf":[{"items":{"type":"string","format":"email"},"type":"array","maxItems":20},{"type":"null"}],"title":"Reply Cc Emails","description":"Project defaults added to CC on every manual or automatic reply."}},"type":"object","title":"SetAutopilotBody","description":"Body for updating autopilot / auto-reply settings. All fields optional —\nsend only what you want to change; at least one is required."},"SetCampaignBudgetBody":{"properties":{"daily_limit_usd":{"type":"integer","maximum":300.0,"minimum":1.0,"title":"Daily Limit Usd","description":"This campaign's daily budget (USD/day), 1–300. The project's total daily budget follows as the sum of its running campaigns — the other campaigns are not touched. Editable only while Auto-manage campaigns is OFF and the campaign is running.","examples":[30]}},"type":"object","required":["daily_limit_usd"],"title":"SetCampaignBudgetBody","description":"Body for setting one campaign's daily budget."},"SetLeadNoteBody":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Note text (≤10 000 chars). Pass `null` or an empty string to clear the note."}},"type":"object","title":"SetLeadNoteBody","description":"Body for setting the lead note. `null` (or empty/whitespace) clears it."},"SetProjectBudgetBody":{"properties":{"daily_budget_usd":{"type":"integer","maximum":1000000.0,"minimum":0.0,"title":"Daily Budget Usd","description":"New total daily budget (USD/day). `0` explicitly pauses all sending while keeping campaigns configured. The change is spread across active campaigns proportionally.","examples":[50]}},"type":"object","required":["daily_budget_usd"],"title":"SetProjectBudgetBody","description":"Body for setting the project budget cap."},"StartAgentRunByIdPayload":{"properties":{"input_data":{"type":"object","title":"Input Data","example":{"domain":"stripe.com"}}},"type":"object","required":["input_data"],"title":"StartAgentRunByIdPayload"},"StartAgentRunPayload":{"properties":{"system_prompt":{"type":"string","title":"System Prompt","example":"Find the CEO, founders, and directors of the company by domain."},"input_schema":{"type":"object","title":"Input Schema","example":{"properties":{"domain":{"type":"string"}},"required":["domain"],"type":"object"}},"output_schema":{"type":"object","title":"Output Schema","example":{"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"}},"input_data":{"type":"object","title":"Input Data","example":{"domain":"stripe.com"}}},"type":"object","required":["system_prompt","input_schema","output_schema","input_data"],"title":"StartAgentRunPayload"},"StartAgentRunResponse":{"properties":{"run_id":{"type":"string","title":"Run Id"}},"type":"object","required":["run_id"],"title":"StartAgentRunResponse"},"SuppressCompaniesBody":{"properties":{"domains":{"items":{"type":"string"},"type":"array","maxItems":10000,"minItems":1,"title":"Domains","description":"Company domains to suppress (1–10,000 per request — send a bigger ledger as several lists).","examples":[["acme.com","globex.io"]]},"list":{"type":"string","maxLength":255,"minLength":1,"pattern":"^[^/]+$","title":"List","description":"Name for this list, exactly like a CSV filename in the app. A name already in use gets a `(2)` suffix — the previous list stays until you delete it. No slashes: the name is a path segment on the read and delete endpoints.","default":"API","examples":["crm-customers"]}},"type":"object","required":["domains"],"title":"SuppressCompaniesBody","description":"Add company domains to a named suppress list."},"SuppressCompaniesEntriesResponse":{"properties":{"list":{"type":"string","title":"List"},"total":{"type":"integer","title":"Total","description":"Domains in the list."},"showing":{"type":"integer","title":"Showing","description":"Domains in this page."},"domains":{"items":{"type":"string"},"type":"array","title":"Domains"}},"type":"object","required":["list","total","showing","domains"],"title":"SuppressCompaniesEntriesResponse","description":"One companies list, paginated."},"SuppressDeleteResponse":{"properties":{"list":{"type":"string","title":"List"},"deleted":{"type":"integer","title":"Deleted","description":"Entries removed."}},"type":"object","required":["list","deleted"],"title":"SuppressDeleteResponse","description":"Outcome of deleting a whole list."},"SuppressListSummary":{"properties":{"list":{"type":"string","title":"List","description":"List name (a CSV filename, or yours)."},"count":{"type":"integer","title":"Count","description":"Entries in the list."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the list was first written to."}},"type":"object","required":["list","count","created_at"],"title":"SuppressListSummary","description":"One list on the suppress page."},"SuppressListsResponse":{"properties":{"lists":{"items":{"$ref":"#/components/schemas/SuppressListSummary"},"type":"array","title":"Lists"}},"type":"object","required":["lists"],"title":"SuppressListsResponse","description":"All suppress lists of the organization, newest first."},"SuppressPeopleBody":{"properties":{"people":{"items":{"$ref":"#/components/schemas/SuppressPersonItem"},"type":"array","maxItems":10000,"minItems":1,"title":"People","description":"People to suppress (1–10,000 per request — send a bigger ledger as several lists)."},"list":{"type":"string","maxLength":255,"minLength":1,"pattern":"^[^/]+$","title":"List","description":"Name for this list, exactly like a CSV filename in the app. A name already in use gets a `(2)` suffix — the previous list stays until you delete it. No slashes: the name is a path segment on the read and delete endpoints.","default":"API","examples":["crm-sync"]}},"type":"object","required":["people"],"title":"SuppressPeopleBody","description":"Add people to a named suppress list."},"SuppressPeopleEntriesResponse":{"properties":{"list":{"type":"string","title":"List"},"total":{"type":"integer","title":"Total","description":"Entries in the list."},"showing":{"type":"integer","title":"Showing","description":"Entries in this page."},"entries":{"items":{"$ref":"#/components/schemas/SuppressPersonItem"},"type":"array","title":"Entries"}},"type":"object","required":["list","total","showing","entries"],"title":"SuppressPeopleEntriesResponse","description":"One people list, paginated."},"SuppressPersonItem":{"properties":{"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email","examples":["jane@acme.com"]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name","examples":["Jane"]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name","examples":["Doe"]},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url","examples":["https://linkedin.com/in/janedoe"]},"company_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Domain","examples":["acme.com"]}},"type":"object","title":"SuppressPersonItem","description":"One person on the suppress list — the same fields the CSV upload accepts.\n\n``email`` is a plain string, not a validated address, on purpose: a single\nmalformed cell in a 10 000-row CRM sync must not 422 the whole ledger and\nleave NOBODY suppressed. An unusable address is dropped and counted in\n``skipped``, exactly as the CSV upload treats a bad cell.\n\nOutreach stops on `email`. The name and `linkedin_url` fields are stored but\nnot actively used today; they are there because the identity of a suppressed\nperson is not only their email — the moment outreach runs somewhere other\nthan email (LinkedIn and the like), those are the fields that will match."},"SuppressWriteResponse":{"properties":{"list":{"type":"string","title":"List","description":"The list your entries landed in — your name, or it with a `(2)` suffix if it was taken."},"added":{"type":"integer","title":"Added","description":"Entries stored."},"skipped":{"type":"integer","title":"Skipped","description":"Entries we could not use: people without any identifier, and values that are not a domain. Entries you already suppress are NOT skipped — lists are independent, so delete the older list if you no longer want it."}},"type":"object","required":["list","added","skipped"],"title":"SuppressWriteResponse","description":"Outcome of a write to the suppress list."},"TaskItem":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Unique identifier for this task","examples":["550e8400-e29b-41d4-a716-446655440000"]},"status":{"type":"string","enum":["pending","completed","failed"],"title":"Status","description":"Current status: pending (processing), completed (results ready), failed (error occurred)"},"result_url":{"type":"string","title":"Result Url","description":"Full URL to fetch task results","examples":["https://api.explee.com/public/api/v1/enrich/email/batch/550e8400-e29b-41d4-a716-446655440000"]},"credits_charged":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Charged","description":"Credits charged for this task. Null while pending."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the task was created"}},"type":"object","required":["task_id","status","result_url","created_at"],"title":"TaskItem","description":"Single task in list response."},"TaskListResponse":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/TaskItem"},"type":"array","title":"Tasks","description":"List of tasks"},"total":{"type":"integer","title":"Total","description":"Total number of tasks matching the filter (for pagination)"}},"type":"object","required":["tasks","total"],"title":"TaskListResponse","description":"Response for listing tasks."},"ThreadAttachment":{"properties":{"id":{"type":"string","title":"Id","description":"Attachment identifier — download via `GET …/inbox/{person_id}/attachments/{id}`."},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename","description":"File name as sent."},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","description":"MIME type, e.g. `application/pdf`."},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes","description":"File size in bytes."},"is_inline":{"type":"boolean","title":"Is Inline","description":"`true` for an image embedded in the body (e.g. a signature logo).","default":false},"stored":{"type":"boolean","title":"Stored","description":"`false` when we received the file but could not store it (failed or too large) — it is not retrievable.","default":true}},"type":"object","required":["id"],"title":"ThreadAttachment","description":"A file attached to a thread message."},"ThreadMessage":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Message identifier. For our outbound messages it equals `sent_email_id` from `/reply`."},"type":{"type":"string","title":"Type","description":"`sent` (our outbound) or `reply` (their inbound)."},"from_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Email","description":"Sender address."},"to_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Email","description":"Recipient address."},"cc":{"items":{"type":"string"},"type":"array","title":"Cc","description":"Cc addresses of this message; empty when none."},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject","description":"Email subject."},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text","description":"Plain-text body (quoted history stripped)."},"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id","description":"RFC Message-ID. To thread your reply, pass the inbound message's id as `in_reply_to`."},"in_reply_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"In Reply To","description":"Message-ID this message replied to."},"references":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"References","description":"RFC References chain, when available."},"intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intent","description":"Classifier intent (inbound messages only)."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Delivery status (outbound messages only)."},"ts":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ts","description":"Sent/received timestamp."},"attachments":{"items":{"$ref":"#/components/schemas/ThreadAttachment"},"type":"array","title":"Attachments","description":"Files attached to this message; empty when none."}},"type":"object","required":["type"],"title":"ThreadMessage","description":"One message in a conversation thread."},"ThreadResponse":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/ThreadMessage"},"type":"array","title":"Messages","description":"Messages in chronological order."},"can_reply":{"type":"boolean","title":"Can Reply","description":"Whether a reply is allowed (compliance gate)."},"reply_blocked_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Blocked Reason","description":"Why replying is blocked: `unsubscribe`, or `no_reply` (they never replied)."},"latest_intent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Latest Intent","description":"Classifier intent of the latest reply."},"lead":{"anyOf":[{"$ref":"#/components/schemas/LeadProfile"},{"type":"null"}],"description":"The contact's enriched profile (name, title, company, LinkedIn, …); `null` when unknown."}},"type":"object","required":["messages","can_reply"],"title":"ThreadResponse","description":"A full conversation with one contact."},"UploadedAttachmentResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Pass it in `attachment_ids` of `…/reply`."},"filename":{"type":"string","title":"Filename","description":"File name as uploaded."},"content_type":{"type":"string","title":"Content Type","description":"MIME type."},"size_bytes":{"type":"integer","title":"Size Bytes","description":"File size in bytes."}},"type":"object","required":["id","filename","content_type","size_bytes"],"title":"UploadedAttachmentResponse","description":"A file ready to attach to a reply."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Get your API key at [API Keys](https://explee.com/app-auto-gtm/api-keys)"}}},"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Outreach","description":"Manage your Explee outreach campaigns programmatically with the same `X-API-Key`: list campaigns, read and answer the inbox, set the project budget, start/stop campaigns, and pull per-campaign analytics — everything you need to build your own autopilot on top."},{"name":"Search"},{"name":"Contact"},{"name":"Agents"},{"name":"Tasks"},{"name":"Billing","description":"Check how many credits your organization has left, so your agent can see when it is running low. Credits are priced at 1 credit = $0.01; add more on your billing page at https://explee.com/app-auto-gtm/billing."},{"name":"Feedback","description":"Send us freeform feedback — feature requests, problem reports, missing data, anything. It goes straight to the team; we read everything. Free of charge."},{"name":"Deduplication"}]}