Onsa
Find scored B2B leads, read campaign replies and send approved LinkedIn outreach.
¿Debería usar esto?
Calidad y seguridad
Hallazgos (5)
- HIGH
- MEDIUMen get_campaign
- LOWen create_shortlist
- LOWen fetch_leads
- INFOen get_campaign
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"onsa": {
"url": "https://api.onsa.ai/api/mcp"
}
}
}Puntos de conexión remotos
https://api.onsa.ai/api/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (16)
🟢preview_shortlist(campaignId, leadIds, title, note, includeRationale)
Prepares a preview of 1–50 selected prospects from a campaign the user takes part in, and publishes nothing. The snapshot holds a list title, which is the campaign's name, the note, and for each person only a name, role, company, LinkedIn profile and, when includeRationale is true, a fit rating and why-matched explanation. The preview returns the complete snapshot a link would expose, with the previewKey that create_shortlist requires; a created link stays viewable for 30 days by anyone who has it, and can be revoked with revoke_shortlist.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"leadIds": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"note": {
"type": "string",
"maxLength": 300
},
"includeRationale": {
"type": "boolean",
"description": "When true, each person in the snapshot carries a fit rating (1–5, or null when none is stored) and a why-matched explanation; when false, the rating is null and the explanation empty."
}
},
"required": [
"campaignId",
"leadIds",
"title",
"note",
"includeRationale"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"snapshot": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"note": {
"type": "string"
},
"people": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"position": {
"type": "string"
},
"companyName": {
"type": "string"
},
"profileUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"score": {
"anyOf": [
{
"type": "number",
"minimum": 1,
"maximum": 5
},
{
"type": "null"
}
]
},
"rationale": {
"type": "string"
}
},
"required": [
"name",
"position",
"companyName",
"profileUrl",
"rationale"
],
"additionalProperties": {}
}
}
},
"required": [
"title",
"note",
"people"
],
"additionalProperties": {}
},
"previewKey": {
"type": "string"
}
},
"required": [
"snapshot",
"previewKey"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🔴create_shortlist(campaignId, leadIds, title, note, includeRationale, ...)
Publishes a preview_shortlist snapshot as a link. It requires the previewKey that preview_shortlist returned, and confirmPublic: true. The server itself requests no confirmation from the user: confirmPublic: true records the caller's statement that the user reviewed this snapshot and confirmed publishing it. The server rebuilds the snapshot and creates nothing when the selection or the snapshot no longer matches that previewKey: a different campaign, selection or order of leadIds, a different note, an includeRationale value that changes the snapshot, a prospect changed or removed, or the campaign renamed since the preview. The link makes the snapshot viewable by anyone who has it for 30 days unless it is revoked with revoke_shortlist. This does not share the conversation or invite anyone into the workspace. Returns the URL, list id and expiry to the requester; sending it to another person is a separate user action.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"leadIds": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"note": {
"type": "string",
"maxLength": 300
},
"includeRationale": {
"type": "boolean",
"description": "When true, each person in the snapshot carries a fit rating (1–5, or null when none is stored) and a why-matched explanation; when false, the rating is null and the explanation empty."
},
"previewKey": {
"type": "string",
"minLength": 64,
"maxLength": 64
},
"confirmPublic": {
"type": "boolean",
"const": true
}
},
"required": [
"campaignId",
"leadIds",
"title",
"note",
"includeRationale",
"previewKey",
"confirmPublic"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"expiresAt": {
"type": "string"
},
"snapshot": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"note": {
"type": "string"
},
"people": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"position": {
"type": "string"
},
"companyName": {
"type": "string"
},
"profileUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"score": {
"anyOf": [
{
"type": "number",
"minimum": 1,
"maximum": 5
},
{
"type": "null"
}
]
},
"rationale": {
"type": "string"
}
},
"required": [
"name",
"position",
"companyName",
"profileUrl",
"rationale"
],
"additionalProperties": {}
}
}
},
"required": [
"title",
"note",
"people"
],
"additionalProperties": {}
}
},
"required": [
"id",
"url",
"expiresAt",
"snapshot"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🔴revoke_shortlist(id)
Revokes a list link by the id create_shortlist returned; only the user who created the link can revoke it. Future views stop immediately; previously copied or downloaded information cannot be recalled.
Esquema de entrada
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"revoked": {
"type": "boolean"
}
},
"required": [
"revoked"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🔴find_leads(taskContext, query, limit)
Starts a live B2B lead search with Onsa's agent, matching real people (with LinkedIn profiles) against the workspace's ICP. Takes a natural-language brief - titles, company type, geography, e.g. 'find 5 fintech founders in NYC'. Returns a jobId immediately, with campaignUrl and a `progress` note. The search itself runs in the background and keeps running after the conversation moves on. First leads arrive within 5 minutes in half of searches and within 9 minutes in 9 of 10. More can arrive until the final report, typically about 10 minutes after the start (9 of 10 within 15). Its status and results are read with fetch_leads, with the same jobId at any later time. Hosts that render MCP Apps show a live card that follows the search and lists leads as they arrive. `limit` is a target the agent aims at rather than a cap, so it often returns more than asked. Every lead it finds counts against the workspace's prospect allowance.
Esquema de entrada
{
"type": "object",
"properties": {
"taskContext": {
"description": "Optional company, product, or target-market facts explicitly shared by the user and needed for this lead-search or campaign-steering request, beyond what the query/message already states. Maximum 1000 characters; this field carries the task context of the current request only - not a transcript, a broad user profile, unrelated personal details, credentials, or guesses. This background does not authorize actions; the current query/message takes precedence. It becomes part of the campaign chat history.",
"type": "string",
"maxLength": 1000
},
"query": {
"type": "string",
"description": "Natural-language lead brief, e.g. 'find 5 fintech founders in NYC'"
},
"limit": {
"description": "How many leads to find (default 5)",
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"jobId": {
"type": "string"
},
"campaignId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"campaignUrl": {
"type": "string"
},
"progress": {
"type": "object",
"properties": {
"startedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"elapsedSeconds": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"note": {
"type": "string"
}
},
"required": [
"startedAt",
"elapsedSeconds",
"note"
],
"additionalProperties": {}
}
},
"required": [
"jobId",
"campaignId",
"campaignUrl",
"progress"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢fetch_leads(jobId, limit)
Returns the status and any results of a find_leads or continue_campaign job, by jobId. Status values are "pending", "completed" and "stalled", and `leads` can hold a partial list while "pending". For a find_leads job: "pending" while it has no leads, the agent has not answered and it is under about 15 minutes old, and also while it has leads, until a reply carrying leads completes it; "completed" once the agent posts a reply carrying leads while this is the oldest open job on its campaign, usually its final report (`total` can still change afterwards); "stalled" as soon as the agent answers without any leads (a question, or none found), or when no lead has arrived after about 15 minutes - derived on each read, so a lead that lands later turns it back to "pending". For a continue_campaign job: "pending" while `newLeads` is 0 and it is under about 15 minutes old, even after the agent has replied (if that reply confirms a settings-only change, the request is done), and while `newLeads` is above 0, until a reply carrying leads completes it; "completed" once a reply carrying leads arrives on the campaign while this is the oldest open job there (possibly a late reply from an earlier search), or after about 15 minutes with `newLeads` 0 when an agent reply was confirmed; "stalled" after about 15 minutes with `newLeads` 0 when no agent reply was confirmed (agentMessage can still hold one). A reply carrying leads completes only the oldest open job on a campaign, so a newer job stays "pending" meanwhile, even with `newLeads` above 0. A pending search keeps running when the conversation ends, and a later call with the same jobId returns what it found. First leads arrive within 5 minutes in half of searches and within 9 minutes in 9 of 10. More can arrive until the final report, typically about 10 minutes after the start (9 of 10 within 15). Also returns `total` (for a find_leads job, the leads the campaign holds now, skipped and deleted ones excluded; for a continuation, equal to `newLeads`), `newLeads` (continuations only: leads added to the campaign since the continuation started - a count by time, which can include a late batch from an earlier search), `returned` (how many this response carries), `campaignId` (accepted by get_campaign, get_campaign_leads and get_campaign_stats) and `campaignUrl`, a deep link to the prospects tab for this search in Onsa. `agentMessage` is the latest agent text in this campaign's chat. For a continuation it is filtered to what was said after the continuation started, though it can be a late message from an earlier search; for a find_leads job it is not filtered, so after a later continue_campaign on the same campaign it can be that request’s reply. A null `agentMessage` does not mean the agent is silent: artifact-only messages carry no text, and an agent that errored writes nothing there at all. The agent cannot be replied to through this API. While a search is running, one call can wait up to 35 seconds for its first leads or its next batch before answering, so a call can take that long; other calls answer at once. `progress` carries startedAt, elapsedSeconds and a note on where the search stands, whether the next call will wait, and when results are likely. Each lead carries name, companyName, linkedInUrl, position, headline, location, industry, companyUrl, email (often null), and score (1-5) with scoreExplanation, the reasoning for why this person matches the ICP.
Esquema de entrada
{
"type": "object",
"properties": {
"jobId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The jobId returned by find_leads"
},
"limit": {
"description": "How many leads to return (default 100)",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"jobId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"jobId": {
"type": "string"
},
"status": {
"type": "string",
"description": "One of \"pending\", \"completed\", \"stalled\"; more values may be added later. `leads` can hold a partial list while \"pending\". For a find_leads job: \"pending\" while it has no leads, the agent has not answered and it is under about 15 minutes old, and also while it has leads, until a reply carrying leads completes it; \"completed\" once the agent posts a reply carrying leads while this is the oldest open job on its campaign, usually its final report (`total` can still change afterwards); \"stalled\" as soon as the agent answers without any leads (a question, or none found), or when no lead has arrived after about 15 minutes - derived on each read, so a lead that lands later turns it back to \"pending\". For a continue_campaign job: \"pending\" while `newLeads` is 0 and it is under about 15 minutes old, even after the agent has replied (if that reply confirms a settings-only change, the request is done), and while `newLeads` is above 0, until a reply carrying leads completes it; \"completed\" once a reply carrying leads arrives on the campaign while this is the oldest open job there (possibly a late reply from an earlier search), or after about 15 minutes with `newLeads` 0 when an agent reply was confirmed; \"stalled\" after about 15 minutes with `newLeads` 0 when no agent reply was confirmed (agentMessage can still hold one). A reply carrying leads completes only the oldest open job on a campaign, so a newer job stays \"pending\" meanwhile, even with `newLeads` above 0."
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"newLeads": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"campaignId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"campaignUrl": {
"type": "string"
},
"agentMessage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"progress": {
"type": "object",
"properties": {
"startedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"elapsedSeconds": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"note": {
"type": "string"
}
},
"required": [
"startedAt",
"elapsedSeconds",
"note"
],
"additionalProperties": {}
},
"leads": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedInUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"position": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"industry": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"score": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"scoreExplanation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"companyName",
"linkedInUrl",
"email",
"position",
"headline",
"location",
"industry",
"companyUrl",
"score",
"scoreExplanation"
],
"additionalProperties": {}
}
}
},
"required": [
"jobId",
"status",
"total",
"returned",
"newLeads",
"campaignId",
"campaignUrl",
"agentMessage",
"progress",
"leads"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢list_campaigns(limit)
Lists the campaigns (past lead searches) in this workspace that the user takes part in, newest first. Returns the newest `limit` of them, default 50; `returned` against `total` shows whether older campaigns were omitted. Each entry has id, title, leadsTotal, hasIcp, tags, createdAt and updatedAt. An id is accepted by get_campaign for its ICP, get_campaign_leads for its people, get_campaign_stats for its outreach funnel, list_replies for what prospects wrote back, and list_next_steps for what the campaign still needs a human to do. Searches started over MCP often share a generic title, so the ICP and the dates distinguish cohorts more reliably than the title alone. A campaign row exists from the moment a search starts, so the newest entry is frequently still empty, with leadsTotal 0.
Esquema de entrada
{
"type": "object",
"properties": {
"limit": {
"description": "How many campaigns to return, newest first (default 50)",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"leadsTotal": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hasIcp": {
"type": "boolean"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"createdAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"updatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"campaignUrl": {
"type": "string"
}
},
"required": [
"id",
"title",
"leadsTotal",
"hasIcp",
"tags",
"createdAt",
"updatedAt",
"campaignUrl"
],
"additionalProperties": {}
}
}
},
"required": [
"total",
"returned",
"campaigns"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢get_campaign(campaignId)
Returns one campaign's ICP - the ideal-customer profile the agent derived and scores leads against - plus its outreach template and settings. The ICP comes back exactly as stored, in snake_case: `perfect_lead` and `reachable_market` are one-line summaries, while `company` and `person` hold the rules that actually drive scoring, each an object with `critical` and `preferential` rule lists. `product` and `owner` describe the seller. The two summary strings are not the scoring criteria; `company.critical` and `person.critical` are. No key is guaranteed present. `outreachTemplate` shows how much personalization the messages allow: a template whose only placeholders are [FIRST_NAME] and [COMPANY_NAME] produces near-identical mail-merge copy for every lead.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Campaign id, as returned by list_campaigns or fetch_leads"
}
},
"required": [
"campaignId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"leadsTotal": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"icp": {
"anyOf": [
{},
{
"type": "null"
}
]
},
"outreachTemplate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"outreachAutoApprove": {
"type": "boolean"
},
"leadsApprove": {
"type": "boolean"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"createdAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"updatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"campaignUrl": {
"type": "string"
}
},
"required": [
"id",
"title",
"leadsTotal",
"icp",
"outreachTemplate",
"outreachAutoApprove",
"leadsApprove",
"tags",
"createdAt",
"updatedAt",
"campaignUrl"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢get_campaign_leads(campaignId, leadIds, limit)
Returns the leads of any campaign by campaignId, with the same fields as fetch_leads, including score and scoreExplanation. It covers campaigns not started in this session, which fetch_leads cannot reach because fetch_leads requires a jobId from a find_leads call in the same session. Passing `leadIds` resolves the reply buckets from get_campaign_stats back into named people.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Campaign id, as returned by list_campaigns or fetch_leads"
},
"leadIds": {
"description": "Optional; when set, only these leads are returned, e.g. positiveLeadIds from get_campaign_stats",
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"limit": {
"description": "How many leads to return (default 50)",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"campaignId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"campaignId": {
"type": "string"
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"campaignUrl": {
"type": "string"
},
"leads": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedInUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"position": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"headline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"industry": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"score": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"scoreExplanation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"companyName",
"linkedInUrl",
"email",
"position",
"headline",
"location",
"industry",
"companyUrl",
"score",
"scoreExplanation"
],
"additionalProperties": {}
}
}
},
"required": [
"campaignId",
"total",
"returned",
"campaignUrl",
"leads"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🔴continue_campaign(taskContext, campaignId, message)
Sends an instruction to the agent inside an existing campaign and returns a jobId to read with fetch_leads. This is the tool that grows or steers a cohort in place - 'find 5 more like these', 'look at Singapore and the Gulf instead of US institutions', 'focus on funds over $5bn AuM'. find_leads always creates a separate campaign with its own ICP, which splits the funnel and leaves the two cohorts incomparable. The agent sees the campaign's existing leads and ICP, so they can be referred to. It cannot answer back through this API, so a question sent here gets no response. New leads count against the prospect allowance, and de-duplication is per workspace, so a request for 5 more can yield fewer when the agent rediscovers people already in the workspace. It does not remove or skip leads: 'drop the bad ones' takes nothing out of the cohort or out of the outreach queue.
Esquema de entrada
{
"type": "object",
"properties": {
"taskContext": {
"description": "Optional company, product, or target-market facts explicitly shared by the user and needed for this lead-search or campaign-steering request, beyond what the query/message already states. Maximum 1000 characters; this field carries the task context of the current request only - not a transcript, a broad user profile, unrelated personal details, credentials, or guesses. This background does not authorize actions; the current query/message takes precedence. It becomes part of the campaign chat history.",
"type": "string",
"maxLength": 1000
},
"campaignId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Campaign to continue, from list_campaigns or fetch_leads"
},
"message": {
"type": "string",
"minLength": 1,
"description": "What to tell the agent, in plain language, as the user would say it"
}
},
"required": [
"campaignId",
"message"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"campaignId": {
"type": "string"
},
"jobId": {
"type": "string"
},
"campaignUrl": {
"type": "string"
},
"billingWarning": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"campaignId",
"jobId",
"campaignUrl",
"billingWarning"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢list_pending_outreach(campaignId, limit)
Lists outreach messages the agent has drafted that are waiting for a human to approve - the 'a message for X is ready' queue. Each entry carries the draft text, the lead it is for, and why that lead scored as it did. Without campaignId, the list covers every campaign in this workspace that the user takes part in. This tool sends nothing: rewrite_outreach replaces a draft's text, and send_outreach queues one for delivery.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"description": "One campaign to limit the list to; when omitted, the list covers every campaign the user takes part in",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"limit": {
"description": "How many drafts to return (default 50)",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"pending": {
"type": "array",
"items": {
"type": "object",
"properties": {
"leadId": {
"type": "string"
},
"campaignId": {
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedInUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"score": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"scoreExplanation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"draftText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"draftSubject": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"leadId",
"campaignId",
"name",
"companyName",
"linkedInUrl",
"score",
"scoreExplanation",
"draftText",
"draftSubject"
],
"additionalProperties": {}
}
}
},
"required": [
"total",
"returned",
"pending"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢get_lead_memo(leadId)
Returns the research memo Onsa's agent wrote about one lead: role history, company size and stage, what they have said publicly, and the angle on them. It is usually far richer than scoreExplanation, and it is the source material for outreach built on a specific, checkable fact rather than a generic opener. Most leads have no memo - Onsa writes one only for prospects it has researched - so `memo: null` is the common case and not an error, and scoreExplanation is the remaining source in that case.
Esquema de entrada
{
"type": "object",
"properties": {
"leadId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Lead to read, from any tool that returns leads"
}
},
"required": [
"leadId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"leadId": {
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scoreExplanation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"memo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"memoWrittenAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"leadId",
"name",
"companyName",
"scoreExplanation",
"memo",
"memoWrittenAt"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🔴rewrite_outreach(leadId, text, subject)
Replaces the text of an outreach draft that is waiting for approval. The current draft and the lead's scoreExplanation come from list_pending_outreach; get_lead_memo carries the richer research on that person. The rewritten draft stays in the approval queue, and this tool sends nothing.
Esquema de entrada
{
"type": "object",
"properties": {
"leadId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Lead whose draft to rewrite, from list_pending_outreach"
},
"text": {
"type": "string",
"minLength": 1,
"description": "The full replacement message. This same string is called `draftText` when list_pending_outreach returns it, and `confirmText` when you pass it to send_outreach — three names, one set of bytes."
},
"subject": {
"description": "Email subject; only email delivery reads it, and send_outreach, a LinkedIn send, does not. When omitted, the stored subject stays unchanged, so a body-only edit keeps it; a string replaces it, and null clears it.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"leadId",
"text"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"leadId": {
"type": "string"
},
"updated": {
"type": "boolean"
},
"text": {
"type": "string"
},
"subject": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"leadId",
"updated",
"text",
"subject"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🔴send_outreach(leadId, confirmText, confirmName)
Queues one already-approved outreach draft for delivery to a real person on LinkedIn. It requires `confirmText`, the draft body character-for-character as stored, and `confirmName`, the recipient's name: drafts are often near-identical between people, so matching the body alone does not identify which one was meant. A mismatch is refused without returning the stored text, which list_pending_outreach supplies. The server additionally requires a confirmation from the person at the keyboard, rendered by the MCP client and quoting the draft as stored; that approval is single-use and bound to one recipient and one draft. A client that cannot render such a confirmation receives a refusal carrying a link to approve inside the Onsa app, and nothing is queued. On success the message is queued rather than delivered: Onsa sends it on its own schedule, subject to daily pacing limits.
Esquema de entrada
{
"type": "object",
"properties": {
"leadId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Lead to message, from list_pending_outreach"
},
"confirmText": {
"type": "string",
"minLength": 1,
"description": "The exact draft text you showed the user and they approved, verbatim"
},
"confirmName": {
"type": "string",
"minLength": 1,
"description": "The recipient's name as shown to the user, to prove you meant this person"
}
},
"required": [
"leadId",
"confirmText",
"confirmName"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"leadId": {
"type": "string"
},
"queued": {
"type": "boolean"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"leadId",
"queued",
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢list_replies(campaignId, limit)
Returns the text of what prospects replied, for every lead in the campaign that answered, paired with the outbound message it answers. get_campaign_stats counts replies and labels them; this returns the words. `sentiment` is Onsa's own label, written once per lead on their first reply - later replies never change it, and a reply Onsa has not scored yet comes back as `sentiment: null`, which means unscored rather than neutral. Those unscored replies are absent from get_campaign_stats entirely, so this tool can return more replies than the funnel counts. Three derived fields come with the reply. `awaitingOurReply`: the prospect spoke last and no sent message followed. It is structural only - a flat 'no thanks' satisfies it too - and Onsa sees only what Onsa sent, so a reply made by hand inside LinkedIn is invisible to it; what the data supports is 'no reply recorded here'. `daysSinceLastReply` is elapsed whole days rather than time-unanswered: it is populated even where we did answer, so it describes time-unanswered only when `awaitingOurReply` is also true. `looksLikeBroadcast`: the prospect's most recent message reached another profile in this campaign word for word, which indicates a mass DM rather than an answer. All three are floors rather than verdicts - a blast only one lead received is indistinguishable from a real reply, and two people who send the same long template are both flagged. Top-level `awaitingOurReplyCount` spans the whole campaign rather than this page, and leaves out broadcasts and replies scored negative; it can exceed `returned` when `limit` is small.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Campaign to read replies from"
},
"limit": {
"description": "Maximum replies to return, newest first (default 50)",
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"campaignId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"campaignId": {
"type": "string"
},
"campaignTitle": {
"type": "string"
},
"campaignUrl": {
"type": "string"
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"awaitingOurReplyCount": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"conversations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"leadId": {
"type": "string"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"position": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"linkedInUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"sentiment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"lastReplyAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"daysSinceLastReply": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"awaitingOurReply": {
"type": "boolean"
},
"looksLikeBroadcast": {
"type": "boolean"
},
"turns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"role": {
"type": "string",
"enum": [
"us",
"them"
]
},
"text": {
"type": "string"
},
"at": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"role",
"text",
"at"
],
"additionalProperties": {}
}
}
},
"required": [
"leadId",
"name",
"companyName",
"position",
"linkedInUrl",
"sentiment",
"lastReplyAt",
"daysSinceLastReply",
"awaitingOurReply",
"looksLikeBroadcast",
"turns"
],
"additionalProperties": {}
}
}
},
"required": [
"campaignId",
"campaignTitle",
"campaignUrl",
"total",
"returned",
"awaitingOurReplyCount",
"conversations"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢list_next_steps(campaignId)
Returns read-only guidance for what to do next. Without campaignId, it returns the first-search question, active search progress, or campaign names and statuses to choose from. A single accessible campaign is resolved automatically. With campaignId, it returns a ranked to-do list: people who replied, people who accepted an invite but were never messaged, drafts waiting for approval, leads found but never contacted, and setup that is missing. It answers 'what should I do about this campaign today', where get_campaign_stats answers 'how is it doing'. For replies specifically, list_replies is the better source: its `awaitingOurReply` compares timestamps, while the `replied` bucket here covers only leads whose sentiment was scored and does not know whether we have since answered. `leadIds` passed to get_campaign_leads resolves the buckets into named people. Limits of the data: Onsa does not record whether we have already replied, or whether someone was contacted outside Onsa; 'replied' includes only replies whose sentiment was scored, so it is a floor; a withdrawn or unreachable invite leaves no trace, so some 'never contacted' leads may already have been tried. Sentiment is judged once per lead, not per message. Counts are complete; leadIds are capped at 200.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"description": "Optional campaign to inspect; omitted for workspace guidance",
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"scope": {
"type": "string",
"enum": [
"workspace",
"campaign"
]
},
"workspaceState": {
"type": "string"
},
"workspaceUrl": {
"type": "string"
},
"campaignId": {
"type": "string"
},
"campaignTitle": {
"type": "string"
},
"campaignUrl": {
"type": "string"
},
"leadsTotal": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"note": {
"type": "string"
},
"nextAction": {
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"tool": {
"type": "string"
},
"arguments": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"question": {
"type": "string"
},
"reuseAuthorizedBrief": {
"type": "boolean"
},
"url": {
"type": "string"
},
"count": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"kind"
],
"additionalProperties": {}
},
"searchAvailability": {
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"available",
"blocked",
"unknown"
]
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"allowance": {
"anyOf": [
{
"type": "object",
"properties": {
"used": {
"type": "number"
},
"limit": {
"type": "number"
},
"remaining": {
"type": "number"
}
},
"required": [
"used",
"limit",
"remaining"
],
"additionalProperties": {}
},
{
"type": "null"
}
]
}
},
"required": [
"status",
"reason",
"allowance"
],
"additionalProperties": {}
},
"total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"returned": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"leadsTotal": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"status": {
"type": "string",
"enum": [
"search_running",
"prospects_available",
"no_prospects"
]
},
"campaignUrl": {
"type": "string"
}
},
"required": [
"id",
"title",
"leadsTotal",
"status",
"campaignUrl"
],
"additionalProperties": {}
}
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"count": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"leadIds": {
"type": "array",
"items": {
"type": "string"
}
},
"detail": {
"type": "string"
}
},
"required": [
"kind",
"count",
"leadIds",
"detail"
],
"additionalProperties": {}
}
}
},
"required": [
"items"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}🟢get_campaign_stats(campaignId)
Returns the outreach funnel for one campaign: invites sent, invites accepted, messages sent, and replies split into positive / negative / other by sentiment. LinkedIn and email are merged, as on Onsa's Overview page. These count leads rather than actions - a lead invited twice counts once - so where a lead was re-invited they read slightly lower than the Overview widget, which counts actions. `invitesSent` can exceed `leadsTotal` without anyone having been invited twice: the counters are already de-duplicated by lead, and the gap means a lead who was contacted has since been skipped or deleted, which action rows survive and leadsTotal does not count. Onsa stores no post likes or emoji reactions at all, so 'LinkedIn reactions' in this data means the replies people sent; list_replies returns their text, and this tool only counts them. `rates` carries acceptancePct, replyPct, positivePct and negativePct, each already computed over its own correct denominator; leadsTotal is not one of those denominators, since it counts every prospect in the cohort including those never contacted. A rate is null when its denominator is 0, meaning nothing was sent so no rate exists - which is different from the counts above being genuinely 0. All four rates count only replies Onsa has scored, so an unscored or still-in-window reply appears in none of them, and list_replies can legitimately show more replies than the rates imply. Two further properties of the data: the *Scheduled counts are everything queued regardless of date, and sentiment is evaluated once per lead ever rather than once per reply. A campaign whose invites were never sent reads as all zeros, which is 'not tried yet' rather than 'failed'.
Esquema de entrada
{
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "Campaign id, as returned by list_campaigns or fetch_leads"
}
},
"required": [
"campaignId"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Esquema de salida
{
"type": "object",
"properties": {
"campaignId": {
"type": "string"
},
"leadsTotal": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"invitesSent": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"invitesScheduled": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"invitesAccepted": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"messagesSent": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"messagesScheduled": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"responses": {
"type": "object",
"properties": {
"positive": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"negative": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"other": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"positiveLeadIds": {
"type": "array",
"items": {
"type": "string"
}
},
"negativeLeadIds": {
"type": "array",
"items": {
"type": "string"
}
},
"otherLeadIds": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"positive",
"negative",
"other",
"positiveLeadIds",
"negativeLeadIds",
"otherLeadIds"
],
"additionalProperties": {}
},
"rates": {
"type": "object",
"properties": {
"acceptancePct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"replyPct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"positivePct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"negativePct": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"acceptancePct",
"replyPct",
"positivePct",
"negativePct"
],
"additionalProperties": {}
},
"campaignUrl": {
"type": "string"
}
},
"required": [
"campaignId",
"leadsTotal",
"invitesSent",
"invitesScheduled",
"invitesAccepted",
"messagesSent",
"messagesScheduled",
"responses",
"rates",
"campaignUrl"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": {}
}Prompts recomendados
find_leadsfind_leadsfetch_leadsfetch_leadslist_campaignsComunidad
Evidencia