Agent quickstart
This page is written for an AI agent (Claude, GPT, or similar) that needs to onboard
itself onto Pluto and start making calls, with no human in the loop. Everything here
hits the live production API: https://api.joinpluto.com/v1.
There is also a machine-readable version of this guide an agent can fetch directly at joinpluto.com/agent/SKILL.md (opens in a new tab).
What Pluto is
A marketing API for AEO, SEO, GBP, ads, content, reviews, and social, plus a set of packaged AI workflows (one-shot LLM tasks). Call it over plain HTTPS with a bearer key, or as tools over a hosted MCP server.
1. Mint your own key (no card)
POST /v1/checkout/free is public - no auth required. Give it an email and an optional
name; it mints a tenant plus a live API key and returns the raw key exactly once.
curl -X POST https://api.joinpluto.com/v1/checkout/free \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com", "name": "Acme Inc"}'The 201 response:
{
"tenant_id": "acme-1a2b3c4d",
"tier": "free",
"api_key": "sk_live_...",
"api_key_meta": { "id": "...", "key_prefix": "sk_live_", "scopes": ["aeo:read", "..."] },
"warning": "Store this key - it cannot be recovered."
}Read the key from the api_key field. Pluto stores only a hash, so save it now.
- The email is unique; a repeat returns
409 already_existsrather than a second key. - Free signups are rate-limited per IP and capped per day, so mint once and reuse.
POST /v1/api-keysmints more keys but needs an existing key withapi-keys:write, which the free tier does not carry. Use/v1/checkout/freefor your first key.
export PLUTO_API_KEY=sk_live_...2. Confirm auth
GET /v1/usage is a cheap read that confirms the key works and shows your plan.
curl https://api.joinpluto.com/v1/usage \
-H "Authorization: Bearer $PLUTO_API_KEY"3. Add the MCP server
If you speak Model Context Protocol, point your client at the hosted server and every endpoint becomes a callable tool.
{
"mcpServers": {
"pluto": {
"url": "https://api.joinpluto.com/v1/mcp",
"headers": { "Authorization": "Bearer sk_live_..." }
}
}
}- Transport: HTTP, JSON-RPC 2.0 (one request maps to one response).
- Discover tools with
tools/list, invoke withtools/call. - 27 curated tools spanning social, ads, SEO, AEO, content, reviews, GBP, local SEO, media, inbox, JobPins, and agent runs, plus tools auto-generated from the OpenAPI spec for the rest of the API.
curl https://api.joinpluto.com/v1/mcp \
-H "Authorization: Bearer $PLUTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'4. What you can call
Only these surfaces exist. Verbs are drawn from the live routes and tagged [free] (a
free key can call it) or [paid] (a free key gets 403 forbidden; needs a paid key
with a card). Section 5 explains why.
- AEO - scan across eight AI platforms
[free]; read gaps, blindspots, and share-of-voice[free]; generate schema, generatellms.txt, propose auto-fixes[paid]. - SEO - read content decay, cannibalization, cached rankings
[free]; live rank check, local grid, heatmap, keyword tracking (paid SERP lookups)[paid]. - GBP - audit and metrics reads
[free]; post[paid]. - Content - reads
[free]; grounded generation, article write, distribute, publish to WordPress or Webflow[paid]. - Social - post, bulk post, list connected accounts
[paid]. - Ads - create and manage campaigns, deploy, pause, resume, optimize
[paid]. - Reviews - list, respond, request
[paid]. - Agents (packaged AI workflows) - run one, poll or stream a run
[paid]. - Sites (register/verify), connect (start OAuth), tenant settings, usage
[free].
The URL namespace agents holds the packaged AI workflows. These are one-shot LLM
tasks, not autonomous agents: you trigger one and read the result. They are paid.
Run an AEO scan [free]
POST /v1/aeo/scan asks the AI answer engines your queries and records whether the
brand shows up. Runs asynchronously and returns 202 Accepted. Requires the aeo:scan
scope, which a free key carries. It is metered as an agent run, so it draws down the
small monthly agent-run allowance (see section 5).
curl -X POST https://api.joinpluto.com/v1/aeo/scan \
-H "Authorization: Bearer $PLUTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"brand": "Acme Plumbing",
"queries": ["best plumber in Austin", "emergency plumber near me"],
"platforms": ["chatgpt", "perplexity"]
}'brand (string, required), queries (string array, at least one, required),
platforms (optional; any of chatgpt, claude, gemini, perplexity, grok,
deepseek, metaai, ai_overview - omit to scan all eight). Poll the returned
poll_url (GET /v1/agents/runs/{id}) until status is completed.
Check a keyword rank [paid]
POST /v1/seo/rank is a live SERP lookup for one keyword and domain. It bills a
DataForSEO request, so it requires the seo:write scope and a paid key - a free key
gets 403 forbidden here before any spend. Shown because it is a common request shape
once you upgrade.
curl -X POST https://api.joinpluto.com/v1/seo/rank \
-H "Authorization: Bearer $PLUTO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"keyword": "emergency plumber austin",
"domain": "acmeplumbing.com",
"location": "United States",
"device": "desktop"
}'keyword (string, required), domain (string, required, no protocol), location
(optional, defaults to United States), device (optional, desktop or mobile,
defaults to desktop).
5. Free tier: look and scan, no card
The free tier is for looking and scanning. It needs no card, and its scope set is
confined at request time, so anything that spends real money returns 403 forbidden to
a free key before the spend.
A free key CAN:
- run AEO citation scans (
aeo:scan) - see whether a business shows up in AI answers; - read $0 SEO signals (content decay and cannibalization off your own Search Console data, plus cached rankings);
- read GBP (audit, metrics), content, and your own account and usage;
- do setup writes to finish onboarding: register and verify a site, save tenant settings, start an OAuth connect.
Included scopes (the ceiling; not a wildcard): aeo:read, aeo:scan, seo:read,
gbp:read, content:read, sites:read, sites:write, tenant:read, tenant:write,
connect:read, connect:write, usage:read, api-keys:read.
Needs a PAID key (a free key gets 403 forbidden):
- anything that GENERATES: content and articles, AEO fixes, media;
- anything that DEPLOYS to a platform: ads, social posts, GBP posts, review responses;
- anything that RUNS an AI workflow: the packaged agents and workflows;
- live SERP lookups (rank, grid, heatmap, keyword tracking) - they bill DataForSEO, so
they sit behind
seo:write.
Free quota (for the reads and scans it can make): 1,000 actions per month; AEO scans are metered as agent runs and the free monthly agent-run allowance is small (5); a hard $25 spend ceiling per period (billable calls fail closed once hit); 60 requests per minute.
Paid tiers (POST /v1/checkout/{hobby|pro|scale|agency}) return a Stripe Checkout URL
and lift both the scope confinement and the quotas; Enterprise is a sales contact at
sales@joinpluto.com.
6. Errors and metering
Every error is JSON with a stable machine-readable code (for example rate_limited,
quota_exceeded, already_exists). Each metered request is one action; agent and
workflow runs count against their own quotas. Once any quota or the spend cap is
exhausted, billable calls return 402 quota_exceeded until the period resets or you
upgrade. Watch live numbers at GET /v1/usage.
For the human walkthrough, see the Quickstart and MCP guide.