API reference
Base URL https://api.grozro.com. Authenticate with a tenant API key (ak_…) as a Bearer token. Rendered from /api/v1/openapi.json.
Authentication
curl -H "Authorization: Bearer ak_…" \
https://api.grozro.com/api/v1/growth/items?status=draftedAPI keys reach /api/v1/growth/*, /api/v1/mcp, and the public spec. 401 means a missing/invalid key; 403 with plan_quota_exceeded:… or plan_feature_disabled:… means the workspace plan does not allow the call.
growth
GET/api/v1/growth/overviewWorkspace snapshot: profile, channels, drafted queue, learnings
Params: include (query)
Responses: 200
GET/api/v1/growth/batchesList recent batches
Responses: 200
POST/api/v1/growth/batchesDraft a batch of ready-to-post content (async — poll the batch)
Body fields: count, focus
Responses: 201, 403
GET/api/v1/growth/batches/{id}One batch with its drafted items (settles in-flight generation)
Params: id (path, required)
Responses: 200
GET/api/v1/growth/articlesList long-form articles
Responses: 200
POST/api/v1/growth/articlesDraft one long-form X article (async — poll GET /articles)
Body fields: topic, outline, length
Responses: 201, 403
GET/api/v1/growth/articles/{id}One article
Params: id (path, required)
Responses: 200, 404
GET/api/v1/growth/itemsList content items by status
Params: status (query)
Responses: 200
POST/api/v1/growth/items/{id}/approveApprove a drafted item (optional edited body; articles may retitle)
Params: id (path, required)
Body fields: edited_body, title
Responses: 200, 409
POST/api/v1/growth/items/{id}/rejectReject a drafted item
Params: id (path, required)
Body fields: reason
Responses: 200, 409
POST/api/v1/growth/items/{id}/postedMark an approved item posted (manual publish path)
Params: id (path, required)
Body fields: external_url
Responses: 200, 409
POST/api/v1/growth/items/{id}/scheduleSchedule an approved item; the worker posts it when due
Params: id (path, required)
Body fields: post_at
Responses: 200
POST/api/v1/growth/items/{id}/post-nowPost an approved item to X immediately (articles go out as one long post)
Params: id (path, required)
Responses: 200, 400, 409, 502
GET/api/v1/growth/connectionConnected X account state
Responses: 200
DELETE/api/v1/growth/connectionDisconnect the X account
Responses: 200
GET/api/v1/growth/connectionsList connected X accounts (multi-account)
Responses: 200
POST/api/v1/growth/connections/{id}/defaultMake an account the default new content posts from
Responses: 200
PUT/api/v1/growth/profileUpdate the growth profile (voice, goal, audience…)
Responses: 200
PUT/api/v1/growth/channels/{id}Update a platform channel (status, format rules, cadence)
Params: id (path, required)
Responses: 200
POST/api/v1/growth/auditsRun an analytics audit (from synced metrics by default)
Responses: 200
GET/api/v1/growth/audits/{id}Audit result with extracted learnings
Params: id (path, required)
Responses: 200
GET/api/v1/growth/learningsList learnings (what worked / flopped / hypotheses)
Responses: 200
POST/api/v1/growth/learningsAdd a learning
Responses: 200
POST/api/v1/growth/learnings/{id}/retireRetire a learning
Params: id (path, required)
Responses: 200
GET/api/v1/growth/engagementsList engagement suggestions/drafts (replies, quotes)
Responses: 200
POST/api/v1/growth/engagementsDraft an engagement against an X post
Responses: 200
POST/api/v1/growth/engagements/{id}/approveApprove a drafted engagement
Params: id (path, required)
Responses: 200
POST/api/v1/growth/engagements/{id}/rejectReject a drafted engagement
Params: id (path, required)
Responses: 200
POST/api/v1/growth/engagements/{id}/executeExecute an approved engagement on X
Params: id (path, required)
Responses: 200
GET/api/v1/growth/targetsList target accounts
Responses: 200
POST/api/v1/growth/targetsAdd a target account to watch
Responses: 200
PUT/api/v1/growth/targets/{id}Update or pause a target
Params: id (path, required)
Responses: 200
GET/api/v1/growth/signalsList open signals from watched targets
Responses: 200
POST/api/v1/growth/signals/{id}/dismissDismiss a signal
Params: id (path, required)
Responses: 200
POST/api/v1/growth/signals/{id}/engageEngage a signal (drafts a reply/quote)
Params: id (path, required)
Responses: 200
GET/api/v1/growth/productsList products available for self-promotion weaving
Responses: 200
POST/api/v1/growth/productsAdd a product
Responses: 200
PUT/api/v1/growth/products/{id}Update or archive a product
Params: id (path, required)
Responses: 200
GET/api/v1/growth/hooksHook-pattern library with usage stats
Responses: 200
GET/api/v1/growth/reportsList weekly reports
Responses: 200
POST/api/v1/growth/reportsGenerate a weekly report
Responses: 200
GET/api/v1/growth/experimentsList experiments
Responses: 200
POST/api/v1/growth/experimentsCreate an experiment
Responses: 200
POST/api/v1/growth/experiments/{id}/concludeConclude an experiment with a verdict
Params: id (path, required)
Responses: 200
GET/api/v1/growth/rulesList automation rules
Responses: 200
POST/api/v1/growth/rulesCreate an automation rule
Responses: 200
PUT/api/v1/growth/rules/{id}Update an automation rule
Params: id (path, required)
Responses: 200
GET/api/v1/growth/rule-runsList recent automation rule runs
Responses: 200
POST/api/v1/growth/automation/pause-allPause all automation (kill switch)
Responses: 200
POST/api/v1/growth/automation/resume-allResume automation
Responses: 200
POST/api/v1/growth/connect/xBegin the X OAuth connect flow (returns the authorize URL)
Responses: 200
GET/api/v1/growth/connect/x/callbackX OAuth redirect landing (browser flow, unauthenticated)
Params: code (query), state (query)
Responses: 200
actions
POST/api/v1/actions/{name}Execute a registered capability
Params: name (path, required)
Responses: 200, 400, 404, 409, 422
agent
GET/api/v1/agent/conversationsList agent conversations
Params: limit (query)
Responses: 200
POST/api/v1/agent/conversationsCreate an agent conversation
Body fields: title
Responses: 201, 400
GET/api/v1/agent/conversations/{id}Get an agent conversation
Params: id (path, required)
Responses: 200, 404
POST/api/v1/agent/conversations/{id}/messagesPost a user turn and enqueue an agent run
Params: id (path, required)
Body fields: content, model, toolNames
Responses: 201, 400, 404, 409
GET/api/v1/agent/conversations/{id}/feedbackList the current users feedback for one agent conversation
Params: id (path, required)
Responses: 200, 401, 404
POST/api/v1/agent/conversations/{id}/feedbackSubmit feedback for an assistant message
Params: id (path, required)
Body fields: messageId, verdict, correction
Responses: 201, 400, 401, 404, 500
GET/api/v1/agent/feedbackList tenant agent message feedback
Params: verdict (query), since (query), limit (query)
Responses: 200, 400, 401
GET/api/v1/agent/jobs/{id}/traceGet an agent job trace
Params: id (path, required)
Responses: 200, 401, 404, 500
GET/api/v1/agent/jobs/{id}Get an agent job detail, including steps, approvals, and child jobs
Params: id (path, required)
Responses: 200, 401, 404
POST/api/v1/agent/jobs/{id}/cancelCancel an agent job and any non-terminal children
Params: id (path, required)
Responses: 200, 401, 404
GET/api/v1/agent/approvalsList agent approvals
Params: status (query), limit (query)
Responses: 200, 400, 401
GET/api/v1/agent/usageGet tenant agent usage and budget limits
Responses: 200, 401
GET/api/v1/agent/analyticsGet tenant agent analytics
Params: window (query)
Responses: 200, 400, 401
GET/api/v1/agent/tasksList structured agent tasks
Params: limit (query), status (query)
Responses: 200, 401
POST/api/v1/agent/tasksCreate and enqueue a structured agent task
Body fields: taskType, input, tier, model, maxAttempts
Responses: 201, 400, 401, 500
GET/api/v1/agent/tasks/{id}Get structured agent task detail
Params: id (path, required)
Responses: 200, 401, 404
POST/api/v1/agent/tasks/{id}/cancelCancel a queued structured agent task
Params: id (path, required)
Responses: 200, 401, 404, 409
GET/api/v1/agent/playbooksList tenant agent playbooks
Params: status (query)
Responses: 200, 401
POST/api/v1/agent/playbooksCreate a playbook with version 1 active
Body fields: slug, name, description, content, pinned
Responses: 201, 400, 409
GET/api/v1/agent/playbooks/{id}Get a playbook and all versions
Params: id (path, required)
Responses: 200, 404
PATCH/api/v1/agent/playbooks/{id}Update playbook metadata
Params: id (path, required)
Body fields: name, description, pinned, status
Responses: 200, 400, 404
POST/api/v1/agent/playbooks/{id}/versionsCreate a draft playbook version
Params: id (path, required)
Body fields: content, rationale
Responses: 201, 400, 404
POST/api/v1/agent/playbooks/{id}/versions/{versionId}/activateActivate a draft or retired playbook version
Params: id (path, required), versionId (path, required)
Responses: 200, 400, 404
POST/api/v1/agent/playbooks/{id}/versions/{versionId}/rejectReject a draft playbook version
Params: id (path, required), versionId (path, required)
Responses: 200, 400, 404
artifacts
GET/api/v1/artifactsList tenant artifacts
Params: limit (query), cursor (query)
Responses: 200, 401
GET/api/v1/artifacts/{id}Get a tenant artifact and active shares
Params: id (path, required)
Responses: 200, 404
DELETE/api/v1/artifacts/{id}Soft-delete a tenant artifact and revoke its shares
Params: id (path, required)
Responses: 200, 404
GET/api/v1/artifacts/{id}/downloadDownload a tenant artifact as an attachment
Params: id (path, required)
Responses: 200, 404
POST/api/v1/artifacts/{id}/sharesCreate a public artifact share token
Params: id (path, required)
Body fields: expiresInDays
Responses: 201, 404
DELETE/api/v1/artifacts/{id}/shares/{shareId}Revoke an artifact share token
Params: id (path, required), shareId (path, required)
Responses: 200, 404
GET/api/v1/artifacts/shared/{token}Download an artifact through a public share token
Params: token (path, required)
Responses: 200, 404
auth
POST/api/v1/cli/login/startBegin a device-flow CLI login (returns device_code, user_code, verification_url)
Body fields: client_name
Responses: 201
POST/api/v1/cli/login/pollPoll a device-flow login; returns the API key once approved
Body fields: device_code
Responses: 200, 404, 410
POST/api/v1/cli/login/approveApprove a pending CLI login with its user code (session auth)
Body fields: user_code
Responses: 200, 404
channels
GET/api/v1/channelsList channel adapters and tenant connections
Responses: 200, 401
POST/api/v1/channelsCreate a channel connection
Body fields: channel, routingKey, displayName, senderPolicy, config, credentials
Responses: 201, 400, 401, 409
PATCH/api/v1/channels/{id}Update a channel connection
Params: id (path, required)
Responses: 200, 400, 401, 404
DELETE/api/v1/channels/{id}Delete a channel connection
Params: id (path, required)
Responses: 200, 401, 404
core
GET/healthHealth check
Responses: 200
POST/webhooks/channels/{channel}Receive signed inbound channel webhooks
Params: channel (path, required)
Responses: 200, 401, 404, 503
documents
GET/api/v1/documentsList tenant documents
Params: limit (query)
Responses: 200
POST/api/v1/documentsCreate a tenant document and enqueue ingest
Body fields: fileName, mimeType, content, metadata
Responses: 201, 400, 409, 500
GET/api/v1/documents/{id}Get a tenant document
Params: id (path, required)
Responses: 200, 404
DELETE/api/v1/documents/{id}Delete a tenant document
Params: id (path, required)
Responses: 200, 404
POST/api/v1/documents/{id}/retryRetry a failed document ingest
Params: id (path, required)
Responses: 202, 404, 409
mcp
GET/api/v1/mcpMCP Streamable HTTP SSE endpoint
Responses: 200, 401, 403
POST/api/v1/mcpMCP Streamable HTTP endpoint
Responses: 200, 401, 403
DELETE/api/v1/mcpTerminate an MCP Streamable HTTP session
Responses: 200, 401, 403
GET/api/v1/mcp/serversList external MCP servers for the tenant
Responses: 200
POST/api/v1/mcp/serversCreate an external MCP server config
Body fields: name, transport, url, command, args, headers, env, toolPrefix, enabled, metadata
Responses: 201, 400
DELETE/api/v1/mcp/servers/{id}Delete an external MCP server config
Params: id (path, required)
Responses: 200