The API
Everything on this page is generated from the live registries, so what you read is what the deployment serves. Base URL: https://www.astrofabric.ai/api. Prefer machines? The full contract ships as an OpenAPI 3.1 spec - point a generator or Postman at it.
Authentication
Every request carries a bearer API key minted in the console. Keys look like ek_live_<key id>_<secret>; the secret is shown once at creation and stored only as a hash. Keys carry scopes (for example tools:site_audit or agents:*) and a per-minute rate limit.
curl https://www.astrofabric.ai/api/v1/tools \ -H "Authorization: Bearer ek_live_..."
Status contract
401missing or invalid key ·403key lacks the scope402the workspace's enforced data budget is exhausted; the body names the vendor and the reset409not_connected: the tool needs a connected account, and the body says which toolkit and how to connect it422input failed the tool's schema; the body is readable enough for an agent to self-correct429the key's per-minute rate limit ·502an upstream integration failed and the body says whether reconnecting fixes it
Missions: the orchestrator
The autonomous front door. POST an objective in plain language and the mission agent plans the steps, routes work across model tiers and the whole tool stack, runs specialist agents as sub-workers, and returns the finished result - or, when proceeding would mean guessing, kind: "question" with one specific question.
/api/v1/agentRun a mission; body {"objective": "...", "thread_id"?, "mode"?: "sync"|"async", "callback_url"?}/api/v1/threads/{'{id}'}A thread's transcript, with each turn's tool traceMissions are threads: every response carries a thread_id, and passing it back continues the conversation with full memory of what was already asked and delivered - "now verify those emails", "format them for LinkedIn Ads". The same thread store backs the console sandbox and the marketing_agent MCP tool, so a mission started in Slack can be picked up in the console. Long missions run with mode: "async": the response is a 202 with a run id - poll GET /v1/runs/:id or receive the signed agent.run.finished webhook.
Missions deliver into your systems, not just into chat: lists ship as downloadable CSV links (30-day expiry), contacts write straight into a connected HubSpot CRM, and the workspace's standing memory (brand, ICP, competitors, sender identity) is loaded into every mission and updated when you state a durable fact.
curl -X POST https://www.astrofabric.ai/api/v1/agent \
-H "Authorization: Bearer ek_live_..." \
-H "Content-Type: application/json" \
-d '{"objective": "Build a list of 100 companies showing high
interest in building insulation"}'
{ "ok": true, "thread_id": "1f0e...", "kind": "question",
"reply": "Do you want the list restricted to a region, and should
I verify contact emails as I go? (US only / global)" }
# answer on the same thread:
curl -X POST https://www.astrofabric.ai/api/v1/agent \
-H "Authorization: Bearer ek_live_..." \
-d '{"objective": "US only, and yes verify emails",
"thread_id": "1f0e..."}'Tools
Deterministic capability: one POST, one metered call, structured JSON back. Discover the catalog at runtime, then run by name.
/api/v1/toolsList the catalog with JSON schemas/api/v1/tools/{'{tool}'}Run one tool; body is the tool's inputsite_audittools:site_auditOn-page SEO audit of one URL: title, meta description, heading hierarchy, canonical, indexability, Open Graph, structured data, image alt coverage, internal linking, content depth, HTTPS/viewport/lang, and response speed. Returns a 0-100 score with per-check findings and fixes.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 4,
"maxLength": 2048,
"description": "Public page URL to audit, e.g. https://example.com/pricing"
}
},
"required": [
"url"
],
"additionalProperties": false
}ai_visibility_checktools:ai_visibility_checkAI-search readiness audit of one URL: which AI answer/training crawlers robots.txt admits or blocks (OpenAI, Perplexity, Anthropic, and more), llms.txt presence, server-rendered content volume, structured data, answer-ready heading structure, freshness signals and sitemap declaration. Returns a 0-100 citability score with a per-bot access matrix.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 4,
"maxLength": 2048,
"description": "Public page URL to audit, e.g. https://example.com/pricing"
}
},
"required": [
"url"
],
"additionalProperties": false
}email_auth_checktools:email_auth_checkEmail deliverability authentication audit of one domain: SPF (lookup budget, all-qualifier), DKIM (23 common selectors probed), DMARC policy, MX, BIMI and MTA-STS, scored against the Gmail/Yahoo/Microsoft bulk-sender rules. Returns findings with the exact DNS records to publish.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare domain to check, e.g. example.com"
}
},
"required": [
"domain"
],
"additionalProperties": false
}gsc_list_sitestools:gsc_list_sitesList the sites (properties) the connected Google Search Console account can query, with each site's permission level. Call this first to find the exact siteUrl value to pass to gsc_search_analytics.
REQUIRES CONNECTION: google_search_console
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}gsc_search_analyticstools:gsc_search_analyticsQuery Google Search Console search analytics for a connected site: clicks, impressions, CTR and position over a date range, broken down by the requested dimensions (query, page, date, country, device). Use gsc_list_sites to find the siteUrl.
REQUIRES CONNECTION: google_search_console
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"site_url": {
"type": "string",
"minLength": 4,
"maxLength": 300,
"description": "Exact site URL as listed by gsc_list_sites, e.g. sc-domain:example.com or https://www.example.com/"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date, YYYY-MM-DD"
},
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "End date, YYYY-MM-DD"
},
"dimensions": {
"description": "Breakdown dimensions, default [\"query\"]",
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"date",
"query",
"page",
"country",
"device",
"searchAppearance"
]
}
}
},
"required": [
"site_url",
"start_date",
"end_date"
],
"additionalProperties": false
}ga4_list_propertiestools:ga4_list_propertiesList the GA4 account summaries and properties the connected Google Analytics account can read. Call this first to find the property id (format "properties/123456789") to pass to ga4_run_report.
REQUIRES CONNECTION: google_analytics
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}ga4_run_reporttools:ga4_run_reportRun a GA4 Data API report on a connected property: pick dimensions (e.g. date, sessionDefaultChannelGroup, pagePath) and metrics (e.g. sessions, activeUsers, keyEvents, totalRevenue) over a date range. Returns the raw runReport payload. Use ga4_list_properties to find the property id.
REQUIRES CONNECTION: google_analytics
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"property": {
"type": "string",
"pattern": "^properties\\/\\d+$",
"description": "GA4 property resource name, e.g. properties/123456789"
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Start date, YYYY-MM-DD"
},
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "End date, YYYY-MM-DD"
},
"dimensions": {
"minItems": 1,
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z0-9]{1,64}$"
},
"description": "GA4 dimension API names, e.g. [\"date\",\"sessionDefaultChannelGroup\"]"
},
"metrics": {
"minItems": 1,
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z0-9]{1,64}$"
},
"description": "GA4 metric API names, e.g. [\"sessions\",\"keyEvents\"]"
}
},
"required": [
"property",
"start_date",
"end_date",
"dimensions",
"metrics"
],
"additionalProperties": false
}serp_snapshottools:serp_snapshotLive Google organic results for one query: top-ranked pages with position, title, URL and snippet, plus People Also Ask questions and related searches. Location defaults to the United States.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keyword": {
"type": "string",
"minLength": 1,
"maxLength": 700,
"description": "The search query"
},
"location": {
"description": "Location name, e.g. \"United Kingdom\"",
"type": "string",
"maxLength": 100
},
"depth": {
"description": "How many results to read (10-30)",
"type": "integer",
"minimum": 10,
"maximum": 30
}
},
"required": [
"keyword"
],
"additionalProperties": false
}keyword_metricstools:keyword_metricsGoogle Ads search volume, CPC and competition for up to 100 keywords in one call. Use it to size demand before writing content or buying traffic.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keywords": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 80
}
},
"location": {
"description": "Location name, e.g. \"United States\"",
"type": "string",
"maxLength": 100
}
},
"required": [
"keywords"
],
"additionalProperties": false
}domain_keywordstools:domain_keywordsEvery keyword a domain ranks for in Google organic (best positions first): keyword, position, search volume, ranking URL and estimated traffic value. The fastest way to read any site's organic footprint - yours or a competitor's.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare domain, e.g. example.com"
},
"limit": {
"description": "Keywords to return (default 50)",
"type": "integer",
"minimum": 10,
"maximum": 100
}
},
"required": [
"domain"
],
"additionalProperties": false
}domain_competitorstools:domain_competitorsThe domains competing for the same Google organic keywords as a target domain, ranked by keyword overlap, with average position and estimated traffic value. Finds the real search competitors, which are often not the obvious ones.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare domain, e.g. example.com"
},
"limit": {
"type": "integer",
"minimum": 5,
"maximum": 30
}
},
"required": [
"domain"
],
"additionalProperties": false
}keyword_ideastools:keyword_ideasExpand up to 5 seed keywords into the wider demand landscape: related keywords with search volume, CPC and competition, volume-sorted. The discovery step before pricing a content plan.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keywords": {
"minItems": 1,
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"description": "Seed keywords"
},
"limit": {
"type": "integer",
"minimum": 10,
"maximum": 100
}
},
"required": [
"keywords"
],
"additionalProperties": false
}keyword_difficultytools:keyword_difficultyRanking difficulty (0-100) for up to 100 keywords in one call. Cross with keyword_metrics volume to find the high-demand, low-competition targets worth writing for.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keywords": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 80
}
}
},
"required": [
"keywords"
],
"additionalProperties": false
}keyword_gaptools:keyword_gapThe keywords a competitor ranks for that a target domain does not, volume-sorted with the competitor's position. The single fastest map of where a rival wins organic ground.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"target": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Your domain"
},
"competitor": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "The domain that is winning"
},
"limit": {
"type": "integer",
"minimum": 10,
"maximum": 100
}
},
"required": [
"target",
"competitor"
],
"additionalProperties": false
}domain_overviewtools:domain_overviewOne domain's whole search footprint in a single read: organic and paid keyword counts, position distribution and estimated traffic value. The opening move of any domain analysis.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253
}
},
"required": [
"domain"
],
"additionalProperties": false
}traffic_estimatetools:traffic_estimateEstimated organic traffic value and ranked-keyword counts for up to 25 domains in one call. Size a market or rank a competitor set by search presence.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domains": {
"minItems": 1,
"maxItems": 25,
"type": "array",
"items": {
"type": "string",
"minLength": 4,
"maxLength": 253
}
}
},
"required": [
"domains"
],
"additionalProperties": false
}backlink_profiletools:backlink_profileA domain's backlink summary: total backlinks, referring domains, domain rank and broken links. Authority context for why a rival outranks you.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253
}
},
"required": [
"domain"
],
"additionalProperties": false
}search_trendstools:search_trendsGoogle Trends interest-over-time for up to 5 terms: is demand for a topic rising, seasonal or dying. Time a launch or a content push with it.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keywords": {
"minItems": 1,
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"date_from": {
"description": "Window start, YYYY-MM-DD",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"required": [
"keywords"
],
"additionalProperties": false
}ai_prompt_checktools:ai_prompt_checkAsk a prompt to the live AI answer engines (ChatGPT, Claude, Gemini, Perplexity) and report each answer, what it cited, and whether the brands you care about were mentioned. This is the ground truth of AI-search visibility for one question.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"prompt": {
"type": "string",
"minLength": 3,
"maxLength": 500,
"description": "The question a buyer would ask, e.g. \"best email deliverability tools\""
},
"models": {
"description": "Which engines to ask; defaults to chatgpt + perplexity",
"minItems": 1,
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"chatgpt",
"claude",
"gemini",
"perplexity"
]
}
},
"brands": {
"description": "Brand names or domains to detect in answers and citations",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
}
},
"required": [
"prompt"
],
"additionalProperties": false
}ai_brand_mentionstools:ai_brand_mentionsRead the index of answers AI assistants have already given to real users, and count how often a brand and its competitors appear. Wider coverage than asking live, but the index lags by roughly a month - the response reports the measured lag. Use ai_prompt_check for today's answer to a specific question.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brand": {
"type": "string",
"minLength": 2,
"maxLength": 120,
"description": "Your brand name or domain"
},
"competitors": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 120
}
},
"limit": {
"description": "Max indexed answers to read (default 100)",
"type": "integer",
"minimum": 10,
"maximum": 200
}
},
"required": [
"brand"
],
"additionalProperties": false
}web_researchtools:web_researchNeural web search with content extraction: returns ranked pages with title, URL, date and a text snippet. Supports category focus (company, news, publication, people), domain include/exclude lists, and a freshness floor. The workhorse for open-ended research.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 2,
"maxLength": 2000
},
"num_results": {
"type": "integer",
"minimum": 1,
"maximum": 10
},
"category": {
"type": "string",
"enum": [
"company",
"news",
"publication",
"personal site",
"financial report",
"people"
]
},
"include_domains": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 253
}
},
"exclude_domains": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 253
}
},
"published_after": {
"description": "YYYY-MM-DD freshness floor",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"required": [
"query"
],
"additionalProperties": false
}similar_sitestools:similar_sitesNeural lookalike discovery: pages and companies semantically similar to a URL, with snippets. Finds the competitors and comparables a keyword search misses.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 4,
"maxLength": 2048,
"description": "The page or homepage to find lookalikes for"
},
"num_results": {
"type": "integer",
"minimum": 1,
"maximum": 10
}
},
"required": [
"url"
],
"additionalProperties": false
}fetch_contenttools:fetch_contentClean readable text for up to 5 known URLs - including JavaScript-heavy pages a plain fetch cannot read. Use when you already know WHICH pages matter and need their substance.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"urls": {
"minItems": 1,
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"minLength": 4,
"maxLength": 2048
}
},
"max_characters": {
"type": "integer",
"minimum": 500,
"maximum": 8000
}
},
"required": [
"urls"
],
"additionalProperties": false
}company_profiletools:company_profileFirmographic enrichment for up to 10 exact company domains: name, description, LinkedIn, and funding history (last round, amount, total raised). Only positive matches are billed.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domains": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. example.com"
}
}
},
"required": [
"domains"
],
"additionalProperties": false
}hiring_signalstools:hiring_signalsRecent job postings as a buying signal: filter by company domains and/or job-title keywords, bounded by posting age. A company hiring for a function is in motion on that function.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"company_domains": {
"maxItems": 25,
"type": "array",
"items": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. example.com"
}
},
"job_titles": {
"description": "Title keywords, e.g. [\"SEO\", \"growth marketing\"]",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 80
}
},
"max_age_days": {
"type": "integer",
"minimum": 1,
"maximum": 90
},
"country_codes": {
"description": "ISO codes, e.g. [\"US\",\"GB\"]",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 2
}
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"additionalProperties": false
}tech_stacktools:tech_stackThe technologies a company runs, from its technographic fingerprint: analytics, CMS, ad platforms, infrastructure. Useful for segmentation and for tailoring an integration pitch.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. example.com"
}
},
"required": [
"domain"
],
"additionalProperties": false
}company_buying_intentstools:company_buying_intentsLists the buying intent topics detected for a company from its job postings. For each topic, returns the confidence level (low, medium, high), the number of jobs that mention the topic, and the first and last dates it was mentioned.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. example.com"
},
"confidence": {
"description": "Only topics at these confidence levels",
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
}
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"domain"
],
"additionalProperties": false
}companies_using_techtools:companies_using_techCompanies that run specific technologies, from technographic fingerprints: segment a market by stack (say, everyone on HubSpot and Webflow) before prospecting or positioning an integration.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"technologies": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 60
},
"description": "Technology slugs, e.g. [\"hubspot\",\"webflow\"]"
},
"country_codes": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 2,
"maxLength": 2
}
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"required": [
"technologies"
],
"additionalProperties": false
}competitor_adstools:competitor_adsA company's live and recent ads from the public ad libraries (Meta, Google, LinkedIn): creative text, headlines, CTAs and landing URLs. What a competitor pays to say is their strategy in writing.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"platform": {
"type": "string",
"enum": [
"facebook",
"google",
"linkedin"
]
},
"company_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. example.com"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"required": [
"platform",
"company_domain"
],
"additionalProperties": false
}page_factstools:page_factsFetch one public page and extract structured facts by kind: pricing (plans, amounts), blog_feed (recent posts), changelog (releases), jobs (open roles), release_notes, tech_stack (script fingerprints), or generic page facts. Deterministic extraction - no model in the loop, no cost.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 4,
"maxLength": 2048,
"description": "Public page URL"
},
"kind": {
"type": "string",
"enum": [
"page",
"pricing",
"blog_feed",
"changelog",
"jobs",
"release_notes",
"tech_stack"
],
"description": "What the page is, which picks the extractor"
}
},
"required": [
"url",
"kind"
],
"additionalProperties": false
}prospect_company_searchtools:prospect_company_searchFind companies currently in motion: search 30+ buyer-signal families (hiring trends, funding, news, product launches, LinkedIn posts, SEC filings) with firmographic and content filters. Returns companies with their recent signals attached.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"signal_types": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"enum": [
"news",
"hiring-trends",
"hiring-velocity",
"glassdoor-company",
"linkedin-post-company",
"linkedin-post-contact",
"linkedin-comments-contact",
"twitter-company-posts",
"twitter-contact-posts",
"github",
"product-reviews",
"seo-traffic",
"youtube-company",
"youtube-contact",
"work-milestones",
"earnings-transcripts",
"sec-10k",
"sec-10q",
"sec-8k",
"sec-6k",
"sec-20f",
"employee-growth",
"patents",
"reddit-company",
"financials",
"producthunt-launch",
"website-intelligence",
"sec-form-d-funding",
"hackernews",
"federal-contract-award",
"new-business-formation",
"conference-speaker"
]
},
"description": "Which signal families to search, e.g. [\"hiring-trends\",\"news\",\"sec-form-d-funding\"]"
},
"detected_after": {
"description": "YYYY-MM-DD; defaults to ~50 days back",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"industries": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
},
"employee_count_min": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"employee_count_max": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"company_domains": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 253
}
},
"content_filters": {
"description": "Substring/exact filters over social-signal content",
"type": "object",
"properties": {
"keywords": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"tech_mentioned": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"competitors_mentioned": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"pain_points": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"initiatives": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"limit": {
"description": "Rows to return (billed per row); default 10",
"type": "integer",
"minimum": 1,
"maximum": 25
}
},
"required": [
"signal_types"
],
"additionalProperties": false
}prospect_contact_searchtools:prospect_contact_searchFind people showing buying signals: everything prospect_company_search filters on, plus seniority (Staff/Manager/Director/Vp/Cxo), department and job-title keyword. Returns contacts with their signals and company context.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"signal_types": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"enum": [
"news",
"hiring-trends",
"hiring-velocity",
"glassdoor-company",
"linkedin-post-company",
"linkedin-post-contact",
"linkedin-comments-contact",
"twitter-company-posts",
"twitter-contact-posts",
"github",
"product-reviews",
"seo-traffic",
"youtube-company",
"youtube-contact",
"work-milestones",
"earnings-transcripts",
"sec-10k",
"sec-10q",
"sec-8k",
"sec-6k",
"sec-20f",
"employee-growth",
"patents",
"reddit-company",
"financials",
"producthunt-launch",
"website-intelligence",
"sec-form-d-funding",
"hackernews",
"federal-contract-award",
"new-business-formation",
"conference-speaker"
]
},
"description": "Which signal families to search, e.g. [\"hiring-trends\",\"news\",\"sec-form-d-funding\"]"
},
"detected_after": {
"description": "YYYY-MM-DD; defaults to ~50 days back",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"industries": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 80
}
},
"employee_count_min": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"employee_count_max": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"company_domains": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 253
}
},
"content_filters": {
"description": "Substring/exact filters over social-signal content",
"type": "object",
"properties": {
"keywords": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"tech_mentioned": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"competitors_mentioned": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"pain_points": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
},
"initiatives": {
"type": "object",
"properties": {
"contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"not_contains": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"limit": {
"description": "Rows to return (billed per row); default 10",
"type": "integer",
"minimum": 1,
"maximum": 25
},
"seniority": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"Staff",
"Manager",
"Director",
"Vp",
"Cxo"
]
}
},
"department": {
"description": "e.g. [\"Marketing\",\"Engineering\"]",
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 60
}
},
"job_title": {
"description": "Partial-match title keyword",
"type": "string",
"maxLength": 120
}
},
"required": [
"signal_types"
],
"additionalProperties": false
}company_signalstools:company_signalsEverything the signal index knows about one company: recent news, hiring, funding, posts, launches and filings, with a per-family summary and coverage report. The evidence base for a personalized pitch.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. stripe.com"
},
"signal_types": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"enum": [
"news",
"hiring-trends",
"hiring-velocity",
"glassdoor-company",
"linkedin-post-company",
"linkedin-post-contact",
"linkedin-comments-contact",
"twitter-company-posts",
"twitter-contact-posts",
"github",
"product-reviews",
"seo-traffic",
"youtube-company",
"youtube-contact",
"work-milestones",
"earnings-transcripts",
"sec-10k",
"sec-10q",
"sec-8k",
"sec-6k",
"sec-20f",
"employee-growth",
"patents",
"reddit-company",
"financials",
"producthunt-launch",
"website-intelligence",
"sec-form-d-funding",
"hackernews",
"federal-contract-award",
"new-business-formation",
"conference-speaker"
]
}
},
"detected_after": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"limit": {
"description": "Signals to return (billed per row); default 20",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"domain"
],
"additionalProperties": false
}contact_signalstools:contact_signalsEverything the signal index knows about one person, by email or LinkedIn URL: their posts, comments, job changes and milestones, plus company context. What you would want to know before writing to them.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"linkedin_url": {
"type": "string",
"format": "uri"
},
"limit": {
"description": "Signals to return (billed per row); default 20",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"additionalProperties": false
}outbound_drafttools:outbound_draftGenerate a personalized outbound message (email, sequence, call script, connection request, SMS or opener) grounded in the recipient's real buying signals. Identify the recipient by email or LinkedIn URL, the sender likewise; the response lists which insights each draft used.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contact_email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"contact_linkedin_url": {
"type": "string",
"format": "uri"
},
"sender_email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"sender_linkedin_url": {
"type": "string",
"format": "uri"
},
"content_type": {
"type": "string",
"enum": [
"email",
"sequence",
"callScript",
"connectionRequest",
"sms",
"opener"
]
},
"writing_style": {
"type": "string",
"enum": [
"challenger_sale",
"clever_poet",
"cxo_pitch",
"data_driven",
"basho",
"why_you_why_now"
]
},
"value_proposition": {
"description": "What the sender sells, in a sentence or two",
"type": "string",
"maxLength": 2000
},
"additional_context": {
"type": "string",
"maxLength": 2000
},
"word_count": {
"type": "integer",
"minimum": 30,
"maximum": 400
},
"sequence_emails": {
"description": "Only for content_type \"sequence\"",
"type": "integer",
"minimum": 2,
"maximum": 5
}
},
"required": [
"content_type"
],
"additionalProperties": false
}buyer_intent_topicstools:buyer_intent_topicsBrowse the buyer-intent topic taxonomy: thousands of product and subject topics with ids, categories and descriptions. Free to call. Find the topic_ids to feed buyer_intent_contacts and buyer_intent_companies.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"q": {
"description": "Fuzzy search over topic name, description and category",
"type": "string",
"maxLength": 500
},
"category": {
"type": "string",
"maxLength": 120
},
"is_product": {
"description": "true = product topics only",
"type": "boolean"
},
"page_size": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"additionalProperties": false
}buyer_intent_contactstools:buyer_intent_contactsDecision-makers actively researching specific topics right now, with intent scores: filter by seniority, department, title, industry, company size/revenue, and require a validated email. The warmest possible outbound list. Get topic_ids from buyer_intent_topics first.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"topic_ids": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
}
},
"seniority": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"Staff",
"Manager",
"Director",
"Vp",
"Cxo"
]
}
},
"department": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"maxLength": 60
}
},
"job_title": {
"description": "Substring match",
"type": "string",
"maxLength": 200
},
"industry": {
"description": "Substring match",
"type": "string",
"maxLength": 200
},
"company_domain": {
"type": "string",
"maxLength": 253
},
"has_email": {
"type": "boolean"
},
"email_validated": {
"type": "boolean"
},
"page_size": {
"description": "Rows to return (billed per row); default 20",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"topic_ids"
],
"additionalProperties": false
}buyer_intent_companiestools:buyer_intent_companiesCompanies actively researching specific topics, scored 0-100 with a buying-stage label: filter by industry, size and revenue, and set a minimum intent score. Get topic_ids from buyer_intent_topics first.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"topic_ids": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
}
},
"composite_min": {
"description": "Minimum intent score (default 50)",
"type": "integer",
"minimum": 0,
"maximum": 100
},
"industry": {
"type": "string",
"maxLength": 200
},
"company_size_min": {
"type": "string",
"maxLength": 40
},
"company_revenue_min": {
"type": "string",
"maxLength": 40
},
"company_domain": {
"type": "string",
"maxLength": 253
},
"page_size": {
"description": "Rows to return (billed per row); default 20",
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"required": [
"topic_ids"
],
"additionalProperties": false
}buyer_intent_timelinetools:buyer_intent_timelineOne company's research trajectory: every intent topic it has been investigating, scored 0-100 with a buying-stage label, week by week. Free to call - the timing read before an outreach.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. acme.com"
}
},
"required": [
"domain"
],
"additionalProperties": false
}email_verifytools:email_verifyBulk email deliverability verification: up to 1,000 addresses in one call, each returning deliverability status, confidence score, risk level and provider. Undeterminable addresses cost nothing. Clean a list before sending to it.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"emails": {
"minItems": 1,
"maxItems": 1000,
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
}
},
"required": [
"emails"
],
"additionalProperties": false
}deliver_csvtools:deliver_csvTurn rows into a downloadable CSV and get back a shareable URL (link expires in 30 days). Use it to deliver lists — prospects, keywords, audit findings — as a file the user can open in a spreadsheet or upload to an ad platform or CRM import.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"filename": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "e.g. insulation-prospects.csv"
},
"rows": {
"minItems": 1,
"maxItems": 5000,
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"description": "One object per row; columns come from the union of keys"
}
},
"required": [
"filename",
"rows"
],
"additionalProperties": false
}crm_upsert_contactstools:crm_upsert_contactsWrite contacts into the connected HubSpot CRM (create or update by email, up to 100 per call): name, company, title, phone, website, LinkedIn. The close of a prospecting mission — the list lands where sales works.
REQUIRES CONNECTION: hubspot
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contacts": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 200,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"first_name": {
"type": "string",
"maxLength": 100
},
"last_name": {
"type": "string",
"maxLength": 100
},
"company": {
"type": "string",
"maxLength": 200
},
"job_title": {
"type": "string",
"maxLength": 200
},
"phone": {
"type": "string",
"maxLength": 40
},
"website": {
"type": "string",
"maxLength": 253
},
"linkedin_url": {
"type": "string",
"maxLength": 300
}
},
"required": [
"email"
],
"additionalProperties": false
}
}
},
"required": [
"contacts"
],
"additionalProperties": false
}recalltools:recallSearch the workspace's accumulated memory: facts learned from past missions, episode summaries of what was already done, and digests of shipped deliverables. Check here BEFORE re-buying data the workspace may already hold - a past keyword gap, a known competitor set, a delivered list. Omit the query to get the most recent episodes instead.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"query": {
"description": "What to look for, e.g. \"competitors\" or \"keyword gap klipfolio\"",
"type": "string",
"minLength": 2,
"maxLength": 200
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20
}
},
"additionalProperties": false
}forget_memorytools:forget_memoryDelete one wrong or outdated memory by its id (from recall results). Use when the user corrects a remembered fact, or when fresh evidence disproves it - then remember the correction via the normal flow. Deletion is permanent.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "The memory id, as returned by recall"
}
},
"required": [
"id"
],
"additionalProperties": false
}workspace_memorytools:workspace_memoryRead or update the workspace's standing memory: brand_name, domain, description, icp, competitors, sender_name, sender_email, value_proposition, notes, or any custom key. Every mission loads this automatically — save durable facts the user states so they are never asked for twice. Set a key to null to forget it.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"set": {
"description": "Keys to save (null deletes). Omit to just read the current memory.",
"type": "object",
"propertyNames": {
"type": "string",
"maxLength": 60
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"maxItems": 25,
"type": "array",
"items": {
"type": "string",
"maxLength": 200
}
},
{
"type": "null"
}
]
}
}
},
"additionalProperties": false
}ad_accountstools:ad_accountsThe workspace's connected ad accounts: platform, name and status. Check this before drafting a campaign — a draft needs an account on its platform to be pushable later.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
}ad_performancetools:ad_performanceCampaign performance from the connected ad accounts over a date range: spend, impressions, clicks, conversions, revenue, CTR, CPA and ROAS per campaign, from the daily sync. The evidence base for budget moves and creative calls.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"days": {
"description": "Lookback window (default 30)",
"type": "integer",
"minimum": 1,
"maximum": 90
},
"platform": {
"description": "Limit to one platform",
"type": "string",
"enum": [
"metaads",
"googleads",
"linkedinads",
"tiktokads",
"pinterestads",
"xads"
]
}
},
"additionalProperties": false
}ad_drafts_listtools:ad_drafts_listRecent campaign drafts and their status (draft, pushing, pushed, failed). A pushed draft is live on the platform but PAUSED until explicitly activated.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50
}
},
"additionalProperties": false
}ad_campaign_drafttools:ad_campaign_draftGenerate an evidence-grounded campaign draft for a connected ad platform: creative variants, targeting and rationale, validated against the platform's real capabilities, written to the draft queue. NOTHING is pushed or spent - a human approves the draft (it lands PAUSED) and activates it separately. The right closing move for a mission that ends in "now run ads on this".
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"platform": {
"type": "string",
"enum": [
"metaads",
"googleads",
"linkedinads",
"tiktokads",
"pinterestads",
"xads"
]
},
"objective": {
"type": "string",
"minLength": 2,
"maxLength": 48,
"description": "The campaign goal; each platform accepts its own set - errors name the valid ones"
},
"daily_budget": {
"type": "number",
"exclusiveMinimum": 0,
"description": "USD per day"
},
"ad_account_id": {
"description": "A connected account id from ad_accounts; optional when only one fits",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"brand_id": {
"description": "Defaults to the workspace's self brand",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"platform",
"objective",
"daily_budget"
],
"additionalProperties": false
}connected_actionstools:connected_actionsDiscover what a connectable integration can do: lists the toolkit's available actions (slug, name, description) and whether this workspace has it connected. Call this before connected_execute to find the right action slug. Toolkits: github, vercel, google_analytics, google_search_console, hubspot, slack, webflow, gmail, notion, googlesheets, googledrive, googledocs, perplexityai, asana, linkedin, linkedin_ads, gamma, klaviyo, attio, zoho, zoho_mail, pipedrive, whatsapp, metaads, googleads, reddit_ads, facebook, zoom, pandadoc, active_campaign, omnisend, openai, sanity, wix.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"toolkit": {
"type": "string",
"enum": [
"github",
"vercel",
"google_analytics",
"google_search_console",
"hubspot",
"slack",
"webflow",
"gmail",
"notion",
"googlesheets",
"googledrive",
"googledocs",
"perplexityai",
"asana",
"linkedin",
"linkedin_ads",
"gamma",
"klaviyo",
"attio",
"zoho",
"zoho_mail",
"pipedrive",
"whatsapp",
"metaads",
"googleads",
"reddit_ads",
"facebook",
"zoom",
"pandadoc",
"active_campaign",
"omnisend",
"openai",
"sanity",
"wix"
]
},
"search": {
"description": "Filter actions by a keyword, e.g. \"message\" or \"row\"",
"type": "string",
"maxLength": 80
}
},
"required": [
"toolkit"
],
"additionalProperties": false
}connected_executetools:connected_executeRun one action of a CONNECTED integration against the workspace's account: send a Slack message, append rows to a Google Sheet, create a Notion page, upsert a Pipedrive deal - any action connected_actions listed. Arguments must match the action's own parameters; a failed call returns the vendor's reason to adapt on. Use writes the user asked for; never delete anything without an explicit instruction naming what to delete.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"toolkit": {
"type": "string",
"enum": [
"github",
"vercel",
"google_analytics",
"google_search_console",
"hubspot",
"slack",
"webflow",
"gmail",
"notion",
"googlesheets",
"googledrive",
"googledocs",
"perplexityai",
"asana",
"linkedin",
"linkedin_ads",
"gamma",
"klaviyo",
"attio",
"zoho",
"zoho_mail",
"pipedrive",
"whatsapp",
"metaads",
"googleads",
"reddit_ads",
"facebook",
"zoom",
"pandadoc",
"active_campaign",
"omnisend",
"openai",
"sanity",
"wix"
]
},
"action": {
"type": "string",
"minLength": 3,
"maxLength": 120,
"description": "The action slug from connected_actions, e.g. SLACK_SEND_MESSAGE"
},
"arguments": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "The action's parameters"
}
},
"required": [
"toolkit",
"action",
"arguments"
],
"additionalProperties": false
}run_codetools:run_codeExecute short JavaScript in a hardened in-memory sandbox for data work: dedupe and join lists, score and rank rows, aggregate metrics, reshape JSON, and assemble CSV strings. Pass data via `input` and read it as the global `input` (already parsed). The value of the final expression is the result; console.log is captured. Pure synchronous computation - no network, filesystem, imports, or timers exist. Prefer this over doing row-by-row arithmetic yourself; hand large row sets onward to deliver_csv.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 20000,
"description": "JavaScript source. The final expression's value is returned, e.g. \"input.filter(r => r.vol > 100)\""
},
"input": {
"description": "JSON data made available inside the sandbox as the global `input`"
}
},
"required": [
"code"
],
"additionalProperties": false
}facebook_ad_searchtools:facebook_ad_searchSearch the Facebook/Meta ad library by keyword across ALL advertisers: every active ad whose creative matches the phrase, with advertiser, creative text and media. Keyword-first - for one known company's ads use competitor_ads instead.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keyword": {
"type": "string",
"minLength": 2,
"maxLength": 120
},
"country_code": {
"description": "ISO country code, e.g. \"US\"",
"type": "string",
"minLength": 2,
"maxLength": 2
}
},
"required": [
"keyword"
],
"additionalProperties": false
}facebook_ad_counttools:facebook_ad_countTotal active Facebook/Meta ad count for one advertiser (by domain or Facebook page URL). Call it per competitor and compare: ad volume is a direct read on paid-social investment.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"company_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. \"hubspot.com\""
},
"facebook_url": {
"description": "Facebook page URL, alternative to the domain",
"type": "string",
"maxLength": 300
}
},
"additionalProperties": false
}ad_pixelstools:ad_pixelsThe advertising and analytics pixels installed on a company's site (Meta, Google, LinkedIn, TikTok tags, ...). Which platforms a company has instrumented is a direct fingerprint of where it runs and measures paid traffic.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. \"hubspot.com\""
}
},
"required": [
"domain"
],
"additionalProperties": false
}tiktok_ads_searchtools:tiktok_ads_searchSearch the TikTok ad library by keyword: matching active ads with advertiser and creative. Follow up on one ad with tiktok_ad_details.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keyword": {
"type": "string",
"minLength": 2,
"maxLength": 120
},
"country_code": {
"description": "ISO country code, e.g. \"US\"",
"type": "string",
"minLength": 2,
"maxLength": 2
}
},
"required": [
"keyword"
],
"additionalProperties": false
}tiktok_ad_detailstools:tiktok_ad_detailsFull detail for one TikTok ad by its id (from tiktok_ads_search results): creative, advertiser, engagement.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"description": "TikTok ad id from tiktok_ads_search"
}
},
"required": [
"id"
],
"additionalProperties": false
}linkedin_ads_keyword_searchtools:linkedin_ads_keyword_searchSearch the LinkedIn ad library by keyword across all advertisers, optionally bounded by country. Keyword-first; for one known company use competitor_ads (platform linkedin) or linkedin_ads_advanced.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"keyword": {
"type": "string",
"minLength": 2,
"maxLength": 120
},
"country": {
"type": "string",
"maxLength": 60
}
},
"required": [
"keyword"
],
"additionalProperties": false
}linkedin_ads_advancedtools:linkedin_ads_advancedA company's LinkedIn ads via the advanced endpoint: accepts a company domain or a LinkedIn page id directly - the page-id path resolves advertisers the domain lookup misses.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"company_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. \"hubspot.com\""
},
"linkedin_page_id": {
"description": "LinkedIn page id, alternative to the domain",
"type": "string",
"maxLength": 120
}
},
"additionalProperties": false
}google_ads_advancedtools:google_ads_advancedA company's Google ads via the advanced endpoint: filter by media type and country beyond the basic competitor_ads pull.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"company_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. \"hubspot.com\""
},
"country_code": {
"description": "ISO country code, e.g. \"US\"",
"type": "string",
"minLength": 2,
"maxLength": 2
},
"media_type": {
"description": "e.g. \"text\", \"image\", \"video\"",
"type": "string",
"maxLength": 40
}
},
"required": [
"company_domain"
],
"additionalProperties": false
}google_shopping_adstools:google_shopping_adsA company's Google Shopping ads by domain: product listings, titles and prices it is paying to place.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"company_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. \"hubspot.com\""
}
},
"required": [
"company_domain"
],
"additionalProperties": false
}youtube_transcripttools:youtube_transcriptThe transcript of one YouTube video by URL. Turns competitor video ads, demos and talks into quotable text for analysis.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 10,
"maxLength": 400,
"description": "YouTube video URL"
}
},
"required": [
"url"
],
"additionalProperties": false
}find_emailtools:find_emailFind a person's work email from their full name + company domain, or from their LinkedIn URL. Runs a waterfall: a verified-only finder first, then a second provider - misses are free, only found addresses bill. Returns the email with its verification status; pair with email_verify before high-volume sends.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"full_name": {
"description": "e.g. \"Jane Miller\"",
"type": "string",
"minLength": 3,
"maxLength": 120
},
"company_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Bare company domain, e.g. \"hubspot.com\""
},
"linkedin_url": {
"description": "LinkedIn profile URL, alternative to name+domain",
"type": "string",
"maxLength": 300
}
},
"additionalProperties": false
}find_phonetools:find_phoneFind a person's phone number (E.164, with line type) from their LinkedIn profile URL. Only a found number bills; misses are free. The vendor returns nothing for EU citizens for legal reasons.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"linkedin_url": {
"type": "string",
"minLength": 10,
"maxLength": 300,
"description": "LinkedIn profile URL"
}
},
"required": [
"linkedin_url"
],
"additionalProperties": false
}Agents
Outcome-shaped endpoints: an agent plans across the tool catalog, spends against a hard per-run cost cap, and returns output that validates against a published schema. Synchronous by default; pass {"mode": "async"} to get a run id immediately and the result by webhook.
/api/v1/agentsList agents with input and output schemas/api/v1/agents/{'{agent}'}Run; body {"input": {...}, "mode": "sync" | "async", "callback_url": "..."}/api/v1/runs/{'{id}'}Poll a run: status, steps, tokens, cost, output/api/v1/runs/{'{id}'}/cancelCancel a queued or running run - cooperative and idempotentRetries are safe. Send an Idempotency-Key header on POST /v1/agents/{agent} or async POST /v1/agent and a retried request answers with the original run (idempotent_replay: true) instead of running - and billing - twice. Cancellation is cooperative: the run stops at its next step, settles only what it consumed, and an already-finished run answers with its final status.
auditagents:auditDeep technical diagnosis of one site across every surface that decides visibility. On-page SEO, AI-search citability, email deliverability, backlink authority, traffic footprint and page-level structured facts - computed exactly in the code sandbox and synthesized into a prioritized fix list with evidence behind every finding.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string",
"minLength": 4,
"maxLength": 2048,
"description": "The page or site URL to audit"
}
},
"required": [
"url"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"url": {
"type": "string"
},
"overall_score": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"summary": {
"type": "string"
},
"top_issues": {
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"area": {
"type": "string",
"enum": [
"seo",
"ai_visibility",
"email"
]
},
"title": {
"type": "string"
},
"severity": {
"type": "string",
"enum": [
"critical",
"high",
"medium",
"low"
]
},
"fix": {
"type": "string"
}
},
"required": [
"area",
"title",
"severity",
"fix"
],
"additionalProperties": false
}
},
"quick_wins": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"url",
"overall_score",
"summary",
"top_issues",
"quick_wins"
],
"additionalProperties": false
}performanceagents:performanceYour Search Console truth cross-read against the whole market. Queries, clicks and positions diffed against the domain's ranked-keyword footprint, competitor keyword gaps and live SERPs - rankings computed row-exact in the code sandbox, surfacing the specific queries where effort converts to position. Requires a connected Search Console account.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"site_url": {
"description": "Search Console site URL; omitted = pick the best match from gsc_list_sites",
"type": "string",
"minLength": 4,
"maxLength": 300
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Window start, YYYY-MM-DD"
},
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Window end, YYYY-MM-DD"
}
},
"required": [
"start_date",
"end_date"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"site_url": {
"type": "string"
},
"period": {
"type": "object",
"properties": {
"start": {
"type": "string"
},
"end": {
"type": "string"
}
},
"required": [
"start",
"end"
],
"additionalProperties": false
},
"summary": {
"type": "string"
},
"top_queries": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"clicks": {
"type": "number"
},
"impressions": {
"type": "number"
}
},
"required": [
"query",
"clicks",
"impressions"
],
"additionalProperties": false
}
},
"opportunities": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"site_url",
"period",
"summary",
"top_queries",
"opportunities"
],
"additionalProperties": false
}market-intelligenceagents:market-intelligenceOmni-channel surveillance of one company, from its job postings to its TikTok ads. Firmographics and funding, hiring momentum, tech stack, buying-intent topics read from its own job listings, live creatives across the Meta, Google, LinkedIn, TikTok and Shopping ad libraries, ad-volume share of voice, on-site tracking pixels, organic footprint and keyword gaps, backlink authority, lookalikes and AI-answer visibility - synthesized into positioning, exposed weaknesses and concrete plays to take ground.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"competitor_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "The competitor to tear down, bare domain"
},
"your_domain": {
"description": "Your own domain, for head-to-head comparisons",
"type": "string",
"minLength": 4,
"maxLength": 253
}
},
"required": [
"competitor_domain"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"competitor": {
"type": "string"
},
"summary": {
"type": "string"
},
"positioning": {
"type": "string",
"description": "What they sell, to whom, on what claim"
},
"evidence": {
"maxItems": 12,
"type": "array",
"items": {
"type": "object",
"properties": {
"source": {
"type": "string"
},
"finding": {
"type": "string"
}
},
"required": [
"source",
"finding"
],
"additionalProperties": false
}
},
"ad_strategy": {
"type": "object",
"properties": {
"running_ads": {
"type": "boolean"
},
"themes": {
"maxItems": 6,
"type": "array",
"items": {
"type": "string"
}
},
"notes": {
"type": "string"
}
},
"required": [
"running_ads",
"themes",
"notes"
],
"additionalProperties": false
},
"momentum": {
"type": "object",
"properties": {
"hiring": {
"maxItems": 6,
"type": "array",
"items": {
"type": "string"
},
"description": "What their hiring says they are building"
},
"signals": {
"maxItems": 6,
"type": "array",
"items": {
"type": "string"
},
"description": "Funding, launches, news, notable posts"
}
},
"required": [
"hiring",
"signals"
],
"additionalProperties": false
},
"search_presence": {
"type": "object",
"properties": {
"notes": {
"type": "string"
},
"weaknesses": {
"maxItems": 6,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"notes",
"weaknesses"
],
"additionalProperties": false
},
"plays": {
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"rationale": {
"type": "string"
},
"effort": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
}
},
"required": [
"title",
"rationale",
"effort"
],
"additionalProperties": false
},
"description": "Concrete moves to take ground from them"
}
},
"required": [
"competitor",
"summary",
"positioning",
"evidence",
"ad_strategy",
"momentum",
"search_presence",
"plays"
],
"additionalProperties": false
}ai-visibilityagents:ai-visibilityThe answer-engine playbook for a domain. Fires real buyer questions at the live AI assistants and records who gets cited, reads the mention index for share of voice, audits the site for citability, mines the question landscape for answer gaps, and returns a scorecard with the prioritized moves that win mentions.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "The domain whose AI-search visibility to work on"
},
"brand_name": {
"type": "string",
"maxLength": 120
},
"competitors": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"maxLength": 120
}
},
"buyer_questions": {
"description": "Questions buyers ask that this brand should be the answer to; the agent invents them when omitted",
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"maxLength": 400
}
}
},
"required": [
"domain"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string"
},
"summary": {
"type": "string"
},
"scorecard": {
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"prompt": {
"type": "string"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"model": {
"type": "string"
},
"mentioned": {
"type": "boolean"
},
"cited": {
"type": "boolean"
},
"who_won": {
"type": "string",
"description": "Which brand the answer actually favored"
}
},
"required": [
"model",
"mentioned",
"cited",
"who_won"
],
"additionalProperties": false
}
}
},
"required": [
"prompt",
"results"
],
"additionalProperties": false
}
},
"share_of_voice": {
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"target": {
"type": "string"
},
"share_pct": {
"type": "number"
}
},
"required": [
"target",
"share_pct"
],
"additionalProperties": false
}
},
"site_readiness": {
"type": "object",
"properties": {
"citability_score": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"blockers": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"citability_score",
"blockers"
],
"additionalProperties": false
},
"actions": {
"maxItems": 8,
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"why": {
"type": "string"
},
"impact": {
"type": "string",
"enum": [
"high",
"medium",
"low"
]
}
},
"required": [
"title",
"why",
"impact"
],
"additionalProperties": false
}
}
},
"required": [
"domain",
"summary",
"scorecard",
"share_of_voice",
"site_readiness",
"actions"
],
"additionalProperties": false
}pipelineagents:pipelinePipeline built from live buying evidence, two ways at once. Accounts whose job postings betray the initiative and people actively researching the topic right now - cross-scored with hiring momentum, tech stack and intent trajectory, deduped and ranked exactly in the code sandbox, emails verified in bulk, and outreach drafted from the specific evidence that put each target on the list.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"icp": {
"type": "string",
"minLength": 10,
"maxLength": 1000,
"description": "Who to find, in plain words: industry, size, role, situation"
},
"value_proposition": {
"type": "string",
"minLength": 10,
"maxLength": 2000,
"description": "What the sender sells, in a sentence or two"
},
"sender_email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"sender_linkedin_url": {
"type": "string",
"format": "uri"
},
"target_count": {
"description": "How many prospects to deliver (default 3)",
"type": "integer",
"minimum": 1,
"maximum": 5
},
"content_type": {
"type": "string",
"enum": [
"email",
"connectionRequest",
"opener"
]
}
},
"required": [
"icp",
"value_proposition"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"summary": {
"type": "string"
},
"targets": {
"maxItems": 5,
"type": "array",
"items": {
"type": "object",
"properties": {
"company": {
"type": "string"
},
"domain": {
"type": "string"
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"email": {
"type": "string"
},
"linkedin_url": {
"type": "string"
}
},
"additionalProperties": false
},
"why_now": {
"maxItems": 4,
"type": "array",
"items": {
"type": "string"
},
"description": "The signals that make this the right moment"
},
"draft": {
"type": "object",
"properties": {
"subject": {
"type": "string"
},
"body": {
"type": "string"
}
},
"required": [
"body"
],
"additionalProperties": false
}
},
"required": [
"company",
"why_now"
],
"additionalProperties": false
}
},
"notes": {
"type": "string",
"description": "Coverage caveats: filters that came back thin, signals unavailable"
}
},
"required": [
"summary",
"targets",
"notes"
],
"additionalProperties": false
}contentagents:contentA content plan engineered from the whole demand picture. Keyword ideas expanded from seeds and priced by volume, CPC and difficulty, cross-read against competitor gaps, demand trends and what the top pages actually cover - down to competitor video transcripts and where AI assistants answer poorly - delivered as article briefs aimed at gaps the data proves are open.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "The site the content will live on"
},
"topic": {
"type": "string",
"minLength": 3,
"maxLength": 300,
"description": "The subject area to win, e.g. \"email deliverability\""
},
"audience": {
"type": "string",
"maxLength": 300
},
"competitors": {
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"maxLength": 253
}
}
},
"required": [
"domain",
"topic"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"topic": {
"type": "string"
},
"summary": {
"type": "string"
},
"keyword_landscape": {
"maxItems": 12,
"type": "array",
"items": {
"type": "object",
"properties": {
"keyword": {
"type": "string"
},
"monthly_searches": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"cpc_usd": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"intent": {
"type": "string",
"enum": [
"informational",
"commercial",
"transactional",
"navigational"
]
}
},
"required": [
"keyword",
"monthly_searches",
"cpc_usd",
"intent"
],
"additionalProperties": false
}
},
"serp_gaps": {
"maxItems": 6,
"type": "array",
"items": {
"type": "string"
},
"description": "What the current top results fail to cover"
},
"ai_answer_gaps": {
"maxItems": 6,
"type": "array",
"items": {
"type": "string"
},
"description": "Where AI assistants answer poorly or cite competitors"
},
"briefs": {
"maxItems": 5,
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"target_keyword": {
"type": "string"
},
"angle": {
"type": "string"
},
"outline": {
"maxItems": 8,
"type": "array",
"items": {
"type": "string"
}
},
"cta": {
"type": "string"
}
},
"required": [
"title",
"target_keyword",
"angle",
"outline",
"cta"
],
"additionalProperties": false
}
}
},
"required": [
"topic",
"summary",
"keyword_landscape",
"serp_gaps",
"ai_answer_gaps",
"briefs"
],
"additionalProperties": false
}demand-generationagents:demand-generationA demand engine designed from live market evidence. Sizes real search and buyer demand for an offer, reads which companies and roles are in motion right now, studies what the market is already being shown across the ad libraries, and returns a channel plan with audiences, angles and budget splits - every recommendation traceable to the data that produced it.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offer": {
"type": "string",
"minLength": 3,
"maxLength": 200,
"description": "The product, service or category to build demand for"
},
"domain": {
"description": "Your domain, for context and proof",
"type": "string",
"minLength": 4,
"maxLength": 253
},
"audience": {
"description": "Who you sell to, in your own words",
"type": "string",
"maxLength": 300
},
"monthly_budget_usd": {
"type": "integer",
"minimum": 100,
"maximum": 1000000
}
},
"required": [
"offer"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offer": {
"type": "string"
},
"summary": {
"type": "string"
},
"demand": {
"type": "object",
"properties": {
"picture": {
"type": "string",
"description": "How much demand exists and where it concentrates"
},
"trend": {
"type": "string",
"description": "Direction of travel, from trends data"
},
"top_keywords": {
"maxItems": 15,
"type": "array",
"items": {
"type": "object",
"properties": {
"keyword": {
"type": "string"
},
"volume": {
"type": "number"
}
},
"required": [
"keyword",
"volume"
],
"additionalProperties": false
}
}
},
"required": [
"picture",
"trend",
"top_keywords"
],
"additionalProperties": false
},
"audiences": {
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"definition": {
"type": "string",
"description": "Precise enough to build on the named channel"
},
"channel": {
"type": "string"
}
},
"required": [
"name",
"definition",
"channel"
],
"additionalProperties": false
}
},
"channels": {
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"channel": {
"type": "string"
},
"budget_share_pct": {
"type": "number",
"minimum": 0,
"maximum": 100
},
"rationale": {
"type": "string"
}
},
"required": [
"channel",
"budget_share_pct",
"rationale"
],
"additionalProperties": false
}
},
"angles": {
"maxItems": 6,
"type": "array",
"items": {
"type": "object",
"properties": {
"angle": {
"type": "string"
},
"evidence": {
"type": "string"
}
},
"required": [
"angle",
"evidence"
],
"additionalProperties": false
}
},
"next_actions": {
"maxItems": 6,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"offer",
"summary",
"demand",
"audiences",
"channels",
"angles",
"next_actions"
],
"additionalProperties": false
}creativeagents:creativeAd creative developed from what the market is actually running. Reads competitor creatives across the Meta, Google, LinkedIn and TikTok libraries, pulls hooks from real video transcripts, maps the claims already crowding the feed, and returns concepts, hooks and copy variants aimed at the gaps - with the evidence behind every angle.
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"brand_domain": {
"type": "string",
"minLength": 4,
"maxLength": 253,
"description": "Your domain - claims and proof are read from it"
},
"offer": {
"type": "string",
"minLength": 3,
"maxLength": 200,
"description": "What the creative promotes"
},
"platforms": {
"description": "Where the creative will run; omit to let the evidence decide",
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"meta",
"google",
"linkedin",
"tiktok"
]
}
},
"competitors": {
"description": "Competitor domains to study",
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"minLength": 4,
"maxLength": 253
}
}
},
"required": [
"brand_domain",
"offer"
],
"additionalProperties": false
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offer": {
"type": "string"
},
"summary": {
"type": "string"
},
"market_read": {
"type": "object",
"properties": {
"crowded_angles": {
"maxItems": 8,
"type": "array",
"items": {
"type": "object",
"properties": {
"advertiser": {
"type": "string"
},
"angle": {
"type": "string"
}
},
"required": [
"advertiser",
"angle"
],
"additionalProperties": false
},
"description": "What the feed is already saturated with"
},
"gaps": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"crowded_angles",
"gaps"
],
"additionalProperties": false
},
"concepts": {
"maxItems": 8,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"platform": {
"type": "string"
},
"hook": {
"type": "string"
},
"body": {
"type": "string"
},
"cta": {
"type": "string"
},
"why": {
"type": "string",
"description": "The gap or evidence this concept exploits"
}
},
"required": [
"name",
"platform",
"hook",
"body",
"cta",
"why"
],
"additionalProperties": false
}
},
"hooks": {
"maxItems": 10,
"type": "array",
"items": {
"type": "string"
},
"description": "Standalone scroll-stoppers worth testing"
},
"tests": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string"
},
"description": "What to A/B first, and what each test decides"
}
},
"required": [
"offer",
"summary",
"market_read",
"concepts",
"hooks",
"tests"
],
"additionalProperties": false
}Autopilots
Standing programs that run on our schedulers. The GEO autopilot monitors how AI assistants talk about a domain: brand profiling, prompt generation, daily multi-model sampling, site audits, and webhook reports.
/api/v1/autopilots/geoStart for a domain; registers your webhook and runs setup headlessly/api/v1/autopilots/geoStatus: brand, prompt count, last run/api/v1/visibility/summaryThe rolling visibility read: share of voice, per-model presencecurl -X POST https://www.astrofabric.ai/api/v1/autopilots/geo \
-H "Authorization: Bearer ek_live_..." \
-d '{"domain": "example.com",
"webhook_url": "https://you.app/hooks/astrofabric"}'Ad operations
Drafts are generated with evidence, pushed paused, and activated explicitly. Write access is a plan feature (Growth and up); reads work everywhere.
/api/v1/ads/accountsConnected ad accounts and their platforms/api/v1/ads/draftsGenerate a campaign draft (platform, objective, budget validated per capability)/api/v1/ads/drafts/{'{id}'}/approvePush the draft to the platform; it lands PAUSED/api/v1/ads/campaigns/{'{id}'}/activateTurn a pushed campaign on, after ownership proofConnections
Integrations link a customer account by OAuth (or key) and become reachable from missions: named tools for Search Console, GA4 and HubSpot, and the generic connected_actions / connected_execute pair for everything else on the roster - Gmail, Notion, Google Sheets/Drive/Docs, Slack, Asana, LinkedIn, Klaviyo, Attio, Zoho, Pipedrive, WhatsApp, Zoom, PandaDoc, ActiveCampaign, Omnisend, Sanity, Wix, the ad-platform data connectors, and more. Start the flow over the API, send the user to the returned URL, then sync.
/api/v1/connectionsCurrent connections and their status/api/v1/connectionsStart an OAuth connect; returns the redirect URL/api/v1/connections/syncReconcile after the OAuth return leg/api/v1/connections/{'{id}'}RevokeWebhooks
Register up to 10 endpoints per workspace with event filters (*, visibility.*, or exact types like ads.draft.pushed). The registration response carries the signing secret exactly once.
/api/v1/webhooksList registered endpoints/api/v1/webhooksRegister {"url": "...", "events": ["visibility.*"]}/api/v1/webhooksDeactivate; body {"id": 1}Every delivery is signed. Recompute the HMAC over `${timestamp}.${rawBody}` and compare:
X-AF-Timestamp: 1754500000
X-AF-Signature: sha256=hex(hmac_sha256(secret, timestamp + "." + body))
// node
const ok = crypto.timingSafeEqual(
Buffer.from(sig),
Buffer.from("sha256=" + crypto.createHmac("sha256", secret)
.update(ts + "." + rawBody).digest("hex")),
);Delivery is at-least-once. Failed deliveries are retried with backoff, so treat events as possibly duplicated and dedupe on the body's type + at pair. Each retry re-signs with a fresh timestamp over an identical payload. A persistently failing endpoint records its last error on the console's Webhooks page, where a send-test button delivers a signed webhook.test event to prove your verification end to end.
Event families today: visibility.report.ready, ads.draft.created, ads.draft.pushed, ads.campaign.activated, approval.decided (a queued write action was approved, executed, denied or failed), webhook.test, plus the per-run agent.run.finished callback when a run carries a callback_url.
MCP server
The platform over the Model Context Protocol (streamable HTTP), for claude.ai, Claude Desktop, Cursor, Slack bots, or any MCP client. Same keys, same scopes, same governance. By default the server exposes exactly one tool: marketing_agent - an open-ended objective in, the whole mission planned and executed autonomously, with clarifying questions continued via history or thread_id. One tool means one entry on your client's permission screen. Append ?tools=all to the server URL to also expose the granular catalog with schemas.
{
"mcpServers": {
"astrofabric": {
"url": "https://www.astrofabric.ai/api/mcp",
"headers": { "Authorization": "Bearer ek_live_..." }
}
}
}OAuth is supported natively: paste the bare https://www.astrofabric.ai/api/mcp into an OAuth-capable client (claude.ai custom connectors, Claude Desktop) and it discovers our authorization server, walks you through AstroFabric sign-in and workspace approval, and receives a scoped key you can revoke from the console. Dynamic client registration is on; PKCE (S256) is required. Clients that support neither headers nor OAuth can embed a key in the URL instead: https://www.astrofabric.ai/api/mcp?key=ek_live_... — the console's MCP tab generates this; the URL contains the credential, so treat it like a password.
Metering
Tool calls and agent runs land on usage meters you can watch in the console; the same meters flow to billing. Third-party data spend is governed by your plan's envelope: reserved before every paid call, settled after, refused with a 402 at the ceiling. The pricing page has the numbers.