{"openapi":"3.0.3","info":{"title":"Sillage Partner API","version":"1.0.0","description":"Partner-facing API for programmatic workspace lifecycle, signal delivery, and usage reporting.\nAll routes require a master key (`mk_live_...`) issued per partner. Provide it in the Authorization header as a Bearer token.\n\nFor the full signal item shape, refer to the Sillage direct-client API documentation. https://api.getsillage.com/api/v2/workspace/docs"},"servers":[{"url":"/api"}],"tags":[{"name":"Workspaces","description":"Create, read, update, archive, and delete partner workspaces."},{"name":"Persona","description":"Define the ICP persona used to filter leads for a workspace."},{"name":"Top Account List","description":"Submit and monitor the list of target accounts to enrich for a workspace."},{"name":"Health","description":"Liveness and authentication checks."},{"name":"Usage","description":"Track the credits consumed across your workspaces."},{"name":"V2 Partner Setup","description":"Create, read, update, and delete agents, signals, and signal runs for a partner workspace."},{"name":"V2 Contents","description":"Read signal content items for a partner workspace."},{"name":"V2 Content Requests","description":"Read content requests for a partner workspace."},{"name":"V2 Top Accounts","description":"Read the top accounts list for a partner workspace."},{"name":"V2 Companies","description":"Read a company's enrichment data for a partner workspace."},{"name":"Lists","description":"Create and manage reusable lists of companies or people for a partner workspace."},{"name":"Watchlists","description":"Deprecated, use Lists instead. Same resource, the older `title` / `entity_count` vocabulary."}],"components":{"securitySchemes":{"MasterKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"mk_live_<key>","description":"Master API key issued per partner. Prefix: `mk_live_`."}},"parameters":{"PartnerWorkspaceId":{"name":"partner_workspace_id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Opaque workspace identifier used on the partner's side."},"Page":{"name":"page","in":"query","description":"Page number (starts at 1). Defaults to 1.","schema":{"type":"integer","minimum":1,"default":1}},"PageSize":{"name":"pageSize","in":"query","description":"Number of items per page. Defaults to 25. Maximum: 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}},"responses":{"Unauthorized":{"description":"Missing or invalid master key.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"Forbidden":{"description":"The master key is not authorized to access this resource.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"PartnerQuotaExceeded":{"description":"The master key is not authorized to access this resource, or this workspace's top-account quota would be exceeded by the request. When the cause is the quota, `type` is `https://docs.getsillage.com/errors/top-account-quota-exceeded`: none of the submitted accounts are added, the whole request is rejected rather than only the accounts over the limit.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"},"example":{"type":"https://docs.getsillage.com/errors/top-account-quota-exceeded","title":"Top account quota exceeded","status":403,"detail":"Adding 10 account(s) would exceed the top-account quota (15/20 used)."}}}},"NotFound":{"description":"No workspace found for this `partner_workspace_id`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"Conflict":{"description":"The request cannot be applied in the workspace's current state.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"UnprocessableEntity":{"description":"Invalid request body or route parameters.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"TooManyRequests":{"description":"Rate limit exceeded.","headers":{"X-RateLimit-Limit":{"description":"Maximum number of requests allowed in the window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Number of requests remaining in the current window.","schema":{"type":"integer"}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"InternalServerError":{"description":"An unexpected error occurred on the server.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"PaymentRequired":{"description":"Workspace is not on the partner_managed plan.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"schemas":{"V2PartnerCreditsByStatus":{"type":"object","description":"Credits grouped by billing lifecycle status. Keys: `held` (reserved for an action still in progress, not billable yet), `invoiceable` (completed, will appear on your next invoice), `invoice_edited` (an invoice covering these credits has been issued), `invoice_paid` (that invoice has been paid), `released` (the action did not complete; never billed). A key is only present when the period contains credits in that status.","additionalProperties":{"type":"number"}},"V2PartnerUsageResponse":{"type":"object","required":["workspaces","credits_by_status"],"properties":{"workspaces":{"type":"array","description":"One entry per workspace with consumption in the requested period.","items":{"type":"object","required":["id","credits_by_status","by_product"],"properties":{"id":{"type":"integer","description":"ID of the workspace. This ID is specific to your environment."},"credits_by_status":{"allOf":[{"$ref":"#/components/schemas/V2PartnerCreditsByStatus"}],"description":"Credits for this workspace in the period, grouped by lifecycle status."},"by_product":{"type":"array","description":"Consumption breakdown by product for this workspace.","items":{"type":"object","required":["product","credits_by_status"],"properties":{"product":{"type":"string","description":"Product the credits were spent on. `champion_enrichment` is a legacy product that is no longer charged; it only appears on usage recorded before it was removed.","enum":["account_mapping_launch","content_profile","champion_enrichment","keyword_signal","competitor_signal","account_monitoring","discovery_essential","discovery_standard","discovery_advanced"]},"credits_by_status":{"$ref":"#/components/schemas/V2PartnerCreditsByStatus"}}}}}}},"credits_by_status":{"allOf":[{"$ref":"#/components/schemas/V2PartnerCreditsByStatus"}],"description":"Credits across every workspace in the period, grouped by lifecycle status."}}},"WatchlistItem":{"type":"object","required":["id","kind","type","title"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the watchlist. This ID is specific to your environment."},"kind":{"type":"string","enum":["company","profile"],"description":"Derived from `type` (read-only)."},"type":{"type":"string","enum":["competitor","partner","customer","influencer","champion"],"description":"Immutable list type. competitor/partner/customer → a company list; influencer/champion → a profile list."},"title":{"type":"string"},"description":{"type":"string","nullable":true,"description":"Omitted in the `concise` response format."},"entity_count":{"type":"integer","description":"Member count. Omitted in `concise`."},"bound_agent_count":{"type":"integer","description":"Number of agents bound to this list. Omitted in `concise`."}}},"WatchlistEntity":{"type":"object","required":["id"],"description":"A member, a company (with `name`) or a person (with `first_name`/`last_name`).","properties":{"id":{"type":"integer","description":"Numeric id of the canonical company or profile."},"name":{"type":"string","nullable":true,"description":"Company members only."},"first_name":{"type":"string","nullable":true,"description":"Profile members only."},"last_name":{"type":"string","nullable":true,"description":"Profile members only."},"linkedin_handle":{"type":"string","nullable":true},"linkedin_url":{"type":"string","nullable":true}}},"ListItem":{"type":"object","required":["id","kind","type","name"],"description":"A reusable list of companies or people. Replaces `WatchlistItem`, `name` is what that schema calls `title` and `member_count` what it calls `entity_count`.","properties":{"id":{"type":"integer","description":"Numeric identifier of the list. This ID is specific to your environment."},"kind":{"type":"string","enum":["company","profile"],"description":"Derived from `type` (read-only)."},"type":{"type":"string","enum":["competitor","partner","customer","prospect","influencer","champion"],"description":"Immutable list type. competitor/partner/customer/prospect → a list of companies; influencer/champion → a list of people."},"name":{"type":"string","description":"Name of the list."},"description":{"type":"string","nullable":true,"description":"Omitted in the `concise` response format."},"member_count":{"type":"integer","description":"How many companies or people are on the list. Omitted in `concise`."},"bound_agent_count":{"type":"integer","description":"Number of agents reading this list. Omitted in `concise`."},"tier":{"type":"integer","nullable":true,"description":"Tier of the list, for customer and prospect lists only. Null on every other type. Omitted in `concise`."},"default_tracking_status":{"type":"string","enum":["followed","unfollowed"],"description":"What happens to a member of this list by default. An unfollowed account is not scraped for new signals and does not consume credits. Each member can override it. Omitted in `concise`."},"default_signal_bucket":{"type":"string","enum":["bucket_1","bucket_2","bucket_3"],"description":"Default signal bucket of the list, overridable per member. Recorded and returned only, it changes no behaviour today. Omitted in `concise`."},"persona_ids":{"type":"array","items":{"type":"integer"},"description":"The personas this list belongs to. An empty array means the list applies to every persona. Omitted in `concise`."},"is_deletable":{"type":"boolean","description":"Whether deleting or archiving this list would succeed right now. Omitted in `concise`."},"not_deletable_reason":{"type":"string","enum":["last_list_of_tier","in_use","employee_list"],"nullable":true,"description":"Why the list cannot be deleted or archived, or null when it can: `last_list_of_tier` (it is the only list left for its tier, so create another list of that tier first), `in_use` (an agent reads it), or `employee_list` (your own employee list can never be deleted). Omitted in `concise`."}}},"ListMember":{"type":"object","required":["id"],"description":"A member, a company (with `name`) or a person (with `first_name`/`last_name`).","properties":{"id":{"type":"integer","description":"Numeric id of the canonical company or profile."},"name":{"type":"string","nullable":true,"description":"Company members only."},"first_name":{"type":"string","nullable":true,"description":"People members only."},"last_name":{"type":"string","nullable":true,"description":"People members only."},"linkedin_handle":{"type":"string","nullable":true},"linkedin_url":{"type":"string","nullable":true},"tracking_status":{"type":"string","enum":["followed","unfollowed"],"nullable":true,"description":"This member's own tracking status. Null means it follows the list's `default_tracking_status`."},"signal_bucket":{"type":"string","enum":["bucket_1","bucket_2","bucket_3"],"nullable":true,"description":"This member's own signal bucket. Null means it follows the list's `default_signal_bucket`."}}},"WatchlistEntityAddError":{"type":"object","required":["input","code","message"],"description":"A per-entity failure returned when an entity could not be added.","properties":{"input":{"type":"object","description":"The entity input that failed.","properties":{"linkedin_url":{"type":"string"},"linkedin_handle":{"type":"string"},"domain":{"type":"string"}}},"code":{"type":"string","enum":["multiple_domain_matches","apollo_failed","resolution_failed","wrong_entity_type","invalid_identifier"],"description":"`multiple_domain_matches`, the domain matched more than one company; `apollo_failed`, the company could not be resolved from its domain; `resolution_failed`, an unexpected error occurred during resolution; `wrong_entity_type`, the member is a company on a list of people or a person on a list of companies; `invalid_identifier`, the value is not a usable LinkedIn URL, handle or domain (for example a domain with no extension such as \".com\")."},"message":{"type":"string","description":"Human-readable failure detail."}}},"ProblemDetails":{"type":"object","description":"RFC 9457 error body. Returned with Content-Type: application/problem+json on every error response.","required":["type","title","status"],"properties":{"type":{"type":"string","format":"uri","description":"A URI that identifies the problem type. `about:blank` when the type is unspecified (e.g. 500).","example":"https://docs.getsillage.com/errors/invalid-query"},"title":{"type":"string","description":"A short, human-readable summary of the problem type. Stable across occurrences.","example":"Invalid query parameters"},"status":{"type":"integer","description":"The HTTP status code.","example":400},"detail":{"type":"string","description":"A human-readable explanation specific to this occurrence.","example":"page_size must be a positive integer"},"instance":{"type":"string","description":"The request path that produced this error.","example":"/api/v1/provider/acme/workspaces/ws_123"},"errors":{"type":"object","description":"Field-level validation errors. Present only on 400/422 validation failures.","additionalProperties":{"type":"array","items":{"type":"string"}},"example":{"partner_workspace_id":["must not be empty"]}}}},"PersonaLaunch":{"type":"object","description":"One persona this call considered.","required":["persona_id","request_id","status","credits"],"properties":{"persona_id":{"type":"integer","description":"Numeric id of the persona."},"request_id":{"type":"integer","nullable":true,"description":"Numeric id of this persona's own enrichment content request. Null when the persona was skipped."},"status":{"type":"string","enum":["launched","already_requested","skipped_no_location","skipped_no_job_titles"],"description":"`launched` — a new request was created (and charged, unless it is a relaunch). `already_requested` — already enriched today for this company, at no extra cost. `skipped_no_location` / `skipped_no_job_titles` — this persona is missing a location or job titles."},"credits":{"type":"integer","description":"Credits charged for this persona by this call — 1 when `launched` by a regular enrichment, 0 otherwise, including every relaunch."},"relaunch_method":{"type":"string","enum":["quick_search","full_mapping"],"description":"Only present on a relaunch. `quick_search`: the account's people were looked up directly. `full_mapping`: a complete new mapping was started."}}},"PersonaLaunchProblemDetails":{"description":"The enrich-company-mapping endpoint's 422 error body: the standard problem details, plus a per-persona breakdown.","allOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"type":"object","required":["launches"],"properties":{"launches":{"type":"array","description":"One entry per persona this call considered.","items":{"$ref":"#/components/schemas/PersonaLaunch"}}}}]},"EnrichPersonaIds":{"type":"array","nullable":true,"minItems":1,"items":{"type":"integer"},"description":"Specific personas to enrich. Omit to enrich the personas linked to the lists this company belongs to (every active persona when none of those lists names one, or when the company is on no list). An id that is not one of the workspace’s active personas returns a 422.","example":[501,502]},"EnrichRelaunch":{"type":"boolean","description":"Set to `true` to run the mapping again for an account you already monitor, at no credit cost. Requires a single persona: pass one id in `persona_ids`, or omit it when your workspace has only one persona. Returns `409` when the account is not monitored for that persona.","example":true},"PaginationMeta":{"type":"object","required":["page","page_size","page_count","total"],"properties":{"page":{"type":"integer","description":"Current page number.","example":1},"page_size":{"type":"integer","description":"Items per page.","example":25},"page_count":{"type":"integer","description":"Total number of pages.","example":4},"total":{"type":"integer","description":"Total number of items.","example":100}}},"ValidationError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message."},"details":{"type":"object","properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}},"description":"Field-level validation errors keyed by field name."}}}}},"CreateWorkspaceBody":{"type":"object","required":["end_customer_email","name","partner_workspace_id"],"properties":{"partner_workspace_id":{"type":"string","minLength":1,"description":"Stable, opaque identifier for this workspace on the partner's side. Used in all subsequent requests."},"end_customer_email":{"type":"string","format":"email","description":"Email address of the end customer who owns this workspace."},"name":{"type":"string","minLength":1,"description":"Display name for the workspace."},"domain":{"type":"string","description":"Primary domain of the end customer (e.g. `acme.com`). No protocol, path, or spaces.","example":"acme.com"}}},"UpdateWorkspaceBody":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"New display name for the workspace."}}},"PersonaBody":{"type":"object","required":["job_title","location"],"description":"ICP persona filters used to narrow the pool of leads monitored in this workspace. Every field except `job_title` and `location` is optional; omitting an optional field leaves it unchanged.","properties":{"job_title":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Required. Target job titles — at least one value (e.g. `[\"VP Sales\", \"Head of Growth\"]`)."},"exclude_job_title":{"type":"array","items":{"type":"string"},"description":"Job titles to exclude."},"location":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Required. Target locations — at least one value. Use country or region names (e.g. \"EMEA\"); a city-only list saves but will not match any country, so account mapping will not run for it."},"headcount":{"type":"array","items":{"type":"string","enum":["1-10","11-50","51-200","201-500","501-1,000","1,001-5,000","5,001-10,000","10,001+"]},"description":"Allowed values from Sillage's standard headcount ranges. Target company headcount ranges (e.g. `[\"51-200\", \"201-500\"]`)."},"industry":{"type":"array","items":{"type":"string"},"description":"Target industries."},"seniority":{"type":"array","items":{"type":"string","enum":["owner","founder","c_suite","partner","vp","head","director","manager","senior","entry","intern"]},"description":"Seniority levels (from highest to lowest). Target seniority levels (e.g. `[\"director\", \"vp\", \"c_suite\"]`)."},"additional_info":{"type":"string","description":"Free-text additional instructions or context for the persona."}}},"TopAccountListBody":{"type":"object","required":["accounts"],"properties":{"accounts":{"type":"array","maxItems":10000,"description":"List of target accounts to ingest. Each item must supply at least one of `linkedin_url` or `domain`.","items":{"type":"object","description":"At least one of `linkedin_url` or `domain` is required per item.","anyOf":[{"required":["linkedin_url"]},{"required":["domain"]}],"properties":{"linkedin_url":{"type":"string","format":"uri","description":"LinkedIn company page URL."},"domain":{"type":"string","minLength":1,"description":"Company domain (e.g. `acme.com`)."},"tier":{"type":"string","enum":["Tier 1","Tier 2","Tier 3"],"description":"Optional tier to set on this account (replace/add only). Left unset, the account is imported without a tier. Stamps `tier_source: manual`, so a later CRM sync can still overwrite it."}}}}}},"Workspace":{"type":"object","required":["id","name","domain","is_archived"],"properties":{"id":{"type":"integer","description":"Numeric identifier for the workspace. This ID is specific to your environment."},"name":{"type":"string","description":"Display name of the workspace."},"domain":{"type":"string","nullable":true,"description":"Primary domain of the end customer, or null if not set."},"is_archived":{"type":"boolean","description":"Whether this workspace has been archived."}}},"CreateWorkspaceResponse":{"type":"object","required":["data"],"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/Workspace"},{"type":"object","required":["partner_workspace_id"],"properties":{"partner_workspace_id":{"type":"string","description":"The partner-side workspace ID echoed back for confirmation."}}}]}}},"WorkspaceResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Workspace"}}},"WorkspaceListResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Workspace"},{"type":"object","required":["partner_workspace_id"],"properties":{"partner_workspace_id":{"type":"string","description":"Partner-side workspace ID."}}}]}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}},"PersonaResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"Numeric identifier of the upserted persona. This ID is specific to your environment."}}}}},"Persona":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"ID of the persona, as returned by `GET .../personas`. This ID is specific to your environment."},"job_title":{"type":"array","items":{"type":"string"},"nullable":true},"exclude_job_title":{"type":"array","items":{"type":"string"},"nullable":true},"location":{"type":"array","items":{"type":"string"},"nullable":true},"headcount":{"type":"array","items":{"type":"string"},"nullable":true},"industry":{"type":"array","items":{"type":"string"},"nullable":true},"seniority":{"type":"array","items":{"type":"string"},"nullable":true},"additional_info":{"type":"string","nullable":true},"tag":{"type":"string","nullable":true,"description":"Short free-form label you can set to recognise this persona in your own systems. Never used for targeting, and unique across the personas of a workspace."}}},"PersonaPatchBody":{"type":"object","description":"Every field is optional, but at least one must be provided.","properties":{"job_title":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Target job titles — at least one value, if sent."},"exclude_job_title":{"type":"array","items":{"type":"string"},"description":"Job titles to exclude."},"location":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Target locations — at least one value, if sent."},"headcount":{"type":"array","items":{"type":"string","enum":["1-10","11-50","51-200","201-500","501-1,000","1,001-5,000","5,001-10,000","10,001+"]},"description":"Target company headcount ranges."},"industry":{"type":"array","items":{"type":"string"},"description":"Target industries."},"seniority":{"type":"array","items":{"type":"string","enum":["owner","founder","c_suite","partner","vp","head","director","manager","senior","entry","intern"]},"description":"Target seniority levels."},"additional_info":{"type":"string","description":"Free-text additional instructions or context for the persona."},"tag":{"type":"string","maxLength":255,"description":"Short free-form label you can set to recognise this persona in your own systems. Two personas of the same workspace cannot share a tag — reusing one returns 409."}}},"PersonaWriteResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"ID of the persona. This ID is specific to your environment."}}},"warnings":{"type":"array","items":{"type":"string"},"description":"Advisory warnings about the submitted persona, e.g. a missing job_title/location. Omitted when there is nothing to report. Never blocks the write."}}},"MatchStatus":{"type":"string","enum":["found","not_found"],"description":"Whether a matching record was found (`found`) or not (`not_found`)."},"EnrichedAccountCompany":{"type":"object","required":["status"],"description":"Resolved company data after enrichment.","properties":{"name":{"type":"string","description":"Company name."},"domain":{"type":"string","description":"Primary company domain."},"linkedin_url":{"type":"string","description":"LinkedIn company page URL."},"linkedin_handle":{"type":"string","description":"LinkedIn company handle (slug)."},"logo_url":{"type":"string","description":"URL of the company logo."},"status":{"$ref":"#/components/schemas/MatchStatus","description":"Whether a company record was resolved."}}},"EnrichedAccount":{"type":"object","required":["company","tier","imported_at"],"description":"Resolved and enriched representation of a Top Account after ingestion.","properties":{"company_id":{"type":"string","description":"The company's ID in Sillage."},"company":{"$ref":"#/components/schemas/EnrichedAccountCompany"},"tier":{"type":"string","enum":["Tier 1","Tier 2","Tier 3"],"nullable":true,"description":"The account tier. `null` when no tier has been set."},"imported_at":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when this account was imported."}}},"TopAccountItem":{"type":"object","description":"At least one of `linkedin_url` or `domain` must be provided.","properties":{"linkedin_url":{"type":"string","format":"uri","description":"LinkedIn company page URL."},"domain":{"type":"string","description":"Company domain (e.g. `acme.com`)."},"tier":{"type":"string","enum":["Tier 1","Tier 2","Tier 3"],"description":"Tier submitted for this account, echoed back as-is."}}},"TopAccountListReplaceResponse":{"type":"object","required":["tal_id","accounts","message"],"description":"Confirmation that the accounts were accepted for ingestion. The submitted accounts list is echoed back in `accounts`.","properties":{"tal_id":{"type":"string","description":"Unique identifier of the top account list record."},"accounts":{"type":"array","items":{"$ref":"#/components/schemas/TopAccountItem"},"description":"Echo of the accounts submitted in the request body."},"message":{"type":"string","description":"Human-readable confirmation message."}}},"TopAccountListContentResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["accounts"],"properties":{"accounts":{"type":"array","description":"Enriched account objects stored in the top account list.","items":{"$ref":"#/components/schemas/EnrichedAccount"}}}}}},"TopAccountListStatusResponse":{"type":"object","required":["state","total_accounts"],"properties":{"state":{"type":"string","enum":["queued","processing","completed","failed"],"description":"Current state of the ingestion. `queued` means no ingestion has run yet or one is waiting."},"total_accounts":{"type":"integer","minimum":0,"description":"Number of accounts currently stored in the top account list."}}},"TopAccountListPaginatedResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","description":"Enriched account objects for the requested page.","items":{"$ref":"#/components/schemas/EnrichedAccount"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}},"TopAccountListCountResponse":{"type":"object","required":["total"],"properties":{"total":{"type":"integer","minimum":0,"description":"Number of found accounts currently stored in the top account list."}}},"RemoveAccountsResponse":{"type":"object","required":["deleted_count","message"],"description":"Result of a batch account removal.","properties":{"deleted_count":{"type":"integer","description":"Number of accounts removed from the top account list."},"message":{"type":"string","description":"Human-readable confirmation message."}}},"NotFoundAccountsPaginatedResponse":{"type":"object","required":["data","meta"],"description":"Paginated list of accounts that could not be resolved.","properties":{"data":{"type":"array","items":{"type":"object","required":["company","user_input","imported_at"],"properties":{"id":{"type":"string","description":"Workspace company document id, if created."},"company":{"type":"object","required":["status"],"properties":{"name":{"type":"string"},"domain":{"type":"string"},"linkedin_url":{"type":"string"},"linkedin_handle":{"type":"string"},"logo_url":{"type":"string"},"status":{"type":"string","enum":["not_found"],"description":"Always `not_found` for this endpoint."}}},"user_input":{"type":"object","description":"The original values submitted when this account was added.","properties":{"company_name":{"type":"string"},"domain":{"type":"string"},"linkedin_url":{"type":"string"},"custom_properties":{"type":"object","additionalProperties":true}}},"imported_at":{"type":"string","format":"date-time","description":"When this account was imported."}}}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}},"AgentSetup":{"type":"object","required":["id","name","type","enabled","parameters","watchlist_kind","watchlist_id","schedulable","schedule"],"properties":{"id":{"type":"integer","description":"Identifier of the agent."},"name":{"type":"string"},"type":{"type":"string","enum":["keyword_detection","keyword_post_search","job_posting_keyword_detection","job_update","job_posting","competitor_activity","content_engagement","influencer_engagement","champion_tracking","competitor","partner","customer","influencer","champion"],"description":"The agent type. Interaction agents return their semantic type (competitor, partner, customer, influencer, champion) — never the internal company_interaction/profile_interaction label. `competitor_activity` is a detection label only — it appears on individual signals, never as an agent's own type: it is not returned by this endpoint and cannot be passed when creating an agent. `content_engagement` is different: it remains a valid agent type for existing content-engagement agents, but it can also appear as a detection label on a `competitor` agent's signals — in that case the agent's own type stays `competitor`."},"enabled":{"type":"boolean","description":"Whether the agent is currently active."},"watchlist_kind":{"type":"string","enum":["company","profile"],"nullable":true,"description":"Kind of the bound watchlist, or null when unbound (paired with watchlist_id)."},"watchlist_id":{"type":"integer","nullable":true,"description":"The bound watchlist id, or null when the agent is unbound."},"schedulable":{"type":"boolean","description":"Whether this agent has a billed branch that can run on a schedule at all. `false` for every non-billed agent type and for a competitor agent whose `mode` is `account_monitoring` — the `schedule` field is then read-only null, and any write to it returns 422."},"schedule":{"type":"object","nullable":true,"required":["cadence"],"properties":{"cadence":{"type":"string","enum":["weekly"]}},"description":"The agent's weekly schedule, or null. Non-null only while `schedulable` is true and the schedule is currently active — `schedulable: true` with `schedule: null` means it can be scheduled but is not right now."},"parameters":{"oneOf":[{"title":"keyword_detection","type":"object","properties":{"tracking_keywords":{"type":"array","items":{"type":"string"}},"start_date":{"type":"string","description":"ISO 8601 date, scrape only posts published after this date."}}},{"title":"keyword_post_search","type":"object","properties":{"tracking_keywords":{"type":"array","items":{"type":"string"}},"start_date":{"type":"string","description":"ISO 8601 date, scrape only posts published after this date."}}},{"title":"job_posting_keyword_detection","type":"object","properties":{"tracking_keywords":{"type":"array","items":{"type":"string"},"description":"Keywords matched against the job title and description of the postings your target accounts publish."}}},{"title":"job_update","type":"object","properties":{"job_titles":{"type":"array","items":{"type":"string"}},"seniority_levels":{"type":"array","items":{"type":"string"}},"company_domains_to_scrape":{"type":"array","items":{"type":"string"}},"target_persona":{"type":"array","items":{"type":"string"}},"target_persona_locations":{"type":"array","items":{"type":"string"}},"interested_by":{"type":"object","properties":{"prospects":{"type":"boolean"},"customers":{"type":"boolean"}}},"keywords_for_social_detection":{"type":"array","items":{"type":"string"}},"author_roles":{"type":"array","items":{"type":"string"}},"author_industries":{"type":"array","items":{"type":"string"}},"target_linkedin_profiles":{"type":"array","items":{"type":"string"}}}},{"title":"job_posting","type":"object","properties":{"job_titles":{"type":"array","items":{"type":"string"}},"search_strings":{"type":"array","items":{"type":"string"}},"job_locations":{"type":"array","items":{"type":"string"}},"published_at":{"type":"string"},"target_top_accounts_only":{"type":"boolean"}}},{"title":"competitor_activity","type":"object","properties":{"company_domains_to_scrape":{"type":"array","items":{"type":"string"}},"target_persona":{"type":"array","items":{"type":"string"}},"target_persona_locations":{"type":"array","items":{"type":"string"}},"interested_by":{"type":"object","properties":{"prospects":{"type":"boolean"},"customers":{"type":"boolean"}}},"keywords_for_social_detection":{"type":"array","items":{"type":"string"}},"author_roles":{"type":"array","items":{"type":"string"}},"author_industries":{"type":"array","items":{"type":"string"}},"target_linkedin_profiles":{"type":"array","items":{"type":"string"}}}},{"title":"content_engagement","type":"object","properties":{"company_domains_to_scrape":{"type":"array","items":{"type":"string"}},"target_persona":{"type":"array","items":{"type":"string"}},"target_persona_locations":{"type":"array","items":{"type":"string"}},"interested_by":{"type":"object","properties":{"prospects":{"type":"boolean"},"customers":{"type":"boolean"}}},"keywords_for_social_detection":{"type":"array","items":{"type":"string"}},"author_roles":{"type":"array","items":{"type":"string"}},"author_industries":{"type":"array","items":{"type":"string"}},"target_linkedin_profiles":{"type":"array","items":{"type":"string"}}}},{"title":"influencer_engagement","type":"object","properties":{"influencer_keywords":{"type":"array","items":{"type":"string"}},"company_domains_to_scrape":{"type":"array","items":{"type":"string"}},"target_persona":{"type":"array","items":{"type":"string"}},"target_persona_locations":{"type":"array","items":{"type":"string"}},"interested_by":{"type":"object","properties":{"prospects":{"type":"boolean"},"customers":{"type":"boolean"}}},"keywords_for_social_detection":{"type":"array","items":{"type":"string"}},"author_roles":{"type":"array","items":{"type":"string"}},"author_industries":{"type":"array","items":{"type":"string"}},"target_linkedin_profiles":{"type":"array","items":{"type":"string"}}}},{"title":"champion_tracking","type":"object","properties":{"company_domains_to_scrape":{"type":"array","items":{"type":"string"}},"target_persona":{"type":"array","items":{"type":"string"}},"target_persona_locations":{"type":"array","items":{"type":"string"}},"interested_by":{"type":"object","properties":{"prospects":{"type":"boolean"},"customers":{"type":"boolean"}}},"keywords_for_social_detection":{"type":"array","items":{"type":"string"}},"author_roles":{"type":"array","items":{"type":"string"}},"author_industries":{"type":"array","items":{"type":"string"}},"target_linkedin_profiles":{"type":"array","items":{"type":"string"}}}},{"title":"competitor","type":"object","description":"Competitor watchlist agent. Optional `mode` selects what it does: `lead_discovery` watches the competitor's team on LinkedIn from both directions — the people they comment on or react to, wherever those people work, and the people who comment on or react to the competitor team's own posts; `account_monitoring` (the default when absent) only detects interactions between the competitor and your own top accounts, in both directions, with no scraping; `all` does both. Optional `target_group` narrows who counts as a lead when `lead_discovery` or `all` is active: `prospects`, `customers`, or `all` (the default when absent) for both.","properties":{"mode":{"type":"string","enum":["lead_discovery","account_monitoring","all"],"description":"What this competitor agent does. Defaults to `account_monitoring` when omitted."},"target_group":{"type":"string","enum":["prospects","customers","all"],"description":"Who counts as a lead: your `prospects`, your `customers`, or `all` of them. Defaults to `all` when omitted."}}},{"title":"partner","type":"object","description":"Partner watchlist agent — no keyword parameters."},{"title":"customer","type":"object","description":"Customer watchlist agent — no keyword parameters."},{"title":"influencer","type":"object","description":"Influencer watchlist agent — no keyword parameters."},{"title":"champion","type":"object","description":"Champion watchlist agent — no keyword parameters."}]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"V2PaginationMeta":{"type":"object","required":["page","page_size","page_count","total"],"properties":{"page":{"type":"integer","description":"Current page number"},"page_size":{"type":"integer","description":"Number of items per page"},"page_count":{"type":"integer","description":"Total number of pages"},"total":{"type":"integer","description":"Total number of matching items"}}},"V2Company":{"type":"object","nullable":true,"required":["id"],"properties":{"id":{"type":"integer","description":"Numeric id of the company. Environment-specific, prod only, not portable across environments."},"name":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"linkedin_url":{"type":"string","nullable":true}}},"V2CompanyDetail":{"type":"object","description":"Enrichment data for a company. All fields are nullable — a company that has not been enriched yet is returned with null enrichment fields.","properties":{"name":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"url":{"type":"string","nullable":true,"description":"The company's website."},"linkedin_url":{"type":"string","nullable":true},"linkedin_handle":{"type":"string","nullable":true,"description":"LinkedIn company handle (slug)."},"logo_url":{"type":"string","nullable":true},"location":{"type":"string","nullable":true},"locations":{"type":"array","description":"The company's known locations, HQ first. `is_hq` marks the headquarters; every other entry is a secondary location.","items":{"type":"object","properties":{"is_hq":{"type":"boolean","description":"True for the headquarters location."},"city":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"state":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"country_code":{"type":"string","nullable":true,"description":"ISO country code."},"postal_code":{"type":"string","nullable":true},"line1":{"type":"string","nullable":true,"description":"First line of the street address."},"line2":{"type":"string","nullable":true,"description":"Second line of the street address, if any."},"formatted_address":{"type":"string","nullable":true,"description":"The full address as a single formatted string."},"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true}}}},"number_of_employees":{"type":"integer","nullable":true},"employee_range":{"type":"string","nullable":true,"description":"Employee headcount range, e.g. \"51-200\"."},"founded_year":{"type":"integer","nullable":true},"industries":{"type":"string","nullable":true},"activity_summary":{"type":"string","nullable":true,"description":"A short summary of the company's activity."},"tagline":{"type":"string","nullable":true,"description":"The company's LinkedIn tagline — a short one-line headline, distinct from `activity_summary`. `null` when the company has no LinkedIn data, or LinkedIn has no tagline for it."}}},"V2LeadDetail":{"type":"object","description":"A lead in the workspace, with its linked profile and a reference to its current company. All fields are nullable — a lead with no linked profile, or with a profile that has no current company, is returned with those fields set to `null` rather than an error.","required":["id"],"properties":{"id":{"type":"integer","description":"The lead id, as returned by the signals endpoints. Always use the `lead_id` value from those responses — don't guess, hard-code, or reuse an id from another workspace."},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"linkedin_url":{"type":"string","nullable":true},"linkedin_handle":{"type":"string","nullable":true,"description":"LinkedIn profile handle (slug)."},"linkedin_headline":{"type":"string","nullable":true},"avatar_url":{"type":"string","nullable":true},"position":{"type":"string","nullable":true,"description":"The lead's job title."},"location":{"type":"string","nullable":true},"geo":{"type":"object","nullable":true,"description":"The lead's location as structured data. `location` above is the same location as a display string; `geo` breaks it down into city, region, country, and ISO country code. `null` when no structured location could be resolved for this lead — not an error.","properties":{"city":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"country_code":{"type":"string","nullable":true,"description":"ISO country code."}}},"company":{"type":"object","nullable":true,"description":"The lead's current company, when one can be resolved. `null` when the lead has no linked profile, no current company, or that company is not tracked in the workspace.","required":["id"],"properties":{"id":{"type":"integer","description":"This company's ID in the workspace. Always use the `id` returned here — don't guess, hard-code, or copy it from another workspace — then pass it to the Get Company endpoint to fetch its full enrichment data."},"name":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true},"linkedin_url":{"type":"string","nullable":true},"linkedin_handle":{"type":"string","nullable":true},"activity_summary":{"type":"string","nullable":true,"description":"A short summary of the company's activity."},"employee_range":{"type":"string","nullable":true,"description":"Employee headcount range, e.g. \"51-200\"."},"location":{"type":"string","nullable":true},"is_top_account":{"type":"boolean","description":"True when this company is one of the workspace's top accounts. Reflects the top-account list at the time of the request, so a lead's badge changes as that list changes."}}}}},"V2ContentAuthor":{"type":"object","description":"Who posted, commented, or reacted — a person or a company page.","required":["type"],"properties":{"type":{"type":"string","enum":["profile","company"]},"full_name":{"type":"string","description":"Present when `type` is `profile`."},"headline":{"type":"string","nullable":true,"description":"Present when `type` is `profile`."},"company_name":{"type":"string","description":"Present when `type` is `company`."},"linkedin_url":{"type":"string"}}},"V2ContentMention":{"type":"object","properties":{"name":{"type":"string"},"linkedin_url":{"type":"string"}}},"V2ContentEmbeddedPost":{"type":"object","description":"The post a reaction was made on.","properties":{"post_id":{"type":"string"},"link":{"type":"string"},"text":{"type":"string"},"author":{"$ref":"#/components/schemas/V2ContentAuthor"}}},"V2ContentData":{"description":"What this content item is about. Shape depends on `content_type`; every field is\nincluded only when we could extract it, so treat all fields as optional.\n\n- LinkedIn posts (`linkedinPost`, `linkedinCompanyPost`): `post_id`, `original_post_id`\n  (set when this is a repost), `is_repost`, `link`, `text` (full text, never truncated),\n  `posted_at`, `engagement`, `author`, `mentions` (`{ profiles: [...], companies: [...] }`),\n  `images` (array of URLs).\n- LinkedIn comments (`linkedinComment`): `linkedin_id` (the comment's own LinkedIn id,\n  when we have it), `text`, `linkedin_url`, `posted_at`, `engagement`, `author`, and\n  `post_content_id` — the numeric id of the commented post in your contents (fetch it\n  via the Contents endpoints), `null` when that post is not among your contents.\n- `engagement` is the same flat shape for both posts and comments: `likes`, `comments`\n  (replies, for a comment), `shares` (posts only), and a per-reaction-type breakdown —\n  `praise`, `empathy`, `interest`, `appreciation` — whenever the source exposes it.\n- LinkedIn reactions (`linkedinReaction`): `reaction_type` (e.g. `LIKE`), `author`,\n  and `post` — the parent post being reacted to.\n- LinkedIn job postings (`linkedinJobPosting`): `linkedin_id`, `linkedin_url`, `title`, `min_salary`,\n  `max_salary` (a number or a free-text string such as `\"$100K/yr\"`, when disclosed),\n  `location`, `posted_at`, `description` (full text).\n- Every other content type: `text` when we have it, omitted otherwise.","type":"object","properties":{"linkedin_id":{"type":"string","description":"The item's own LinkedIn id (a comment or a job posting) — not to be confused with this content item's own `id` at the top level."},"post_id":{"type":"string"},"original_post_id":{"type":"string","nullable":true},"is_repost":{"type":"boolean"},"link":{"type":"string"},"text":{"type":"string"},"posted_at":{"type":"string","format":"date-time"},"reaction_type":{"type":"string"},"engagement":{"type":"object","description":"Same flat shape for posts and comments. `shares` is posts only; `comments` means comments on a post, or replies to a comment. The reaction breakdown (`praise`/`empathy`/`interest`/`appreciation`) is present whenever the source exposes it.","properties":{"likes":{"type":"integer"},"comments":{"type":"integer","description":"Number of comments on a post, or number of replies to a comment."},"shares":{"type":"integer","description":"Posts only."},"praise":{"type":"integer"},"empathy":{"type":"integer"},"interest":{"type":"integer"},"appreciation":{"type":"integer"}}},"author":{"$ref":"#/components/schemas/V2ContentAuthor"},"mentions":{"type":"object","properties":{"profiles":{"type":"array","items":{"$ref":"#/components/schemas/V2ContentMention"}},"companies":{"type":"array","items":{"$ref":"#/components/schemas/V2ContentMention"}}}},"images":{"type":"array","items":{"type":"string"}},"post":{"$ref":"#/components/schemas/V2ContentEmbeddedPost"},"post_content_id":{"type":"integer","nullable":true,"description":"Comments only — the id of the commented post in your contents, usable with the Contents endpoints. `null` when that post is not among your contents."},"linkedin_url":{"type":"string","description":"URL of the item on LinkedIn (comment or job posting)."},"title":{"type":"string","description":"Job posting title."},"min_salary":{"oneOf":[{"type":"number"},{"type":"string"}],"nullable":true,"description":"Minimum disclosed salary, when available."},"max_salary":{"oneOf":[{"type":"number"},{"type":"string"}],"nullable":true,"description":"Maximum disclosed salary, when available."},"location":{"type":"string","description":"Job posting location."},"description":{"type":"string","description":"Full job posting description."}}},"V2ContentItem":{"type":"object","required":["id","content_type","created_at","lead_id","company_id"],"properties":{"id":{"type":"integer","description":"Numeric id of the content item. Environment-specific, prod only, not portable across environments."},"content_type":{"type":"string","description":"Content type."},"created_at":{"type":"string","format":"date-time","description":"When the content record was created."},"data":{"$ref":"#/components/schemas/V2ContentData"},"lead_id":{"type":"integer","nullable":true,"description":"Numeric id of the lead who posted, commented, or reacted, when they are one of your leads. Environment-specific, prod only."},"company_id":{"type":"integer","nullable":true,"description":"The associated company's ID in Sillage. `null` when the company is not on the target account list."}}},"V2ContentsPaginatedResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/V2ContentItem"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/V2PaginationMeta"}}}}},"V2ContentsQueryBody":{"type":"object","description":"POST body for `POST /v2/partner/workspaces/{partner_workspace_id}/contents/query`. All fields are optional.","properties":{"page":{"type":"integer","minimum":1,"default":1,"description":"Page number (starts at 1). Defaults to 1."},"page_size":{"type":"integer","minimum":1,"maximum":100,"default":25,"description":"Number of items per page. Defaults to 25. Maximum: 100."},"date_from":{"type":"string","format":"date-time","description":"Filter contents created on or after this date (ISO 8601)."},"date_to":{"type":"string","format":"date-time","description":"Filter contents created on or before this date (ISO 8601)."},"content_type":{"type":"array","description":"Filter by content type. Native JSON array.","items":{"type":"string","enum":["linkedinComment","recentlyPromoted","linkedinPost","linkedinCompanyPost","linkedinJobPosting","webArticle","pressRelease","blogPost"]}},"company_id":{"type":"integer","minimum":1,"description":"Filter by company numeric id. Environment-specific, prod only. Takes priority over all human-identifier fields."},"company_domain":{"type":"array","minItems":1,"maxItems":100,"description":"Filter by company domain(s). Native JSON array. Maximum 100 values. Human identifiers are resolved to company IDs using a single-winning-tier waterfall: `company_id` > `company_linkedin_handle` > `company_linkedin_url` > `company_domain`. Only the highest-priority supplied tier is used; lower tiers are ignored. Multi-value = union within the winning tier.","items":{"type":"string","minLength":1}},"company_linkedin_handle":{"type":"array","minItems":1,"maxItems":100,"description":"Filter by company LinkedIn handle(s). Native JSON array. Maximum 100 values. See `company_domain` for tier priority.","items":{"type":"string","minLength":1}},"company_linkedin_url":{"type":"array","minItems":1,"maxItems":100,"description":"Filter by company LinkedIn URL(s). Native JSON array. Maximum 100 values. See `company_domain` for tier priority.","items":{"type":"string","minLength":1}},"person_id":{"type":"integer","minimum":1,"description":"Filter by author profile numeric id. Environment-specific, prod only."},"response_format":{"type":"string","enum":["concise","normalized","detailed"],"default":"normalized","description":"Controls how much detail the `data` field of each item includes. `normalized` (default): a clean, stable projection of the content. `concise`: `data` is omitted entirely. Lowest token footprint. `detailed`: deprecated alias of `normalized`, kept for backward compatibility."}}},"V2ContentRequestItem":{"type":"object","required":["id","type","stage","created_at","updated_at"],"properties":{"id":{"type":"integer","description":"Numeric id of the content request. Environment-specific, prod only, not portable across environments."},"type":{"type":"string","enum":["account_mapping","top_account_content"],"description":"Request type."},"stage":{"type":"string","enum":["account_mapping_ready","account_mapping_in_progress","account_mapping_ingestion_ready","account_mapping_ingestion_in_progress","account_mapping_failed","completed","top_account_content_scraping_ready","top_account_content_scraping_starting","top_account_content_scraping_in_progress","top_account_content_failed"],"description":"Current processing stage."},"created_at":{"type":"string","format":"date-time","description":"When the request was created."},"updated_at":{"type":"string","format":"date-time","description":"When the request was last updated."},"company":{"$ref":"#/components/schemas/V2Company"},"inputs":{"description":"Request-type-specific input payload."}}},"V2ContentRequestsPaginatedResponse":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/V2ContentRequestItem"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/V2PaginationMeta"}}}}},"SignalAuthor":{"type":"object","description":"The person behind the source content, when known.","properties":{"full_name":{"type":"string","nullable":true,"description":"The person's name."},"headline":{"type":"string","nullable":true,"description":"The person's job title or headline, when available."},"linkedin_url":{"type":"string","nullable":true,"description":"Link to the person's LinkedIn profile."}}},"SignalItem":{"type":"object","required":["id"],"description":"A signal detection record.","properties":{"id":{"type":"integer","description":"Numeric id of the signal. This ID is specific to your environment."},"signal_type":{"type":"string","nullable":true,"description":"Signal type."},"data":{"description":"Signal-type-specific payload."},"detected_at":{"type":"string","nullable":true,"format":"date-time","description":"When the signal was detected."},"signal_date":{"type":"string","nullable":true,"format":"date-time","description":"Date associated with the signal event."},"lead_id":{"type":"integer","nullable":true,"description":"ID of the associated lead, if any."},"company_id":{"type":"integer","nullable":true,"description":"ID of the associated company, if any."},"agent_id":{"type":"integer","nullable":true,"description":"ID of the agent that produced this signal, if any."},"source_url":{"type":"string","nullable":true,"description":"Link to the source content behind the signal (the post, interaction, or job posting). Null when the signal has no public external link."},"author":{"allOf":[{"$ref":"#/components/schemas/SignalAuthor"}],"nullable":true,"description":"The person behind the source content, when known. Null for company-level or authorless signals."},"excerpt":{"type":"string","nullable":true,"description":"A short text extract from the source content (post text, comment, or job description). Null when no text is available."}}},"CreateSignalBody":{"type":"object","required":["signal_type","interaction_data","workspace_company_document_id"],"properties":{"signal_type":{"type":"string","description":"Type of signal to record."},"interaction_data":{"description":"Signal-type-specific payload."},"workspace_company_document_id":{"type":"string","minLength":1,"description":"ID of the workspace company to associate with this signal."},"workspace_lead_document_id":{"type":"string","nullable":true,"description":"ID of the workspace lead to associate with this signal."},"agent_document_id":{"type":"string","nullable":true,"description":"ID of the agent to attribute this signal to."}}},"V2SignalsQueryBody":{"type":"object","description":"POST body for `POST /v2/partner/workspaces/{partner_workspace_id}/signals/query`. All fields are optional.","properties":{"cursor":{"type":"string","description":"Opaque pagination cursor. Pass the `next_cursor` value from the previous response to fetch the next page. Omit for the first page."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":25,"description":"Number of items to return per page. Defaults to 25. Maximum: 100."},"signal_start_date":{"type":"string","format":"date-time","description":"Return detections whose signal date is on or after this timestamp (ISO 8601 with UTC offset). Defaults to 90 days before now. Cannot go further back than 180 days — an older value is clamped to that limit."},"signal_end_date":{"type":"string","format":"date-time","description":"Return detections whose signal date is on or before this timestamp (ISO 8601 with UTC offset)."},"detection_start_date":{"type":"string","format":"date-time","description":"Return detections that were first seen on or after this timestamp (ISO 8601 with UTC offset)."},"detection_end_date":{"type":"string","format":"date-time","description":"Return detections that were first seen on or before this timestamp (ISO 8601 with UTC offset)."},"agent_id":{"type":"integer","minimum":1,"description":"Return detections produced by a specific agent. Pass the numeric `agent_id` returned on each detection in the list response."},"signal_run_id":{"type":"integer","minimum":1,"description":"Return detections from a specific run. Pass the numeric run id returned by the signal-runs endpoint. Results are automatically scoped to the workspace."},"type":{"type":"array","minItems":1,"description":"Filter results to one or more signal types; unknown values are rejected.","items":{"type":"string","enum":["keywordDetection","newJob","recentlyPromoted","jobPostingKeywordDetection","competitorInboundComment","competitorOutboundComment","partnerInboundComment","partnerOutboundComment","customerInboundComment","customerOutboundComment","influencerInboundComment","influencerOutboundComment","championInboundComment","championOutboundComment","championJobChange","linkedinComment","linkedinReaction","jobPosting","jobPostingInsight","jobPostingHiringManager","leadLikedCompetitorContent","leadCommentedCompetitorContent","leadLikedOwnContent","leadCommentedOwnContent"]}},"company_id":{"type":"integer","minimum":1,"description":"Return detections for a specific company on the workspace top-account list. Pass the numeric `company_id` from the workspace target account list. This ID is specific to your environment. Taken at face value — no lookup is performed, so an unknown `company_id` or a company that exists in the workspace but is not on the top-account list returns an empty page rather than a `404`. Takes priority over all human-identifier fields below."},"company_domain":{"type":"array","minItems":1,"maxItems":100,"description":"Return detections for companies on the workspace top-account list matching this domain. Native JSON array, OR filtering across multiple companies. See `company_id` for tier priority. Returns `404` when none of the supplied values resolve to a known company on the workspace top-account list.","items":{"type":"string","minLength":1}},"company_linkedin_handle":{"type":"array","minItems":1,"maxItems":100,"description":"Return detections for companies on the workspace top-account list matching this LinkedIn handle. Native JSON array. See `company_id` for tier priority. Returns `404` when none of the supplied values resolve to a known company on the workspace top-account list.","items":{"type":"string","minLength":1}},"company_linkedin_url":{"type":"array","minItems":1,"maxItems":100,"description":"Return detections for companies on the workspace top-account list matching this LinkedIn URL. Native JSON array. See `company_id` for tier priority. Returns `404` when none of the supplied values resolve to a known company on the workspace top-account list.","items":{"type":"string","minLength":1}},"lead_id":{"type":"integer","minimum":1,"description":"Filter to signals linked to a specific lead. Use the `lead_id` returned by the signals endpoints; resolve details via `GET /v2/leads/{id}`. Only matches detections directly linked to the lead — not signals attributed to that lead through fallback matching."}}}}},"security":[{"MasterKeyAuth":[]}],"paths":{"/v2/partner/usage":{"get":{"tags":["Usage"],"summary":"Get partner usage","description":"Returns real-time consumption for your partner account, in credits only (no currency\namounts), broken down per workspace and per product.\n\nWhen both `date_from` and `date_to` are provided, they may span at most 3 months —\na wider window is rejected with a 422. When only one of the two is provided, the other\nbound is derived 3 calendar months away (UTC): `date_from` alone means\n`date_to = date_from + 3 months`, and `date_to` alone means\n`date_from = date_to - 3 months`. When both are omitted, the window is the current\ncalendar month to date (UTC).\n\nEvery level of the response carries a `credits_by_status` object: credits grouped by\nwhere they are in the billing lifecycle. Possible keys:\n\n- `held` — reserved for an action still in progress; not final and not billable yet.\n- `invoiceable` — the action completed; these credits will appear on your next invoice.\n- `invoice_edited` — an invoice covering these credits has been issued to you.\n- `invoice_paid` — the invoice covering these credits has been paid.\n- `released` — the reservation was cancelled because the action did not complete; you\n  are never billed for these credits.\n\nA status key is only present when the period contains credits in that status.","security":[{"MasterKeyAuth":[]}],"parameters":[{"name":"date_from","in":"query","required":false,"description":"ISO 8601 timestamp. Include consumption at or after this date. When omitted, derived as 3 calendar months before `date_to` if `date_to` is provided; otherwise defaults to the start of the current calendar month (UTC).","schema":{"type":"string","format":"date-time"}},{"name":"date_to","in":"query","required":false,"description":"ISO 8601 timestamp. Include consumption strictly before this date. When omitted, derived as 3 calendar months after `date_from` if `date_from` is provided; otherwise defaults to now. When both dates are provided, `date_to` must be at most 3 months after `date_from`.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"Partner usage for the requested period","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2PartnerUsageResponse"},"example":{"workspaces":[{"id":88,"credits_by_status":{"invoiceable":12.5,"held":1},"by_product":[{"product":"account_mapping_launch","credits_by_status":{"invoiceable":8,"held":1}},{"product":"keyword_signal","credits_by_status":{"invoiceable":4.5}}]},{"id":91,"credits_by_status":{"invoice_paid":3},"by_product":[{"product":"account_mapping_launch","credits_by_status":{"invoice_paid":3}}]}],"credits_by_status":{"invoiceable":12.5,"held":1,"invoice_paid":3}}}}},"400":{"description":"Invalid query parameters."},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/me":{"get":{"operationId":"partnerMe","summary":"Get partner identity","description":"Returns the identity of the partner associated with your master key. Use this to verify authentication and retrieve your partner name and slug.","tags":["Health"],"security":[{"MasterKeyAuth":[]}],"parameters":[],"responses":{"200":{"description":"Authenticated successfully.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id","name","slug"],"properties":{"id":{"type":"integer","description":"Numeric identifier for this partner. This ID is specific to your environment."},"name":{"type":"string","description":"Display name of the partner."},"slug":{"type":"string","description":"Unique slug for this partner."}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/ping":{"get":{"operationId":"partnerWorkspacePing","summary":"Workspace health check","description":"Verifies your master key and resolves the workspace for the given `partner_workspace_id`. Use this to confirm that a workspace is active and accessible.","tags":["Health"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"200":{"description":"Workspace resolved successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"partner":{"type":"object","properties":{"name":{"type":"string"}}},"workspace":{"type":"object","properties":{"id":{"type":"integer","description":"Numeric identifier of the workspace. This ID is specific to your environment."},"partner_workspace_id":{"type":"string"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces":{"get":{"operationId":"listWorkspaces","summary":"List workspaces","description":"Returns a paginated list of all workspaces managed by this partner. Results are ordered by creation date descending.","tags":["Workspaces"],"parameters":[{"$ref":"#/components/parameters/Page"},{"$ref":"#/components/parameters/PageSize"}],"responses":{"200":{"description":"Paginated workspace list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceListResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"operationId":"createWorkspace","summary":"Create a workspace","description":"Provisions a new Sillage workspace for an end customer. A `partner_workspace_id` must be supplied and must be unique per partner, it is your stable reference for all subsequent operations on this workspace.","tags":["Workspaces"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceBody"}}}},"responses":{"201":{"description":"Workspace created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}":{"get":{"operationId":"getWorkspace","summary":"Get a workspace","description":"Returns the current state of a single workspace by its partner-side ID.","tags":["Workspaces"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"200":{"description":"Workspace data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"patch":{"operationId":"updateWorkspace","summary":"Update a workspace","description":"Partially updates mutable workspace attributes. Only supplied fields are changed; omitted fields are left unchanged.","tags":["Workspaces"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWorkspaceBody"}}}},"responses":{"200":{"description":"Updated workspace data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"operationId":"deleteWorkspace","summary":"Delete a workspace","description":"Hides the workspace and stops it from receiving signals. Its data is kept so the workspace can be restored unless terminal erasure has begun. Terminal erasure permanently prevents restoration.","tags":["Workspaces"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"204":{"description":"Workspace deleted successfully. No response body."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/archive":{"post":{"operationId":"archiveWorkspace","summary":"Archive a workspace","description":"Marks the workspace as archived. Archived workspaces stop receiving signals but their data is preserved. Use the update endpoint to un-archive.","tags":["Workspaces"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"204":{"description":"Workspace archived. No response body."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/restore":{"post":{"operationId":"restoreWorkspace","summary":"Restore a deleted workspace","description":"Brings back a workspace that was previously deleted. The workspace becomes visible again and resumes receiving signals, with all of its data intact. Fails with 409 if terminal erasure has begun, because erased workspaces cannot be restored, or if a new workspace now uses the same domain.","tags":["Workspaces"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"204":{"description":"Workspace restored. No response body."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/persona":{"get":{"operationId":"readPersona","summary":"Read workspace persona","description":"Returns the current ICP persona for the workspace, or `{ \"data\": null }` if none has been set yet.\n\n**Deprecated:** only ever reads the oldest persona, which no longer reflects workspaces with more than one business line. Use `GET /v2/partner/workspaces/{partner_workspace_id}/personas` and its `/{persona_id}` variant instead. Removal is tracked in SIL-1798.","deprecated":true,"tags":["Persona"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"200":{"description":"Current persona, or null if not yet configured.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"nullable":true,"type":"object","properties":{"id":{"type":"integer","description":"Numeric identifier of the persona. This ID is specific to your environment."},"job_title":{"type":"array","items":{"type":"string"},"nullable":true},"exclude_job_title":{"type":"array","items":{"type":"string"},"nullable":true},"location":{"type":"array","items":{"type":"string"},"nullable":true},"headcount":{"type":"array","items":{"type":"string"},"nullable":true},"industry":{"type":"array","items":{"type":"string"},"nullable":true},"seniority":{"type":"array","items":{"type":"string"},"nullable":true},"additional_info":{"type":"string","nullable":true}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"put":{"operationId":"upsertPersona","summary":"Upsert workspace persona","description":"Creates or replaces the ICP persona for the workspace. The persona filters narrow the pool of leads monitored. Calling this endpoint a second time fully replaces the existing persona. `job_title` and `location` are required — the request is rejected with `400` and field errors when either is missing or empty.\n\n**Deprecated:** only ever writes the oldest persona, so it cannot create a second business line. Use `POST .../personas` to create one and `PATCH .../personas/{persona_id}` to update one. Removal is tracked in SIL-1798.","deprecated":true,"tags":["Persona"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaBody"}}}},"responses":{"200":{"description":"Persona upserted successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaResponse"}}}},"400":{"description":"Invalid request body."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/personas":{"get":{"operationId":"listPersonas","summary":"List personas","description":"Returns every one of the workspace's personas (business lines), paginated. Archived personas are excluded.","tags":["Persona"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"$ref":"#/components/parameters/Page"},{"name":"page_size","in":"query","description":"Number of items per page. Defaults to 25. Maximum: 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Paginated list of personas.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Persona"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"Invalid `page` or `page_size` query parameter."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"operationId":"createPersona","summary":"Create a persona","description":"Creates a new persona (business line) for the workspace — unlike `PUT .../persona`, this always creates a new record rather than replacing an existing one, so it is how a partner sets up a second business line. There is no limit on the number of personas a workspace can create through this endpoint. `job_title` and `location` are required — the request is rejected with `422` and field errors when either is missing or empty.","tags":["Persona"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaBody"}}}},"responses":{"201":{"description":"Persona created successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaWriteResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/personas/{persona_id}":{"get":{"operationId":"getPersona","summary":"Get one persona","description":"Returns one of the workspace's personas by id. 404 if the id is unknown, archived, or belongs to another workspace.","tags":["Persona"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"persona_id","in":"path","required":true,"description":"ID of the persona, as returned by `GET .../personas`. This ID is specific to your environment.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Persona retrieved.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Persona"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"patch":{"operationId":"updatePersona","summary":"Update a persona","description":"Partially updates one persona. Every field is optional, but at least one must be sent. Fields left out are unchanged; the others behave exactly like `PUT .../persona` (e.g. `location` must keep at least one value if sent). Updating one persona never touches another.","tags":["Persona"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"persona_id","in":"path","required":true,"description":"ID of the persona, as returned by `GET .../personas`. This ID is specific to your environment.","schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaPatchBody"}}}},"responses":{"200":{"description":"Persona updated successfully.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaWriteResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/signals/query":{"post":{"operationId":"listSignals","summary":"List signals","description":"Returns a cursor-paginated list of signal detections for the workspace, sorted by detection date descending.\n\nPass the `next_cursor` from one response as the `cursor` field of the next request to advance through the list.\nWhen `has_more` is false, you have reached the end.\n\nUse `GET /v2/partner/workspaces/{partner_workspace_id}/signals/count` with the same filters to get the total count.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SignalsQueryBody"}}}},"responses":{"200":{"description":"Cursor-paginated list of signals, sorted by detection date descending (most recent first).","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SignalItem"}},"meta":{"type":"object","required":["next_cursor","has_more"],"properties":{"next_cursor":{"type":"string","nullable":true,"description":"Opaque cursor to pass as `cursor` on the next request. Null when this is the last page."},"has_more":{"type":"boolean","description":"Whether more results exist beyond this page."}}}}}}}},"400":{"description":"Invalid request body."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Returned when string company identifier(s) (`company_domain`, `company_linkedin_handle`, or `company_linkedin_url`) were supplied and none of them resolved to a known company in the workspace. Note: `company_id` is taken at face value and never triggers a `404`."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/signals":{"post":{"operationId":"createSignal","summary":"Create a signal","description":"Records a new signal detection for the workspace.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSignalBody"}}}},"responses":{"201":{"description":"Signal created.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/SignalItem"}}}}}},"400":{"description":"Invalid request body."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/signals/count":{"get":{"operationId":"countSignals","summary":"Count signals","description":"Returns the total number of signal detections matching the given filters for the workspace.\n\nAccepts the same filter parameters as `POST /v2/partner/workspaces/{partner_workspace_id}/signals/query`.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"signal_start_date","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Count detections whose signal date is on or after this timestamp (ISO 8601 with UTC offset). Defaults to 90 days before now. Cannot go further back than 180 days — an older value is clamped to that limit."},{"name":"signal_end_date","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Count detections whose signal date is on or before this timestamp (ISO 8601 with UTC offset)."},{"name":"detection_start_date","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Count detections that were first seen on or after this timestamp (ISO 8601 with UTC offset)."},{"name":"detection_end_date","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Count detections that were first seen on or before this timestamp (ISO 8601 with UTC offset)."},{"name":"agent_id","in":"query","required":false,"schema":{"type":"string"},"description":"Count detections produced by a specific agent. Pass the opaque string `agent_id` returned on each detection in the list response."},{"name":"signal_run_id","in":"query","required":false,"schema":{"type":"integer"},"description":"Count detections from a specific run. Pass the numeric run id returned by the signal-runs endpoint."},{"name":"company_id","in":"query","required":false,"schema":{"type":"integer"},"description":"Count detections for a specific company on the workspace top-account list. Pass the numeric `company_id` from the workspace target account list. This ID is specific to your environment. Taken at face value — no lookup is performed, so an unknown `company_id` or a company that exists in the workspace but is not on the top-account list returns a zero count rather than a `404`."},{"name":"company_domain","in":"query","required":false,"schema":{"type":"string"},"example":"acme.com,widgets.io","description":"Count detections for companies on the workspace top-account list matching this domain. Accepts a comma-separated list for OR filtering across multiple companies. Returns `404` when none of the supplied values resolve to a known company on the workspace top-account list."},{"name":"company_linkedin_handle","in":"query","required":false,"schema":{"type":"string"},"example":"acme-corp,widgets-io","description":"Count detections for companies on the workspace top-account list matching this LinkedIn handle. Accepts a comma-separated list for OR filtering across multiple companies. Returns `404` when none of the supplied values resolve to a known company on the workspace top-account list."},{"name":"company_linkedin_url","in":"query","required":false,"schema":{"type":"string"},"example":"https://www.linkedin.com/company/acme-corp,https://www.linkedin.com/company/widgets-io","description":"Count detections for companies on the workspace top-account list matching this LinkedIn URL. Accepts a comma-separated list for OR filtering across multiple companies. Returns `404` when none of the supplied values resolve to a known company on the workspace top-account list."},{"name":"lead_id","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter to signals linked to a specific lead. Use the `lead_id` returned by the signals endpoints; resolve details via `GET /v2/leads/{id}`. Only matches detections directly linked to the lead — not signals attributed to that lead through fallback matching."}],"responses":{"200":{"description":"Total number of matching signal detections.","content":{"application/json":{"schema":{"type":"object","required":["total"],"properties":{"total":{"type":"integer","description":"Total number of signal detections matching the supplied filters."}}},"examples":{"sample":{"summary":"Count result","value":{"total":42}}}}}},"400":{"description":"Invalid query parameter."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Returned when string company identifier(s) (`company_domain`, `company_linkedin_handle`, or `company_linkedin_url`) were supplied and none of them resolved to a known company in the workspace. Note: `company_id` is taken at face value and never triggers a `404`."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/signals/{id}":{"get":{"operationId":"getSignal","summary":"Get a signal","description":"Returns a single signal by its numeric id.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Numeric id of the signal. This ID is specific to your environment."}],"responses":{"200":{"description":"Signal found.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/SignalItem"}}}}}},"400":{"description":"Invalid `id` path parameter."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"patch":{"operationId":"updateSignal","summary":"Update a signal","description":"Updates the `interaction_data` of an existing signal.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Numeric id of the signal. This ID is specific to your environment."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"interaction_data":{"description":"Updated interaction payload for the signal."}}}}}},"responses":{"200":{"description":"Signal updated.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/SignalItem"}}}}}},"400":{"description":"Invalid request body or `id` parameter."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"operationId":"deleteSignal","summary":"Delete a signal","description":"Permanently deletes a signal by its numeric id.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Numeric id of the signal. This ID is specific to your environment."}],"responses":{"204":{"description":"Signal deleted. No response body."},"400":{"description":"Invalid `id` path parameter."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/signal-runs":{"post":{"operationId":"launchSignalRun","summary":"Launch a signal run","description":"Starts an on-demand run for one of the workspace’s agents, across your target accounts.\n\nThis works for **every** agent type, not just keyword detection. What the run does is\nderived from the agent itself: a `keyword_detection` agent scans posts for its keywords,\na `job_posting_keyword_detection` agent scans the job postings your target accounts\npublish, a `job_update` agent looks for job changes, and so on.\n\nThe run starts immediately and responds with `202 Accepted`.\n\nSafe to retry, launching the same run again will not create duplicate matches.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["agent_id","signal_key","parameters"],"properties":{"agent_id":{"type":"integer","description":"The ID of the agent to run, from your Sillage workspace. Any agent type is accepted. This ID is specific to your environment."},"signal_key":{"type":"string","enum":["keyword"],"description":"Legacy field, required for backwards compatibility but not used: the kind of run is derived from the agent itself. Pass `keyword` whatever the agent type."},"parameters":{"type":"object","properties":{"match_mode":{"type":"string","enum":["any","all"],"description":"Keyword agents only — whether to match content containing any or all of the keywords. Defaults to `any`. Ignored by the other agent types."}}}}}}}},"responses":{"202":{"description":"Run accepted.","content":{"application/json":{"schema":{"type":"object","required":["signal_request_id","stage"],"properties":{"signal_request_id":{"type":"integer","description":"Numeric id of the created run. Use with the poll endpoint to track progress. This ID is specific to your environment."},"stage":{"type":"string","description":"Current processing stage of the run."}}}}}},"400":{"description":"Invalid request body."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"description":"The client's workspace is blocked, so no run can be launched. Nothing was started.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/signal-runs/{id}":{"get":{"operationId":"pollSignalRun","summary":"Poll a signal run","description":"Returns the current status of a signal run.\n\nPoll this endpoint after calling `POST .../signal-runs` until `stage` is `completed` or `failed`.","tags":["V2 Partner Setup"],"security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Numeric id of the signal run (`signal_request_id` from the launch response). This ID is specific to your environment."}],"responses":{"200":{"description":"Current run status.","content":{"application/json":{"schema":{"type":"object","required":["signal_request_id","stage"],"properties":{"signal_request_id":{"type":"integer"},"stage":{"type":"string","description":"Processing stage of the run. Poll until `stage` is `completed` or `failed`."},"metadata":{"nullable":true,"description":"Extra run metadata. Null on a clean run.","type":"object","properties":{"failed":{"type":"object","properties":{"dropped_account_ids":{"type":"array","items":{"type":"integer"},"description":"Accounts not scanned in this run. Retry the run to cover them."}}}}}}}}}},"400":{"description":"Invalid `id` path parameter."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/top-account-list":{"get":{"operationId":"getTopAccountListContent","summary":"Get top account list content","description":"Returns the enriched accounts currently stored in the top account list for this workspace.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"200":{"description":"Enriched top account list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListContentResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"operationId":"replaceTopAccountList","summary":"Replace top account list","description":"Replaces the full list of target accounts for this workspace.\n\nThe submitted list replaces the previous one in its entirety, accounts absent from the new\nlist are removed from your target accounts, but the underlying company and lead records in Sillage are kept.\n\nThe ingestion runs asynchronously. Use the `/status` endpoint to poll for completion.\nUp to 10,000 accounts per request.\n\nThe response echoes back the submitted accounts in `accounts` for confirmation.\n\n**Persona required:** rejected with `422` and `type: https://docs.getsillage.com/errors/persona-incomplete` when the workspace has no persona whose location resolves to at least one country (or targets `Global`). `detail` names the fix — set a location with `PUT /v2/partner/workspaces/{partner_workspace_id}/persona` before retrying.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListBody"}}}},"responses":{"202":{"description":"Accounts accepted for ingestion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListReplaceResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/top-account-list/status":{"get":{"operationId":"getTopAccountListStatus","summary":"Get top account list ingestion status","description":"Returns the current state of the latest top account list ingestion for this workspace. Poll this endpoint after calling POST `/top-account-list` to track progress.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"200":{"description":"Current ingestion status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListStatusResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/top-account-list/accounts":{"get":{"operationId":"listTopAccounts","summary":"List top accounts (found only, paginated)","description":"Returns a paginated list of **found** accounts in this workspace's top account list.\n\nOnly accounts whose enrichment resolved a company record (`status: found`) are returned.\nAccounts that could not be matched are available at the `/not-found` sub-endpoint.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"$ref":"#/components/parameters/Page"},{"name":"page_size","in":"query","description":"Number of items per page. Defaults to 25. Maximum: 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"persona_id","in":"query","description":"Only return accounts belonging to this persona, plus any account not yet assigned to one. Omit to return every account. This id is specific to your environment.","schema":{"type":"integer"}}],"responses":{"200":{"description":"Paginated found top accounts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListPaginatedResponse"}}}},"400":{"description":"Invalid request."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"operationId":"addTopAccounts","summary":"Add accounts (batch)","description":"Adds a batch of accounts to the top account list with **merge** semantics.\n\nExisting accounts are preserved. Deduplication is handled automatically.\n\nThe ingestion runs asynchronously. Poll `GET .../top-account-list/status` to track progress.\n\n**Persona required:** rejected with `422` and `type: https://docs.getsillage.com/errors/persona-incomplete` when the workspace has no persona whose location resolves to at least one country (or targets `Global`). `detail` names the fix — set a location with `PUT /v2/partner/workspaces/{partner_workspace_id}/persona` before retrying.\n\n**Usage:** accounts added to the list are mapped and their relevant employee profiles' content is analyzed, which is metered under the `account_mapping_launch` and `content_profile` products. Track consumption with `GET /v2/partner/usage`.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListBody"}}}},"responses":{"202":{"description":"Accounts accepted for ingestion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListReplaceResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/top-account-list/accounts/not-found":{"get":{"operationId":"listNotFoundTopAccounts","summary":"List not-found accounts","description":"Returns a paginated list of accounts whose enrichment could not resolve a company record (`status: not_found`).\n\nEach item carries the original `user_input` submitted, a partial `company` object, and the `imported_at` timestamp.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"$ref":"#/components/parameters/Page"},{"name":"page_size","in":"query","description":"Number of items per page. Defaults to 25. Maximum: 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Paginated not-found accounts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotFoundAccountsPaginatedResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/top-account-list/accounts/remove":{"post":{"operationId":"removeTopAccounts","summary":"Remove accounts (batch)","description":"Removes a batch of accounts from the top account list.\n\nEach item is matched by `linkedin_url` or `domain`. Non-matching items are silently skipped.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListBody"}}}},"responses":{"200":{"description":"Batch removal result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveAccountsResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/top-account-list/accounts/{id}":{"delete":{"operationId":"removeTopAccountById","summary":"Remove account by id","description":"Removes a single account from the top account list by its `company_id`. Returns 404 if no matching account is found.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"`company_id` of the account to remove, as returned by the list endpoint."}],"responses":{"200":{"description":"Account removed.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["removed"],"properties":{"removed":{"type":"boolean","description":"Always `true` in a 200 response."}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/top-account-list/count":{"get":{"operationId":"countTopAccounts","summary":"Count top accounts (found only)","description":"Returns the number of **found** accounts in this workspace's top account list.\n\nOnly accounts whose enrichment resolved a company record (`status: found`) are counted.","tags":["Top Account List"],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"responses":{"200":{"description":"Found account count.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopAccountListCountResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/agents":{"post":{"tags":["V2 Partner Setup"],"deprecated":true,"summary":"Create agent","description":"Replaced by `/v3/partner/workspaces/{partner_workspace_id}/signal-setups`: this endpoint stops answering on 1 April 2027.\n\nCreates an agent for a workspace.\n\nTen types are supported: `keyword_detection` (monitors LinkedIn posts for keywords,\nscoped to your target accounts), `keyword_post_search` (monitors LinkedIn posts for keywords via\na broad LinkedIn search, not scoped to your target accounts),\n`job_posting_keyword_detection` (monitors the job postings your target accounts publish,\nmatching keywords against the job title and description), five semantic watchlist types —\n`competitor`, `partner`, `customer` (company lists) and `influencer`, `champion`\n(profile lists) — `job_update` (detects job changes and promotions among the workspace’s\ncontacts, takes no parameters), and `champion_tracking` (detects when a tracked champion\nleaves their company, changes company, or is promoted).\n\nFor the five semantic watchlist types, a watchlist of the matching type is\n**implicitly created** and bound to the agent. `champion_tracking` works the same way,\nbut always binds a **profile watchlist of type `champion`** — the same list a `champion`\nagent can bind to, simultaneously. Pass `watchlist_id` to bind an existing list instead;\nits `type` must equal the expected watchlist type or the request returns 422.\n\nThe competitor arm additionally accepts an optional `parameters.mode`: `lead_discovery`\n(watches the competitor's team on LinkedIn from both directions — the people they\ncomment on or react to, wherever those people work, and the people who comment on or\nreact to the competitor team's own posts), `account_monitoring` (the\ndefault — only detects interactions between the competitor and your own top\naccounts, in both directions, no scraping), or `all` (both). No other agent type\naccepts `mode`.\n\nThe competitor arm also accepts an optional `parameters.target_group`\n(`prospects`/`customers`/`all`, default `all`) narrowing who counts as a lead when\n`lead_discovery` or `all` is active.\n\n`competitor_activity` is not one of the ten types — it is a label that appears only\non individual signal detections, never as an agent's own `type`, and cannot be passed\nhere. Nor can `content_engagement`: existing content-engagement agents keep it as\ntheir own type, but a `competitor` agent's lead discovery also reports it on\nindividual signals without changing that agent's own `type`.\n\nThe agent is created **enabled** (`enabled: true`), but it has no recurring schedule and\nwill not run on its own. Trigger a run yourself with `POST /signal-runs`, or set a\nrecurring schedule from the Sillage app.\n\nThe `keyword_post_search` and `competitor` arms additionally accept `schedule:\n{ \"cadence\": \"weekly\" }` to turn on a recurring weekly run at create — for the\ncompetitor arm this only takes effect when `parameters.mode` is `lead_discovery` or\n`all`, otherwise the request returns 422. Omit `schedule` to create the agent\nunscheduled.\n\n**Usage:** `champion_tracking` agents are not charged per tracked champion; they are metered only for the Discovery moves they find, the same way as other Discovery agents. Keyword agents (`keyword_detection`, `keyword_post_search`, `job_posting_keyword_detection`) are metered under `keyword_signal` for the keyword signals they detect. Track consumption with `GET /v2/partner/usage`.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"title":"keyword_detection","type":"object","required":["name","type","parameters"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["keyword_detection"],"description":"The agent type."},"parameters":{"type":"object","required":["tracking_keywords"],"properties":{"tracking_keywords":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Keywords Sillage monitors on LinkedIn. Minimum 1 required."},"start_date":{"type":"string","description":"ISO 8601 date — scrape only posts published after this date."}}}}},{"title":"job_posting_keyword_detection","type":"object","required":["name","type","parameters"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["job_posting_keyword_detection"],"description":"The agent type."},"parameters":{"type":"object","required":["tracking_keywords"],"properties":{"tracking_keywords":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Keywords Sillage looks for in the job title and description of the postings your target accounts publish. Minimum 1 required. Pass the roles you want to hear about (for example \"Platform Engineer\") to be notified when a target account starts hiring for them."}}}}},{"title":"keyword_post_search","type":"object","required":["name","type","parameters"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["keyword_post_search"],"description":"The agent type."},"parameters":{"type":"object","required":["tracking_keywords"],"properties":{"tracking_keywords":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Keywords Sillage monitors on LinkedIn via a broad search, not scoped to top accounts. Minimum 1 required."},"start_date":{"type":"string","description":"ISO 8601 date — scrape only posts published after this date."}}},"schedule":{"type":"object","nullable":true,"required":["cadence"],"properties":{"cadence":{"type":"string","enum":["weekly"]}},"description":"Turn the agent's recurring weekly run on ({ \"cadence\": \"weekly\" }) or off (null). Only accepted on an agent whose response carries `schedulable: true` — sending it on a non-schedulable agent, or with a `cadence` other than \"weekly\", returns 422."}}},{"title":"job_update","type":"object","required":["name","type"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["job_update"],"description":"The agent type."}}},{"title":"job_posting_keyword_detection","type":"object","required":["name","type","parameters"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["job_posting_keyword_detection"],"description":"The agent type."},"parameters":{"type":"object","required":["tracking_keywords"],"properties":{"tracking_keywords":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Keywords Sillage looks for in the job postings your tracked companies publish (title and description). Minimum 1 required."}}}}},{"title":"competitor","type":"object","required":["name","type"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["competitor"]},"watchlist_id":{"type":"integer","description":"Optional. Bind to an existing competitor watchlist instead of creating a new one. The list type must equal \"competitor\" or the request returns 422."},"parameters":{"type":"object","description":"Optional configuration for this competitor agent.","properties":{"mode":{"type":"string","enum":["lead_discovery","account_monitoring","all"],"description":"What this agent does: `lead_discovery` watches the competitor's team on LinkedIn from both directions — the people they comment on or react to, wherever those people work, and the people who comment on or react to the competitor team's own posts; `account_monitoring` (default) only detects interactions between the competitor and your own top accounts, in both directions, no scraping; `all` does both. Defaults to `account_monitoring` when omitted."},"target_group":{"type":"string","enum":["prospects","customers","all"],"description":"Who counts as a lead: your `prospects`, your `customers`, or `all` of them. Defaults to `all` when omitted."}}},"schedule":{"type":"object","nullable":true,"required":["cadence"],"properties":{"cadence":{"type":"string","enum":["weekly"]}},"description":"Turn the weekly schedule on or off. Only accepted when `parameters.mode` (after this request) is `lead_discovery` or `all` — sent with `mode` left at (or defaulting to) `account_monitoring`, this returns 422."}}},{"title":"partner","type":"object","required":["name","type"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["partner"]},"watchlist_id":{"type":"integer","description":"Optional. Bind to an existing partner watchlist instead of creating a new one. The list type must equal \"partner\" or the request returns 422."}}},{"title":"customer","type":"object","required":["name","type"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["customer"]},"watchlist_id":{"type":"integer","description":"Optional. Bind to an existing customer watchlist instead of creating a new one. The list type must equal \"customer\" or the request returns 422."}}},{"title":"influencer","type":"object","required":["name","type"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["influencer"]},"watchlist_id":{"type":"integer","description":"Optional. Bind to an existing influencer watchlist instead of creating a new one. The list type must equal \"influencer\" or the request returns 422."}}},{"title":"champion","type":"object","required":["name","type"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["champion"]},"watchlist_id":{"type":"integer","description":"Optional. Bind to an existing champion watchlist instead of creating a new one. The list type must equal \"champion\" or the request returns 422."}}},{"title":"champion_tracking","type":"object","required":["name","type"],"properties":{"name":{"type":"string","minLength":1,"maxLength":100,"description":"Display name of the agent."},"type":{"type":"string","enum":["champion_tracking"]},"watchlist_id":{"type":"integer","description":"Optional. Bind to an existing champion watchlist instead of creating a new one. The list type must equal \"champion\" or the request returns 422."}}}]}}}},"responses":{"201":{"description":"Agent created.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/AgentSetup"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"description":"Invalid request body — unsupported `type`, missing `tracking_keywords` for `keyword_detection` or `keyword_post_search`, or `watchlist_id` references a list whose type does not match the expected watchlist type for the chosen agent type. Also returned when `schedule.cadence` is anything other than `\"weekly\"`, or when `schedule` is sent on a competitor agent whose `parameters.mode` (after this request) is not `lead_discovery` or `all` — no schedule is created in that case."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"get":{"tags":["V2 Partner Setup"],"deprecated":true,"summary":"List agents","description":"Replaced by `/v3/partner/workspaces/{partner_workspace_id}/signal-setups`: this endpoint stops answering on 1 April 2027.\n\nReturns a paginated list of active agents for the workspace.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"description":"Page number (starts at 1). Defaults to 1."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":25,"default":10},"description":"Number of agents per page. Defaults to 10, max 25."}],"responses":{"200":{"description":"Paginated list of agents.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AgentSetup"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"description":"Invalid `page` or `page_size` query parameter."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/agents/{agent_id}":{"get":{"tags":["V2 Partner Setup"],"deprecated":true,"summary":"Get agent","description":"Replaced by `/v3/partner/workspaces/{partner_workspace_id}/signal-setups`: this endpoint stops answering on 1 April 2027.\n\nReturns a single agent by its numeric id, scoped to the workspace.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifier of the agent."}],"responses":{"200":{"description":"Agent found.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/AgentSetup"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"Invalid `agent_id`, must be a positive integer."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"put":{"tags":["V2 Partner Setup"],"deprecated":true,"summary":"Update agent","description":"Replaced by `/v3/partner/workspaces/{partner_workspace_id}/signal-setups`: this endpoint stops answering on 1 April 2027.\n\nPartially updates an agent. All fields are optional, send only the ones to change.\n\nChanging `parameters` updates the keyword configuration for the agent.\nChanging only `name` or `enabled` leaves the keyword configuration unchanged.\n\n`parameters` takes either `tracking_keywords` (with an optional `start_date`) or\nthe competitor fields `mode` and/or `target_group`, never mixed with the keyword\nfields. Both apply to competitor agents only: `mode` changes what the agent does,\n`target_group` narrows who counts as a lead — send either or both together,\nwithout touching the rest of its configuration.\n\n`schedule` is top-level, not inside `parameters`: send `{ \"cadence\": \"weekly\" }`\nto turn the agent's recurring weekly run on, or `null` to turn it off. Only\naccepted when the agent (after this request) has a billed branch to schedule —\ncheck `schedulable` on a GET first.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifier of the agent."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","minProperties":1,"properties":{"name":{"type":"string","minLength":1,"maxLength":100},"enabled":{"type":"boolean","description":"Enable or disable the agent."},"parameters":{"type":"object","minProperties":1,"properties":{"tracking_keywords":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Keywords Sillage monitors on LinkedIn. Minimum 1 required."},"start_date":{"type":"string","description":"ISO 8601 date, scrape only posts published after this date."},"mode":{"type":"string","enum":["lead_discovery","account_monitoring","all"],"description":"Competitor agents only. What the agent does: `lead_discovery` watches the competitor's team on LinkedIn from both directions — the people they comment on or react to, wherever those people work, and the people who comment on or react to the competitor team's own posts; `account_monitoring` only detects interactions between the competitor and the workspace's own top accounts, in both directions, with no scraping; `all` does both. Send it on its own, without `tracking_keywords` or `start_date`. Sending it for any other agent type returns 422."},"target_group":{"type":"string","enum":["prospects","customers","all"],"description":"Who counts as a lead: your `prospects`, your `customers`, or `all` of them. Send it on its own or together with `mode`, never with `tracking_keywords`/`start_date`."}}},"watchlist_kind":{"type":"string","enum":["company","profile"],"nullable":true,"description":"Optional. Kind of the watchlist to bind. Derived from the agent type when omitted alongside watchlist_id. Providing a kind that contradicts the agent type returns 422. Null (alongside null watchlist_id) to unbind."},"watchlist_id":{"type":"integer","nullable":true,"description":"Bind the agent to a watchlist. watchlist_kind is optional — the kind is derived from the agent type when omitted. Null (both fields null) to unbind."},"schedule":{"type":"object","nullable":true,"required":["cadence"],"properties":{"cadence":{"type":"string","enum":["weekly"]}},"description":"Turn the agent's recurring weekly run on ({ \"cadence\": \"weekly\" }) or off (null). Only accepted on an agent whose response carries `schedulable: true` — sending it on a non-schedulable agent, or with a `cadence` other than \"weekly\", returns 422."}}}}}},"responses":{"200":{"description":"Agent updated.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/AgentSetup"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"Invalid request body or `agent_id`, empty body, `tracking_keywords` below minimum, `parameters` carrying `tracking_keywords`/`start_date` together with `mode`/`target_group`, `mode` or `target_group` on an agent that is not a competitor, `schedule.cadence` other than `\"weekly\"`, a `schedule` write on an agent whose `schedulable` (after this request) is `false` — no schedule is created or changed in that case — or `enabled: false` combined with a non-null `schedule` in the same request."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["V2 Partner Setup"],"deprecated":true,"summary":"Delete agent","description":"Replaced by `/v3/partner/workspaces/{partner_workspace_id}/signal-setups`: this endpoint stops answering on 1 April 2027.\n\nRemoves an agent. The agent is disabled and no longer returned by the list or get endpoints.\n\nSignal data linked to the agent is preserved.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"agent_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Identifier of the agent."}],"responses":{"200":{"description":"Agent deleted.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"Identifier of the deleted agent."}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/PaymentRequired"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"Invalid `agent_id`, must be a positive integer."},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/contents/query":{"post":{"tags":["V2 Contents"],"summary":"Query workspace contents","description":"Returns paginated signal content items for the partner workspace. Filters are passed as a JSON body.\n\nAuthenticate with a `mk_live_` master key.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2ContentsQueryBody"}}}},"responses":{"200":{"description":"Paginated list of contents","headers":{"X-Request-Id":{"description":"Unique identifier for this request","schema":{"type":"string","format":"uuid"}},"X-Response-Time":{"description":"Total server processing time","schema":{"type":"string","example":"35ms"}},"X-Total-Count":{"description":"Total number of items matching the query","schema":{"type":"integer","example":150}},"X-Page":{"description":"Current page number","schema":{"type":"integer","example":1}},"X-Page-Size":{"description":"Number of items per page","schema":{"type":"integer","example":25}},"X-Page-Count":{"description":"Total number of pages","schema":{"type":"integer","example":6}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2ContentsPaginatedResponse"}}}},"400":{"description":"Bad request, invalid request body."},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/contents/{id}":{"get":{"tags":["V2 Contents"],"summary":"Get a content item","description":"Returns a single signal content item by its numeric id.\n\n**Important:** the `id` path parameter is environment-specific (prod only).","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"description":"Numeric id of the content item. Environment-specific, prod only, not portable across environments.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Content item","headers":{"X-Request-Id":{"description":"Unique identifier for this request","schema":{"type":"string","format":"uuid"}},"X-Response-Time":{"description":"Total server processing time","schema":{"type":"string","example":"20ms"}}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/V2ContentItem"}}}}}},"400":{"description":"Bad request, invalid path parameters."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/content-requests":{"get":{"tags":["V2 Content Requests"],"summary":"List workspace content requests","description":"Returns paginated content requests for the partner workspace.\n\nAuthenticate with a `mk_live_` master key.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"page","in":"query","description":"Page number (starts at 1). Defaults to 1.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Number of items per page. Defaults to 25. Maximum: 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"date_from","in":"query","description":"Filter by creation date on or after this date (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"date_to","in":"query","description":"Filter by creation date on or before this date (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"type","in":"query","description":"Filter by request type.","schema":{"type":"string","enum":["account_mapping","top_account_content"]}},{"name":"stage[]","in":"query","description":"Filter by stage. Repeatable. Defaults to all stages except `completed`.","style":"form","explode":true,"schema":{"type":"array","items":{"type":"string","enum":["account_mapping_ready","account_mapping_in_progress","account_mapping_ingestion_ready","account_mapping_ingestion_in_progress","account_mapping_failed","completed","top_account_content_scraping_ready","top_account_content_scraping_starting","top_account_content_scraping_in_progress","top_account_content_failed"]}}},{"name":"company_id","in":"query","description":"Filter by the company's ID in Sillage.","schema":{"type":"integer","minimum":1}},{"name":"person_id","in":"query","description":"Filter by author profile numeric id. Environment-specific, prod only.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Paginated list of content requests","headers":{"X-Request-Id":{"description":"Unique identifier for this request","schema":{"type":"string","format":"uuid"}},"X-Response-Time":{"description":"Total server processing time","schema":{"type":"string","example":"35ms"}},"X-Total-Count":{"description":"Total number of items matching the query","schema":{"type":"integer","example":42}},"X-Page":{"description":"Current page number","schema":{"type":"integer","example":1}},"X-Page-Size":{"description":"Number of items per page","schema":{"type":"integer","example":25}},"X-Page-Count":{"description":"Total number of pages","schema":{"type":"integer","example":2}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2ContentRequestsPaginatedResponse"}}}},"400":{"description":"Bad request, invalid query parameters."},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/content-requests/{id}":{"get":{"tags":["V2 Content Requests"],"summary":"Get a content request","description":"Returns a single content request by its numeric id.\n\n**Important:** the `id` path parameter is environment-specific (prod only).","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"description":"Numeric id of the content request. Environment-specific, prod only, not portable across environments.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Content request item","headers":{"X-Request-Id":{"description":"Unique identifier for this request","schema":{"type":"string","format":"uuid"}},"X-Response-Time":{"description":"Total server processing time","schema":{"type":"string","example":"20ms"}}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/V2ContentRequestItem"}}}}}},"400":{"description":"Bad request, invalid path parameters."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/enrich-company-mapping":{"post":{"tags":["V2 Partner Setup"],"summary":"Enrich company mapping","description":"Resolves a company by domain, LinkedIn URL, or LinkedIn handle, then enriches the workspace company mapping asynchronously.\n\nReturns `202 Accepted` immediately. The enrichment runs in the background.\n\nProvide exactly one of `domain`, `linkedin_url`, or `linkedin_handle`.\n\nIf a recent enrichment already exists for the same company and workspace, the response reflects the existing request rather than creating a duplicate.\n\nA workspace can define several personas (ideal customer profile targeting criteria), each with its own locations and job titles. By default this call enriches the personas linked to the lists this company belongs to (every active persona when none of those lists names one, or when the company is on no list). Pass `persona_ids` to enrich specific personas instead — they run even if the company is not on their lists. Either way, the response `launches` array reports one entry per persona considered: `launched` (a new request was created and charged, unless it is a relaunch), `already_requested` (already enriched today for this company, at no extra cost), or skipped because the persona is missing a location or job titles (`skipped_no_location`, `skipped_no_job_titles`). Returns `422` if none of the workspace's personas can be mapped, or if `persona_ids` names an id that is not one of the workspace's active personas.\n\nPass `relaunch: true` to run the mapping again for an account you already monitor, at no credit cost. A relaunch covers one persona: pass a single id in `persona_ids` (several ids returns `400`), or omit it when your workspace has only one persona. The account must be monitored for that persona, otherwise the call returns `409`. Sillage picks the method and reports it in `launches[].relaunch_method`: `quick_search` looks the account's people up directly, and `full_mapping` runs a complete new mapping once that search has already been run for this persona. A `full_mapping` relaunch can run once every 24 hours for the same account and persona, otherwise the call returns `429`.\n\n**Usage:** this request is metered under the `account_mapping_launch` product — one credit per persona actually launched, refused as a whole if the balance cannot cover every persona — plus one `content_profile` unit for each employee profile whose content is analyzed as enrichment continues. Track consumption with `GET /v2/partner/usage`.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"title":"Resolve by domain","type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Company website domain (e.g. `acme.com`)","example":"acme.com"},"persona_ids":{"$ref":"#/components/schemas/EnrichPersonaIds"},"relaunch":{"$ref":"#/components/schemas/EnrichRelaunch"}}},{"title":"Resolve by LinkedIn URL","type":"object","required":["linkedin_url"],"properties":{"linkedin_url":{"type":"string","description":"LinkedIn company URL","example":"https://www.linkedin.com/company/acme"},"persona_ids":{"$ref":"#/components/schemas/EnrichPersonaIds"},"relaunch":{"$ref":"#/components/schemas/EnrichRelaunch"}}},{"title":"Resolve by LinkedIn handle","type":"object","required":["linkedin_handle"],"properties":{"linkedin_handle":{"type":"string","description":"LinkedIn company handle/slug (e.g. `acme`, the part after /company/)","example":"acme"},"persona_ids":{"$ref":"#/components/schemas/EnrichPersonaIds"},"relaunch":{"$ref":"#/components/schemas/EnrichRelaunch"}}}]}}}},"responses":{"202":{"description":"Enrichment accepted.","content":{"application/json":{"schema":{"type":"object","required":["status","request_id","stage","launches"],"properties":{"status":{"type":"string","enum":["accepted"]},"request_id":{"type":"integer","deprecated":true,"description":"Numeric id of the first launched (or, if none launched, first considered) persona's enrichment content request. Deprecated in favor of `launches[].request_id`, which reports every persona individually."},"stage":{"type":"string","enum":["account_mapping_in_progress"],"description":"Processing stage of the enrichment request."},"launches":{"type":"array","description":"One entry per persona this call considered for the workspace.","items":{"$ref":"#/components/schemas/PersonaLaunch"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"Unprocessable entity. Either none of the workspace's personas can be mapped for this company (the `launches` array reports each persona and why), or `persona_ids` names an id that is not one of the workspace's active personas.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/PersonaLaunchProblemDetails"},{"$ref":"#/components/schemas/ProblemDetails"}]},"examples":{"noPersonaLaunchable":{"summary":"No persona can be mapped","value":{"type":"https://docs.getsillage.com/errors/no-persona-launchable","title":"No persona can be mapped","status":422,"detail":"No persona in this workspace can be mapped — add a persona, or complete an existing persona location and job titles, then try again.","launches":[{"persona_id":501,"request_id":null,"status":"skipped_no_location","credits":0}]}},"invalidPersonaIds":{"summary":"persona_ids names an unknown persona","value":{"type":"https://docs.getsillage.com/errors/unprocessable-entity","title":"Unprocessable Entity","status":422,"detail":"persona_ids includes an id that is not one of the workspace’s active personas.","errors":{"persona_ids":["Unknown persona id: 999"]}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/company-mappings":{"get":{"tags":["V2 Partner Setup"],"summary":"List company mappings","description":"Returns a paginated list of company mappings for the partner workspace.\n\nProfiles are not included in this response. Use `GET .../company-mappings/{mapping_id}` to retrieve a mapping with its enriched employee profiles.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"page","in":"query","description":"Page number (starts at 1). Defaults to 1.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"page_size","in":"query","description":"Number of items per page. Defaults to 25. Maximum: 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"Paginated list of company mappings.","headers":{"X-Total-Count":{"description":"Total number of mappings matching the query.","schema":{"type":"integer"}},"X-Page":{"description":"Current page number.","schema":{"type":"integer"}},"X-Page-Size":{"description":"Number of items per page.","schema":{"type":"integer"}},"X-Page-Count":{"description":"Total number of pages.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"type":"object","required":["id"],"properties":{"id":{"type":"integer","description":"Numeric id of the company mapping."},"request_date":{"type":"string","format":"date-time","nullable":true,"description":"When the mapping was materialized."},"version":{"type":"integer","nullable":true,"description":"Mapping version (incremented on re-materialization)."},"company":{"type":"object","nullable":true,"required":["id"],"properties":{"id":{"type":"integer","description":"Numeric id of the company."},"name":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true}}},"persona_id":{"type":"integer","nullable":true,"description":"Numeric id of the persona this mapping is attributed to. Null means the mapping applies to every persona (not attributed to one business line)."}}}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/company-mappings/{mapping_id}":{"get":{"tags":["V2 Partner Setup"],"summary":"Get a company mapping with profiles","description":"Returns a single company mapping for the partner workspace, including all enriched employee profiles.\n\nUse the `mapping_id` path parameter, this is the mapping `id` returned as the top-level `id` of each item by the list endpoint.\n\nThe `mapping_id` is a numeric id. Environment-specific, prod only, not portable across environments.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"mapping_id","in":"path","required":true,"description":"The mapping's numeric id (the integer returned as the list item's top-level `id`; not portable across environments, prod only).","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Company mapping with enriched profiles.","content":{"application/json":{"schema":{"type":"object","required":["id","profiles"],"properties":{"id":{"type":"integer","description":"Numeric id of the company mapping."},"request_date":{"type":"string","format":"date-time","nullable":true,"description":"When the mapping was materialized."},"version":{"type":"integer","nullable":true,"description":"Mapping version."},"company":{"type":"object","nullable":true,"required":["id"],"properties":{"id":{"type":"integer","description":"Numeric id of the company."},"name":{"type":"string","nullable":true},"domain":{"type":"string","nullable":true}}},"persona_id":{"type":"integer","nullable":true,"description":"Numeric id of the persona this mapping is attributed to. Null means the mapping applies to every persona (not attributed to one business line)."},"profiles":{"type":"array","description":"Enriched employee profiles for this company.","items":{"type":"object","required":["id"],"properties":{"id":{"type":"integer"},"linkedin_handle":{"type":"string","nullable":true},"linkedin_url":{"type":"string","nullable":true},"avatar_url":{"type":"string","nullable":true},"linkedin_about":{"type":"string","nullable":true},"position":{"type":"string","nullable":true},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"phone_number":{"type":"string","nullable":true},"linkedin_headline":{"type":"string","nullable":true},"location":{"type":"object","nullable":true,"properties":{"city":{"type":"string","nullable":true},"region":{"type":"string","nullable":true},"country":{"type":"string","nullable":true}}}}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/companies/{id}":{"get":{"tags":["V2 Companies"],"summary":"Get a company","description":"Returns the enrichment data for a company in the partner workspace.\n\nThe `id` path parameter is a numeric identifier. Pass the `company_id` returned by other v2 endpoints.\n\nIf the company has not been enriched yet, the enrichment fields are returned as `null` — this endpoint never triggers enrichment.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"description":"The company's numeric id. Environment-specific, prod only, not portable across environments.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Company enrichment data","headers":{"X-Request-Id":{"description":"Unique identifier for this request","schema":{"type":"string","format":"uuid"}},"X-Response-Time":{"description":"Total server processing time","schema":{"type":"string","example":"20ms"}}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/V2CompanyDetail"}}}}}},"400":{"description":"Bad request, invalid path parameters."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/leads/{id}":{"get":{"tags":["V2 Leads"],"summary":"Get a lead","description":"Returns a lead in the partner workspace, with its linked profile details and a reference to its current company.\n\nThe `id` path parameter is a numeric identifier. Pass the `lead_id` returned by other v2 endpoints, such as the signals endpoints.\n\nA lead with no linked profile is returned with the profile fields set to `null`. When the current company cannot be resolved, the `company` field is `null`. Neither case is an error.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"id","in":"path","required":true,"description":"The lead's numeric id. Always use the `lead_id` returned by the signals endpoints — don't guess, hard-code, or copy an id from an example or another workspace.","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"Lead data","headers":{"X-Request-Id":{"description":"Unique identifier for this request","schema":{"type":"string","format":"uuid"}},"X-Response-Time":{"description":"Total server processing time","schema":{"type":"string","example":"20ms"}}},"content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/V2LeadDetail"}}}}}},"400":{"description":"Bad request, invalid path parameters."},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/lists":{"post":{"tags":["Lists"],"summary":"Create list","description":"Creates a reusable, workspace-scoped list of companies or people. Whether it holds companies or people is derived from the immutable `type`.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","name"],"properties":{"type":{"type":"string","enum":["competitor","partner","customer","prospect","influencer","champion"],"description":"Immutable; determines whether the list holds companies or people."},"name":{"type":"string","minLength":1},"description":{"type":"string"},"default_tracking_status":{"type":"string","enum":["followed","unfollowed"],"description":"What happens to a member of this list by default. Defaults to `followed` when omitted."},"persona_ids":{"type":"array","items":{"type":"integer"},"description":"The personas this list belongs to. Omit, or send an empty array, to create a list that applies to every persona."}}}}}},"responses":{"201":{"description":"The created list.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ListItem"}}}}}},"400":{"description":"Invalid request."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"get":{"tags":["Lists"],"summary":"List lists","description":"Returns a paginated list of the workspace's lists. The total is in `meta.pagination`.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"description":"Page number (starts at 1). Defaults to 1."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Items per page. Defaults to 25, max 100."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["competitor","partner","customer","prospect","influencer","champion"]},"description":"Filter by list type."},{"name":"persona_id","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter to one persona. Returns the lists that belong to it, plus every list that belongs to no persona. Omit to get every list in the workspace. This id is specific to your environment."},{"name":"response_format","in":"query","required":false,"schema":{"type":"string","enum":["concise","normalized","detailed"],"default":"normalized"},"description":"Verbosity: `concise` (id/kind/type/name only), `normalized` (default, adds description, counts and the list defaults), `detailed` (identical to normalized; lists carry no heavy payload)."}],"responses":{"200":{"description":"Paginated lists.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ListItem"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"400":{"description":"Invalid request."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/lists/{kind}/{list_id}":{"get":{"tags":["Lists"],"summary":"Get list","description":"Fetches one list by its numeric id.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"Whether the list holds companies or people, matching its `type`. Part of the path so the two id spaces never collide."},{"name":"list_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the list. This ID is specific to your environment."},{"name":"response_format","in":"query","required":false,"schema":{"type":"string","enum":["concise","normalized","detailed"],"default":"normalized"},"description":"Verbosity: `concise` (id/kind/type/name only), `normalized` (default, adds description, counts and the list defaults), `detailed` (identical to normalized; lists carry no heavy payload)."}],"responses":{"200":{"description":"The list.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ListItem"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"put":{"tags":["Lists"],"summary":"Update list","description":"Updates a list's name, description or default tracking status. The `type` is immutable.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"Whether the list holds companies or people, matching its `type`. Part of the path so the two id spaces never collide."},{"name":"list_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the list. This ID is specific to your environment."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"`type` is immutable and is ignored if provided.","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string","nullable":true,"description":"Pass null to clear."},"default_tracking_status":{"type":"string","enum":["followed","unfollowed"],"description":"Changes the list default. Members that carry their own tracking status keep it."},"persona_ids":{"type":"array","items":{"type":"integer"},"description":"Replaces the full set of personas this list belongs to. Omit to leave them untouched; send an empty array to make the list apply to every persona."}}}}}},"responses":{"200":{"description":"The updated list.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ListItem"}}}}}},"400":{"description":"Invalid request."},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["Lists"],"summary":"Delete list","description":"Deletes a list. Fails with 409 if one or more agents still read it.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"Whether the list holds companies or people, matching its `type`. Part of the path so the two id spaces never collide."},{"name":"list_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the list. This ID is specific to your environment."}],"responses":{"200":{"description":"The deleted list id.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id"],"properties":{"id":{"type":"integer"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"One or more agents still read this list; unbind them first."},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/lists/{kind}/{list_id}/members":{"get":{"tags":["Lists"],"summary":"List members","description":"Returns a paginated list of the list's members, each with its own tracking status and signal bucket (null when it follows the list default).","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"Whether the list holds companies or people, matching its `type`. Part of the path so the two id spaces never collide."},{"name":"list_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the list. This ID is specific to your environment."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"description":"Page number (starts at 1). Defaults to 1."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Items per page. Defaults to 25, max 100."},{"name":"response_format","in":"query","required":false,"schema":{"type":"string","enum":["concise","normalized","detailed"],"default":"normalized"},"description":"Verbosity: `concise` (id/kind/type/name only), `normalized` (default, adds description, counts and the list defaults), `detailed` (identical to normalized; lists carry no heavy payload)."},{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":255},"description":"Search members by name, LinkedIn handle, or (for people) current company name. Case-insensitive, matches anywhere in the text."}],"responses":{"200":{"description":"Paginated members.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ListMember"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"tags":["Lists"],"summary":"Add members","description":"Adds companies or people to a list. Identify each member by LinkedIn URL or handle (preferred). For company lists only, a `domain` is accepted as a fallback when no LinkedIn identifier is available.\n\nThe call is **partial-success**: members that were successfully added appear in `data`; per-member failures appear in `errors`. A **200** response means the request was accepted, inspect `errors` to check for any per-member failures. Re-adding members that are already on the list is safe and returns **200** with an empty `data` array. If **no** member could be added because every one failed, the response is **422** with `data: []` and `errors` populated.\n\nA member that cannot be added (a `domain` on a list of people, a LinkedIn URL of the other kind, or a value that is not a usable identifier) is reported in `errors` and never blocks the other members.\n\nOn champion lists, each member can also carry `company`, the company where you know this contact, so we can detect if they change jobs. Providing `company` on any other list returns a hard **422**.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"Whether the list holds companies or people, matching its `type`. Part of the path so the two id spaces never collide."},{"name":"list_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the list. This ID is specific to your environment."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["members"],"properties":{"members":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","description":"Identify the member by linkedin_url or linkedin_handle (preferred). For company lists only, domain is accepted as a fallback when no LinkedIn identifier is available.","properties":{"linkedin_url":{"type":"string","description":"LinkedIn URL of the company or person. The `https://` is optional (\"linkedin.com/company/stripe\" works)."},"linkedin_handle":{"type":"string"},"domain":{"type":"string","description":"Company domain (e.g. \"stripe.com\"). Accepted as a fallback for company lists only when no LinkedIn URL or handle is available. Providing a domain on a list of people, or a value without an extension such as \".com\", is reported in `errors` and does not block the other members."},"company":{"type":"object","description":"Champion lists only. The company where you know this contact, so a job change can be detected. At least one of name or domain.","properties":{"name":{"type":"string"},"domain":{"type":"string"}},"anyOf":[{"required":["name"]},{"required":["domain"]}]}},"anyOf":[{"required":["linkedin_url"]},{"required":["linkedin_handle"]},{"required":["domain"]}]}}}}}}},"responses":{"200":{"description":"Request accepted. `data` contains any newly-added members (empty if all were already on the list); `errors` lists any per-member failures.","content":{"application/json":{"schema":{"type":"object","required":["data","errors"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ListMember"}},"errors":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistEntityAddError"},"description":"Per-member failures. Empty when every member was added successfully."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"No member could be added because every one failed (see `errors`), or the request body is invalid. Re-adding already-present members returns 200, not 422.","content":{"application/json":{"schema":{"type":"object","required":["data","errors"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ListMember"},"maxItems":0},"errors":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistEntityAddError"}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/lists/{kind}/{list_id}/members/{member_id}":{"delete":{"tags":["Lists"],"summary":"Remove member","description":"Removes one member from a list by its member id.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"Whether the list holds companies or people, matching its `type`. Part of the path so the two id spaces never collide."},{"name":"list_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the list. This ID is specific to your environment."},{"name":"member_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the member (the `id` returned by the members endpoint)."}],"responses":{"200":{"description":"The removed member id.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id","deleted"],"properties":{"id":{"type":"integer"},"deleted":{"type":"boolean"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/watchlists":{"post":{"tags":["Watchlists"],"deprecated":true,"summary":"Create watchlist","description":"Creates a reusable, workspace-scoped watchlist. `kind` is derived from the immutable `type`.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type","title"],"properties":{"type":{"type":"string","enum":["competitor","partner","customer","influencer","champion"],"description":"Immutable; determines the list kind."},"title":{"type":"string","minLength":1},"description":{"type":"string"}}}}}},"responses":{"201":{"description":"The created watchlist.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WatchlistItem"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"get":{"tags":["Watchlists"],"deprecated":true,"summary":"List watchlists","description":"Returns a paginated list of the workspace's watchlists. The total is in `meta.pagination`.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"description":"Page number (starts at 1). Defaults to 1."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Items per page. Defaults to 25, max 100."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["competitor","partner","customer","influencer","champion"]},"description":"Optional filter by list type."},{"name":"persona_id","in":"query","required":false,"schema":{"type":"integer"},"description":"Filter to one persona (business unit). Returns the lists attached to it, plus every list attached to no persona. Omit to get every list in the workspace. An unknown or archived `persona_id` returns 422. This id is specific to your environment."},{"name":"response_format","in":"query","required":false,"schema":{"type":"string","enum":["concise","normalized","detailed"],"default":"normalized"},"description":"Verbosity: `concise` (id/kind/type/title only), `normalized` (default, adds description + counts), `detailed` (identical to normalized)."}],"responses":{"200":{"description":"Paginated watchlists.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistItem"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/watchlists/{kind}/{watchlist_id}":{"get":{"tags":["Watchlists"],"deprecated":true,"summary":"Get watchlist","description":"Fetches one watchlist by its numeric id.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"The watchlist kind (company or profile), matching the list `type`. Part of the path so the company and profile id spaces never collide."},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the watchlist. This ID is specific to your environment."},{"name":"response_format","in":"query","required":false,"schema":{"type":"string","enum":["concise","normalized","detailed"],"default":"normalized"},"description":"Verbosity: `concise` (id/kind/type/title only), `normalized` (default, adds description + counts), `detailed` (identical to normalized)."}],"responses":{"200":{"description":"The watchlist.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WatchlistItem"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"put":{"tags":["Watchlists"],"deprecated":true,"summary":"Update watchlist","description":"Updates the title and/or description. The list `type` is immutable.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"The watchlist kind (company or profile)."},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the watchlist. This ID is specific to your environment."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"`type` is immutable and is ignored if provided.","properties":{"title":{"type":"string","minLength":1},"description":{"type":"string","nullable":true,"description":"Pass null to clear."}}}}}},"responses":{"200":{"description":"The updated watchlist.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/WatchlistItem"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"delete":{"tags":["Watchlists"],"deprecated":true,"summary":"Delete watchlist","description":"Deletes a watchlist. Fails with 409 if one or more agents are still bound to it.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"The watchlist kind (company or profile)."},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the watchlist. This ID is specific to your environment."}],"responses":{"200":{"description":"The deleted watchlist id.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id"],"properties":{"id":{"type":"integer"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"description":"The watchlist is bound to one or more agents; unbind first."},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/watchlists/{kind}/{watchlist_id}/entities":{"get":{"tags":["Watchlists"],"deprecated":true,"summary":"List watchlist entities","description":"Returns a paginated list of the watchlist's members.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"The watchlist kind (company or profile)."},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the watchlist. This ID is specific to your environment."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"description":"Page number (starts at 1). Defaults to 1."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25},"description":"Items per page. Defaults to 25, max 100."},{"name":"response_format","in":"query","required":false,"schema":{"type":"string","enum":["concise","normalized","detailed"],"default":"normalized"},"description":"Verbosity of each member. Defaults to `normalized`."},{"name":"q","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":255},"description":"Search members by name, LinkedIn handle, or (for people) current company name. Case-insensitive, matches anywhere in the text."}],"responses":{"200":{"description":"Paginated members.","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistEntity"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/PaginationMeta"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}},"post":{"tags":["Watchlists"],"deprecated":true,"summary":"Add watchlist entities","description":"Adds members to a watchlist. Identify each entity by LinkedIn URL or handle (preferred). For company watchlists only, a `domain` is accepted as a fallback when no LinkedIn identifier is available.\n\nThe call is **partial-success**: members that were successfully added appear in `data`; per-entity failures appear in `errors`. A **200** response means the request was accepted, inspect `errors` to check for any per-entity failures. Re-adding members that are already present is safe and returns **200** with an empty `data` array. If **no** entities could be added because every one failed, the response is **422** with `data: []` and `errors` populated.\n\nProviding a `domain` on a profile watchlist returns a hard **422**.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"The watchlist kind (company or profile)."},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the watchlist. This ID is specific to your environment."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["entities"],"properties":{"entities":{"type":"array","minItems":1,"maxItems":100,"items":{"type":"object","description":"Identify the entity by linkedin_url or linkedin_handle (preferred). For company watchlists only, domain is accepted as a fallback when no LinkedIn identifier is available.","properties":{"linkedin_url":{"type":"string"},"linkedin_handle":{"type":"string"},"domain":{"type":"string","description":"Company domain (e.g. \"stripe.com\"). Accepted as a fallback for company watchlists only when no LinkedIn URL or handle is available. Providing a domain on a profile watchlist returns 422."}},"anyOf":[{"required":["linkedin_url"]},{"required":["linkedin_handle"]},{"required":["domain"]}]}}}}}}},"responses":{"200":{"description":"Request accepted. `data` contains any newly-added members (empty if all were already present); `errors` lists any per-entity failures.","content":{"application/json":{"schema":{"type":"object","required":["data","errors"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistEntity"}},"errors":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistEntityAddError"},"description":"Per-entity failures. Empty when all entities were added successfully."}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"No entities could be added because every one failed (see `errors` for details), the request body is invalid, or `domain` was provided on a profile watchlist. Re-adding already-present members returns 200, not 422.","content":{"application/json":{"schema":{"type":"object","required":["data","errors"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistEntity"},"maxItems":0},"errors":{"type":"array","items":{"$ref":"#/components/schemas/WatchlistEntityAddError"}}}}}}},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}},"/v2/partner/workspaces/{partner_workspace_id}/watchlists/{kind}/{watchlist_id}/entities/{entity_id}":{"delete":{"tags":["Watchlists"],"deprecated":true,"summary":"Remove watchlist entity","description":"Removes one member from a watchlist by its entity id.","security":[{"MasterKeyAuth":[]}],"parameters":[{"$ref":"#/components/parameters/PartnerWorkspaceId"},{"name":"kind","in":"path","required":true,"schema":{"type":"string","enum":["company","profile"]},"description":"The watchlist kind (company or profile)."},{"name":"watchlist_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the watchlist. This ID is specific to your environment."},{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer"},"description":"Numeric id of the member (the `id` returned by the list-entities endpoint)."}],"responses":{"200":{"description":"Removal result.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"object","required":["id"],"properties":{"id":{"type":"integer"}}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}}}