⟨ REFERENCE ⟩

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

  • 401 missing or invalid key · 403 key lacks the scope
  • 402 the workspace's enforced data budget is exhausted; the body names the vendor and the reset
  • 409 not_connected: the tool needs a connected account, and the body says which toolkit and how to connect it
  • 422 input failed the tool's schema; the body is readable enough for an agent to self-correct
  • 429 the key's per-minute rate limit · 502 an 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.

POST/api/v1/agentRun a mission; body {"objective": "...", "thread_id"?, "mode"?: "sync"|"async", "callback_url"?}
GET/api/v1/threads/{'{id}'}A thread's transcript, with each turn's tool trace

Missions 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.

GET/api/v1/toolsList the catalog with JSON schemas
POST/api/v1/tools/{'{tool}'}Run one tool; body is the tool's input
site_audittools:site_audit

On-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_check

AI-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_check

Email 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_sites

List 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_analytics

Query 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_properties

List 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_report

Run 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_snapshot

Live 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_metrics

Google 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_keywords

Every 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_competitors

The 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_ideas

Expand 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_difficulty

Ranking 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_gap

The 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_overview

One 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_estimate

Estimated 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_profile

A 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_trends

Google 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_check

Ask 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_mentions

Read 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_research

Neural 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_sites

Neural 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_content

Clean 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_profile

Firmographic 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_signals

Recent 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_stack

The 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_intents

Lists 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_tech

Companies 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_ads

A 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_facts

Fetch 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_search

Find 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_search

Find 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_signals

Everything 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_signals

Everything 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_draft

Generate 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_topics

Browse 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_contacts

Decision-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_companies

Companies 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_timeline

One 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_verify

Bulk 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_csv

Turn 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_contacts

Write 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:recall

Search 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_memory

Delete 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_memory

Read 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_accounts

The 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_performance

Campaign 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_list

Recent 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_draft

Generate 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_actions

Discover 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_execute

Run 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_code

Execute 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_search

Search 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_count

Total 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_pixels

The 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_search

Search 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_details

Full 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_search

Search 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_advanced

A 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_advanced

A 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_ads

A 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_transcript

The 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_email

Find 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_phone

Find 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.

GET/api/v1/agentsList agents with input and output schemas
POST/api/v1/agents/{'{agent}'}Run; body {"input": {...}, "mode": "sync" | "async", "callback_url": "..."}
GET/api/v1/runs/{'{id}'}Poll a run: status, steps, tokens, cost, output
POST/api/v1/runs/{'{id}'}/cancelCancel a queued or running run - cooperative and idempotent

Retries 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.

Audit Agent auditagents:audit

Deep 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
}
Performance Agent performanceagents:performance

Your 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 Intelligence Agent market-intelligenceagents:market-intelligence

Omni-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 Visibility Agent ai-visibilityagents:ai-visibility

The 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
}
Pipeline Agent pipelineagents:pipeline

Pipeline 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
}
Content Agent contentagents:content

A 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 Generation Agent demand-generationagents:demand-generation

A 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
}
Creative Agent creativeagents:creative

Ad 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.

POST/api/v1/autopilots/geoStart for a domain; registers your webhook and runs setup headlessly
GET/api/v1/autopilots/geoStatus: brand, prompt count, last run
GET/api/v1/visibility/summaryThe rolling visibility read: share of voice, per-model presence
curl -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.

GET/api/v1/ads/accountsConnected ad accounts and their platforms
POST/api/v1/ads/draftsGenerate a campaign draft (platform, objective, budget validated per capability)
POST/api/v1/ads/drafts/{'{id}'}/approvePush the draft to the platform; it lands PAUSED
POST/api/v1/ads/campaigns/{'{id}'}/activateTurn a pushed campaign on, after ownership proof

Connections

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.

GET/api/v1/connectionsCurrent connections and their status
POST/api/v1/connectionsStart an OAuth connect; returns the redirect URL
POST/api/v1/connections/syncReconcile after the OAuth return leg
DELETE/api/v1/connections/{'{id}'}Revoke

Webhooks

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.

GET/api/v1/webhooksList registered endpoints
POST/api/v1/webhooksRegister {"url": "...", "events": ["visibility.*"]}
DELETE/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.