{"spec":"grozro-capabilities/v1","name":"GroZro","tagline":"Your AI growth operator — drafts the content, you stay editor-in-chief.","description":"GroZro is an AI-native social growth operator. It drafts platform-native post batches from your growth profile, learns from your analytics, and keeps every post behind your approval.","site":"https://grozro.com","app":"https://app.grozro.com","api":{"base_url":"https://api.grozro.com","openapi":"https://api.grozro.com/api/v1/openapi.json","capabilities":["https://api.grozro.com/api/v1/capabilities","https://api.grozro.com/.well-known/grozro.json"],"auth":{"type":"api_key","scheme":"Bearer","header":"Authorization","key_prefix":"ak_","create_key_at":"https://app.grozro.com/settings","scope_model":"Method-based: GET requires api:read; POST/PUT/DELETE require api:write. The MCP endpoint requires mcp:use and hides mutating tools from keys without api:write.","scopes":[{"scope":"api:read","grants":"GET on /api/v1/growth/*"},{"scope":"api:write","grants":"POST/PUT/DELETE on /api/v1/growth/*"},{"scope":"mcp:use","grants":"the MCP endpoint at /api/v1/mcp"}],"missing_scope_error":{"status":403,"message":"API key missing scope: <scope>"}},"errors":[{"match":"plan_invalid:<reason>","status":403,"meaning":"Workspace billing blocks costly actions (billing_suspended | trial_expired | grace_period_ended | plan_expired). Reads stay open; fix billing to resume."},{"match":"plan_quota_exceeded:<key>","status":403,"meaning":"Monthly plan quota hit — surface to the human, do not retry."},{"match":"plan_feature_disabled:<feature>","status":403,"meaning":"The workspace plan does not include this feature."},{"match":"rate_limited:<action>","status":429,"meaning":"Hourly per-action cap hit — back off before retrying."},{"match":"x_not_connected","status":400,"meaning":"No X account linked. Drafting, approving, and scheduling still work; only direct posting and engagement execution need the human to connect X in the app settings."},{"match":"x_read_budget_exhausted","status":429,"meaning":"Daily X read budget spent (pay-as-you-go tier). Read-side features (signals, mentions, target watching) resume tomorrow; drafting and posting are unaffected."},{"match":"generation_failed: <retry hint>","status":200,"meaning":"Terminal state of an async generation record (batch/article/audit/report settles status:\"failed\" in a 200 body, typically after 1–3 minutes). Retry once, then follow the hint — do not loop."}]},"mcp":{"url":"https://api.grozro.com/api/v1/mcp","transport":"streamable-http","auth":{"scheme":"Bearer","header":"Authorization","scope":"mcp:use"},"growth_tools":["growth_overview","growth_get_brief","growth_create_batch","growth_list_batches","growth_create_article","growth_list_articles","growth_list_queue","growth_approve_item","growth_reject_item","growth_mark_item_posted","growth_schedule_item","growth_unschedule_item","growth_post_item","growth_connection_status","growth_list_accounts","growth_set_default_account","growth_update_profile","growth_update_channel","growth_create_audit","growth_list_learnings","growth_add_learning","growth_retire_learning","growth_list_engagements","growth_create_engagement","growth_approve_engagement","growth_reject_engagement","growth_execute_engagement","growth_list_targets","growth_add_target","growth_update_target","growth_list_signals","growth_dismiss_signal","growth_engage_signal","growth_list_products","growth_add_product","growth_update_product","growth_list_hooks","growth_list_reports","growth_create_report","growth_list_experiments","growth_create_experiment","growth_conclude_experiment","growth_list_rules","growth_create_rule","growth_update_rule","growth_list_rule_runs","growth_pause_automation","growth_resume_automation"]},"webhooks":{"events":["growth.batch.settled","growth.approval.requested","growth.item.posted"],"delivery":"Signed POSTs (HMAC-SHA256, X-Webhook-Signature header) to one per-tenant HTTPS endpoint with an optional event allowlist. growth.batch.settled carries the same stable error codes as the batch record.","configure_at":"https://app.grozro.com/settings/webhooks"},"cli":{"name":"grozro","install":"npm install -g grozro","login":"grozro login --api-key ak_…","config":"~/.grozro/config.json"},"docs":{"quickstart":"https://docs.grozro.com/docs","api":"https://docs.grozro.com/docs/api","cli":"https://docs.grozro.com/docs/cli","mcp":"https://docs.grozro.com/docs/mcp","agents":"https://docs.grozro.com/docs/agents","llms_txt":"https://docs.grozro.com/llms.txt","llms_full_txt":"https://docs.grozro.com/llms-full.txt","agents_md":"https://docs.grozro.com/agents.md"},"operations":[{"op_id":"growth.overview.get","method":"GET","path":"/api/v1/growth/overview","summary":"Workspace snapshot: profile, channels, drafted queue, learnings","scope":"api:read","mcp_tool":"growth_overview","cli":"grozro overview","section":"core-loop"},{"op_id":"growth.brief.get","method":"GET","path":"/api/v1/growth/brief","summary":"Daily operator brief: ranked \"do this next\" actions from workspace state (?include=items hydrates each action with its actionable rows)","scope":"api:read","mcp_tool":"growth_get_brief","cli":"grozro brief [--items]","section":"core-loop"},{"op_id":"growth.batches.create","method":"POST","path":"/api/v1/growth/batches","summary":"Draft a batch of ready-to-post content (async — poll the batch)","scope":"api:write","mcp_tool":"growth_create_batch","cli":"grozro batch [--count 6] [--focus …]","section":"core-loop"},{"op_id":"growth.batches.list","method":"GET","path":"/api/v1/growth/batches","summary":"List recent batches","scope":"api:read","mcp_tool":"growth_list_batches","cli":"grozro batches list","section":"core-loop"},{"op_id":"growth.batches.get","method":"GET","path":"/api/v1/growth/batches/{id}","summary":"One batch with its drafted items (settles in-flight generation)","scope":"api:read","mcp_tool":null,"cli":"grozro batches get <id>","section":"core-loop"},{"op_id":"growth.articles.create","method":"POST","path":"/api/v1/growth/articles","summary":"Draft one long-form X article (async — poll GET /articles)","scope":"api:write","mcp_tool":"growth_create_article","cli":"grozro article <topic…> [--outline …] [--length short|medium|long]","section":"core-loop"},{"op_id":"growth.articles.list","method":"GET","path":"/api/v1/growth/articles","summary":"List long-form articles","scope":"api:read","mcp_tool":"growth_list_articles","cli":"grozro articles [get <id>]","section":"core-loop"},{"op_id":"growth.articles.get","method":"GET","path":"/api/v1/growth/articles/{id}","summary":"One article","scope":"api:read","mcp_tool":null,"cli":"grozro articles get <id>","section":"core-loop"},{"op_id":"growth.items.list","method":"GET","path":"/api/v1/growth/items","summary":"List content items by status","scope":"api:read","mcp_tool":"growth_list_queue","cli":"grozro queue [--status drafted]","section":"core-loop"},{"op_id":"growth.items.approve","method":"POST","path":"/api/v1/growth/items/{id}/approve","summary":"Approve a drafted item (optional edited body; articles may retitle)","scope":"api:write","mcp_tool":"growth_approve_item","cli":"grozro approve <id> [--body …]","section":"core-loop"},{"op_id":"growth.items.reject","method":"POST","path":"/api/v1/growth/items/{id}/reject","summary":"Reject a drafted item","scope":"api:write","mcp_tool":"growth_reject_item","cli":"grozro reject <id> [--reason …]","section":"core-loop"},{"op_id":"growth.items.markPosted","method":"POST","path":"/api/v1/growth/items/{id}/posted","summary":"Mark an approved item posted (manual publish path)","scope":"api:write","mcp_tool":"growth_mark_item_posted","cli":"grozro item posted <id> [--url …]","section":"core-loop"},{"op_id":"growth.items.schedule","method":"POST","path":"/api/v1/growth/items/{id}/schedule","summary":"Schedule an approved item; the worker posts it when due","scope":"api:write","mcp_tool":"growth_schedule_item","cli":"grozro item schedule <id> --at <iso8601>","section":"core-loop"},{"op_id":"growth.items.unschedule","method":"POST","path":"/api/v1/growth/items/{id}/unschedule","summary":"Clear an approved item's schedule; it stays approved in the queue","scope":"api:write","mcp_tool":"growth_unschedule_item","cli":"grozro item unschedule <id>","section":"core-loop"},{"op_id":"growth.items.postNow","method":"POST","path":"/api/v1/growth/items/{id}/post-now","summary":"Post an approved item to X immediately (articles go out as one long post)","scope":"api:write","mcp_tool":"growth_post_item","cli":"grozro post <id>","section":"core-loop"},{"op_id":"growth.connection.get","method":"GET","path":"/api/v1/growth/connection","summary":"Connected X account state","scope":"api:read","mcp_tool":"growth_connection_status","cli":"grozro whoami","section":"connection"},{"op_id":"growth.connection.disconnect","method":"DELETE","path":"/api/v1/growth/connection","summary":"Disconnect the X account","scope":"api:write","mcp_tool":null,"cli":"grozro connection disconnect","section":"connection"},{"op_id":"growth.connections.list","method":"GET","path":"/api/v1/growth/connections","summary":"List connected X accounts (multi-account)","scope":"api:read","mcp_tool":"growth_list_accounts","cli":"grozro accounts [set-default <id>]","section":"connection"},{"op_id":"growth.connections.setDefault","method":"POST","path":"/api/v1/growth/connections/{id}/default","summary":"Make an account the default new content posts from","scope":"api:write","mcp_tool":"growth_set_default_account","cli":"grozro accounts set-default <id>","section":"connection"},{"op_id":"growth.profile.update","method":"PUT","path":"/api/v1/growth/profile","summary":"Update the growth profile and Writing DNA (voice, stories, proof, patterns…)","scope":"api:write","mcp_tool":"growth_update_profile","cli":"grozro profile update [--goal …] [--voice …] [--json {…}]","section":"config"},{"op_id":"growth.channels.update","method":"PUT","path":"/api/v1/growth/channels/{id}","summary":"Update a platform channel (status, format rules, cadence)","scope":"api:write","mcp_tool":"growth_update_channel","cli":"grozro channels update <id> [--status active|inactive] [--json {…}]","section":"config"},{"op_id":"growth.audits.create","method":"POST","path":"/api/v1/growth/audits","summary":"Run an analytics audit (from synced metrics by default)","scope":"api:write","mcp_tool":"growth_create_audit","cli":"grozro audit","section":"analytics"},{"op_id":"growth.audits.get","method":"GET","path":"/api/v1/growth/audits/{id}","summary":"Audit result with extracted learnings","scope":"api:read","mcp_tool":null,"cli":"grozro audits get <id>","section":"analytics"},{"op_id":"growth.learnings.list","method":"GET","path":"/api/v1/growth/learnings","summary":"List learnings (what worked / flopped / hypotheses)","scope":"api:read","mcp_tool":"growth_list_learnings","cli":"grozro learnings [add|retire]","section":"analytics"},{"op_id":"growth.learnings.create","method":"POST","path":"/api/v1/growth/learnings","summary":"Add a learning","scope":"api:write","mcp_tool":"growth_add_learning","cli":"grozro learnings add --kind worked|flopped|hypothesis --note …","section":"analytics"},{"op_id":"growth.learnings.retire","method":"POST","path":"/api/v1/growth/learnings/{id}/retire","summary":"Retire a learning","scope":"api:write","mcp_tool":"growth_retire_learning","cli":"grozro learnings retire <id>","section":"analytics"},{"op_id":"growth.engagements.list","method":"GET","path":"/api/v1/growth/engagements","summary":"List engagement suggestions/drafts (replies, quotes)","scope":"api:read","mcp_tool":"growth_list_engagements","cli":"grozro engage list [--status …]","section":"engagement"},{"op_id":"growth.engagements.create","method":"POST","path":"/api/v1/growth/engagements","summary":"Draft an engagement against an X post","scope":"api:write","mcp_tool":"growth_create_engagement","cli":"grozro engage create <url|id> --action reply|quote|repost|like","section":"engagement"},{"op_id":"growth.engagements.approve","method":"POST","path":"/api/v1/growth/engagements/{id}/approve","summary":"Approve a drafted engagement","scope":"api:write","mcp_tool":"growth_approve_engagement","cli":"grozro engage approve <id> [--body …]","section":"engagement"},{"op_id":"growth.engagements.reject","method":"POST","path":"/api/v1/growth/engagements/{id}/reject","summary":"Reject a drafted engagement","scope":"api:write","mcp_tool":"growth_reject_engagement","cli":"grozro engage reject <id> [--reason …]","section":"engagement"},{"op_id":"growth.engagements.execute","method":"POST","path":"/api/v1/growth/engagements/{id}/execute","summary":"Execute an approved engagement on X","scope":"api:write","mcp_tool":"growth_execute_engagement","cli":"grozro engage execute <id>","section":"engagement"},{"op_id":"growth.targets.list","method":"GET","path":"/api/v1/growth/targets","summary":"List target accounts","scope":"api:read","mcp_tool":"growth_list_targets","cli":"grozro targets list","section":"engagement"},{"op_id":"growth.targets.create","method":"POST","path":"/api/v1/growth/targets","summary":"Add a target account to watch","scope":"api:write","mcp_tool":"growth_add_target","cli":"grozro targets add <handle> [--category …] [--priority 1-3]","section":"engagement"},{"op_id":"growth.targets.update","method":"PUT","path":"/api/v1/growth/targets/{id}","summary":"Update or pause a target","scope":"api:write","mcp_tool":"growth_update_target","cli":"grozro targets update <id> [--status active|paused] [--priority 1-3]","section":"engagement"},{"op_id":"growth.signals.list","method":"GET","path":"/api/v1/growth/signals","summary":"List open signals from watched targets","scope":"api:read","mcp_tool":"growth_list_signals","cli":"grozro signals list","section":"engagement"},{"op_id":"growth.signals.dismiss","method":"POST","path":"/api/v1/growth/signals/{id}/dismiss","summary":"Dismiss a signal","scope":"api:write","mcp_tool":"growth_dismiss_signal","cli":"grozro signals dismiss <id>","section":"engagement"},{"op_id":"growth.signals.engage","method":"POST","path":"/api/v1/growth/signals/{id}/engage","summary":"Engage a signal (drafts a reply/quote)","scope":"api:write","mcp_tool":"growth_engage_signal","cli":"grozro signals engage <id> --action reply|quote|repost|like","section":"engagement"},{"op_id":"growth.products.list","method":"GET","path":"/api/v1/growth/products","summary":"List products available for self-promotion weaving","scope":"api:read","mcp_tool":"growth_list_products","cli":"grozro products list","section":"products"},{"op_id":"growth.products.create","method":"POST","path":"/api/v1/growth/products","summary":"Add a product","scope":"api:write","mcp_tool":"growth_add_product","cli":"grozro products add --name … --one-liner … [--url …]","section":"products"},{"op_id":"growth.products.update","method":"PUT","path":"/api/v1/growth/products/{id}","summary":"Update or archive a product","scope":"api:write","mcp_tool":"growth_update_product","cli":"grozro products update <id> [--status active|archived] [--json {…}]","section":"products"},{"op_id":"growth.hooks.list","method":"GET","path":"/api/v1/growth/hooks","summary":"Hook-pattern library with usage stats","scope":"api:read","mcp_tool":"growth_list_hooks","cli":"grozro hooks","section":"analytics"},{"op_id":"growth.reports.list","method":"GET","path":"/api/v1/growth/reports","summary":"List weekly reports","scope":"api:read","mcp_tool":"growth_list_reports","cli":"grozro reports list","section":"analytics"},{"op_id":"growth.reports.create","method":"POST","path":"/api/v1/growth/reports","summary":"Generate a weekly report","scope":"api:write","mcp_tool":"growth_create_report","cli":"grozro reports create","section":"analytics"},{"op_id":"growth.experiments.list","method":"GET","path":"/api/v1/growth/experiments","summary":"List experiments","scope":"api:read","mcp_tool":"growth_list_experiments","cli":"grozro experiments list","section":"analytics"},{"op_id":"growth.experiments.create","method":"POST","path":"/api/v1/growth/experiments","summary":"Create an experiment","scope":"api:write","mcp_tool":"growth_create_experiment","cli":"grozro experiments create --name … --hypothesis …","section":"analytics"},{"op_id":"growth.experiments.conclude","method":"POST","path":"/api/v1/growth/experiments/{id}/conclude","summary":"Conclude an experiment with a verdict","scope":"api:write","mcp_tool":"growth_conclude_experiment","cli":"grozro experiments conclude <id> --result …","section":"analytics"},{"op_id":"growth.rules.list","method":"GET","path":"/api/v1/growth/rules","summary":"List automation rules","scope":"api:read","mcp_tool":"growth_list_rules","cli":"grozro rules list [update|pause-all|resume-all|runs]","section":"automation"},{"op_id":"growth.rules.create","method":"POST","path":"/api/v1/growth/rules","summary":"Create an automation rule","scope":"api:write","mcp_tool":"growth_create_rule","cli":null,"section":"automation"},{"op_id":"growth.rules.update","method":"PUT","path":"/api/v1/growth/rules/{id}","summary":"Update an automation rule","scope":"api:write","mcp_tool":"growth_update_rule","cli":"grozro rules update <id> [--status active|paused] [--json {…}]","section":"automation"},{"op_id":"growth.ruleRuns.list","method":"GET","path":"/api/v1/growth/rule-runs","summary":"List recent automation rule runs","scope":"api:read","mcp_tool":"growth_list_rule_runs","cli":"grozro rules runs [--rule-id <id>]","section":"automation"},{"op_id":"growth.automation.pauseAll","method":"POST","path":"/api/v1/growth/automation/pause-all","summary":"Pause all automation (kill switch)","scope":"api:write","mcp_tool":"growth_pause_automation","cli":"grozro rules pause-all","section":"automation"},{"op_id":"growth.automation.resumeAll","method":"POST","path":"/api/v1/growth/automation/resume-all","summary":"Resume automation","scope":"api:write","mcp_tool":"growth_resume_automation","cli":"grozro rules resume-all","section":"automation"}]}