# SynthRank Agent-first SEO writing. Crawl a site, confirm a business profile, research keywords, then Autopilot writes, fact-checks, and publishes. ## Humans - App: https://app.synthrank.com/login - Sign up: https://app.synthrank.com/login?mode=signup - FAQ: https://synthrank.com/faq - Pricing: https://synthrank.com/pricing ## Agents Authenticate with `x-api-key: sr_...` and `tenant_id`. MCP: POST https://synthrank.com/functions/v1/mcp Header: x-api-key, x-synthrank-tenant REST: POST https://synthrank.com/functions/v1/agent-api Body: { "action": "", "tenant_id": "", ... } ## Tools get_workspace, list_content, start_crawl, get_crawl_status, get_business_profile, confirm_business_profile, research_keywords, get_topic_map, start_runs, list_runs, get_run, retry_run, accept_run_plan, publish_run, list_tickets, get_ticket, create_ticket, reply_ticket ## Ops agents Authenticate with `x-api-key: sr_ops_...` (platform key from /ops). MCP: POST https://synthrank.com/functions/v1/ops-mcp Tools: list_tickets, get_ticket, reply_ticket, update_ticket, lookup_customer, list_customers, get_customer, set_ops_status, comp_plan, add_note Support is agent-led. New tickets default to assignee_kind=agent. Email (AgentMail, synthrank.com, inbound enabled): - hello@synthrank.com — general / public - support@synthrank.com — support triage - nova@synthrank.com — ops agent mailbox ## Events Subscribe webhooks to run.started, run.needs_approval, run.published, run.failed in addition to content.* events. ## Rate limits & quotas content-api/content-write: no rate limit today. Autopilot generation (start_runs/start_article) draws from a monthly run quota per workspace, and calls chained through more than one SynthRank function share Supabase's platform budget of >=5,000 requests/minute per chain. REST (agent-api, agent-mcp's POST /) returns the real status for both: 409 for quota (resets monthly UTC; check via get_workspace's quota field), 429 + Retry-After for the chain limit. MCP JSON-RPC (tools/call over /mcp or /agent-mcp -- what MCP clients actually use) wraps every tool error as HTTP 200 with result.isError=true instead; check isError and parse the error text, do not wait for 429/409 there. Full detail: https://synthrank.com/docs/agents#rate-limits ## Docs https://synthrank.com/docs/agents