API Reference

Complete endpoint reference for the Growhold REST API and MCP server.

Authentication

All API requests require an API key. Create and manage keys from the API & Devs page in your workspace settings.

API keys

API keys start with gh_ and are scoped with permissions for specific domains: knowledge, runs, schedules, agents, and specialists. Keys are hashed before storage. Copy your secret immediately after creation.

Request format

All API calls use a single POST endpoint with action-based routing. Send your key as a Bearer token and the action as a JSON field.

Base URL

https://app.growhold.com/functions/v1/api

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "agents.list"}'

Knowledge

Add, list, remove, and apply knowledge entries to agents and specialists.

knowledge.list

List knowledge entries, optionally filtered by agent or specialist.

NameTypeRequiredDescription
agent_idstringNoFilter by agent
specialist_idstringNoFilter by specialist

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "knowledge.list"}'

Response

{
  "knowledge": [
    {
      "id": "uuid",
      "name": "Product FAQ",
      "type": "text",
      "chunk_count": 12,
      "created_at": "2026-03-01T10:00:00Z"
    }
  ]
}

knowledge.add

Add a knowledge entry. Provide either text content or a file URL. Content is automatically chunked and embedded.

NameTypeRequiredDescription
namestringYesDisplay name
contentstringNoText content (use this or file_url)
file_urlstringNoURL to a file to ingest
agent_idstringNoAttach to agent
specialist_idstringNoAttach to specialist

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "knowledge.add",
    "name": "Product FAQ",
    "content": "Q: What is Growhold?\nA: An AI agent platform."
  }'

Response

{
  "knowledge": {
    "id": "new-uuid",
    "name": "Product FAQ",
    "type": "text",
    "chunk_count": 3
  }
}

knowledge.remove

Remove a knowledge entry and all its embeddings.

NameTypeRequiredDescription
knowledge_idstringYesEntry to remove

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "knowledge.remove", "knowledge_id": "uuid"}'

Response

{ "deleted": true }

knowledge.apply

Apply an existing knowledge entry to an agent or specialist.

NameTypeRequiredDescription
knowledge_idstringYesKnowledge entry
agent_idstringNoTarget agent
specialist_idstringNoTarget specialist

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "knowledge.apply", "knowledge_id": "uuid", "agent_id": "agent-uuid"}'

Response

{ "applied": true }

Agent Runs

Start, monitor, pause, and stop agent runs. Retrieve output cards with content, images, and charts.

runs.list

List agent runs, newest first.

NameTypeRequiredDescription
agent_idstringNoFilter by agent
limitnumberNoMax results (default 50)

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "runs.list"}'

Response

{
  "runs": [
    {
      "id": "run-uuid",
      "name": "Market Analysis Q1",
      "auto_status": "completed",
      "created_at": "2026-03-31T10:00:00Z",
      "agent": { "id": "agent-uuid", "name": "Market Analyzer" }
    }
  ]
}

runs.get

Get full details of a run including cards, assistant progress, and status.

NameTypeRequiredDescription
run_idstringYesThe run ID

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "runs.get", "run_id": "run-uuid"}'

Response

{
  "run": {
    "id": "run-uuid",
    "name": "Market Analysis Q1",
    "auto_status": "completed",
    "card": [
      {
        "id": "card-uuid",
        "order_id": 1,
        "markdown_content": "## Analysis\n..."
      }
    ],
    "run_assistant": [
      { "id": "ra-uuid", "summary": "Completed" }
    ]
  }
}

runs.start

Start a new async agent run. Returns immediately with the run ID. Poll runs.get for status.

NameTypeRequiredDescription
agent_idstringYesAgent to run
namestringNoCustom run name
goalstringNoGoal for the run
input_valuesobjectNoInput field values

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "runs.start",
    "agent_id": "agent-uuid",
    "name": "Weekly Report",
    "goal": "Generate the weekly market report"
  }'

Response

{
  "run_id": "new-run-uuid",
  "name": "Weekly Report",
  "status": "running"
}

runs.stop

Stop a running agent permanently.

NameTypeRequiredDescription
run_idstringYesRun to stop

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "runs.stop", "run_id": "run-uuid"}'

Response

{ "run_id": "run-uuid", "status": "stopped" }

runs.pause

Pause a running agent. Use runs.resume to continue.

NameTypeRequiredDescription
run_idstringYesRun to pause

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "runs.pause", "run_id": "run-uuid"}'

Response

{ "run_id": "run-uuid", "status": "paused" }

runs.resume

Resume a paused agent run.

NameTypeRequiredDescription
run_idstringYesRun to resume

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "runs.resume", "run_id": "run-uuid"}'

Response

{ "run_id": "run-uuid", "status": "running" }

Cards

Retrieve output cards with markdown content, structured JSON, images, and charts. File URLs are signed and valid for 1 hour.

cards.list

List output cards for a run.

NameTypeRequiredDescription
run_idstringYesThe run ID

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "cards.list", "run_id": "run-uuid"}'

Response

{
  "cards": [
    {
      "id": "card-uuid",
      "order_id": 1,
      "markdown_content": "## Report\n...",
      "image_url": "https://...",
      "is_starred": true
    }
  ]
}

cards.get

Get a single card with full content and attached files (images, charts). File URLs are signed.

NameTypeRequiredDescription
card_idstringYesThe card ID

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "cards.get", "card_id": "card-uuid"}'

Response

{
  "card": {
    "id": "card-uuid",
    "markdown_content": "## Report\n...",
    "content_json": { ... },
    "image_url": "https://..."
  },
  "files": [
    {
      "id": "file-uuid",
      "file_name": "chart.png",
      "signed_url": "https://..."
    }
  ]
}

Schedules

Create and manage scheduled agent runs using cron expressions.

schedules.list

List all schedules in the workspace.

NameTypeRequiredDescription
agent_idstringNoFilter by agent

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "schedules.list"}'

Response

{
  "schedules": [
    {
      "id": "schedule-uuid",
      "name": "Weekly Report",
      "cron": "0 9 * * 1",
      "is_active": true,
      "next_run_at": "2026-03-31T09:00:00Z"
    }
  ]
}

schedules.create

Create a new schedule.

NameTypeRequiredDescription
agent_idstringYesAgent to schedule
namestringYesSchedule name
cronstringYesCron expression (e.g. "0 9 * * 1")
goalstringNoGoal for each run
input_valuesobjectNoInput values per run

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "schedules.create",
    "agent_id": "agent-uuid",
    "name": "Daily Summary",
    "cron": "0 8 * * *"
  }'

Response

{
  "schedule": {
    "id": "new-uuid",
    "name": "Daily Summary",
    "cron": "0 8 * * *",
    "is_active": true
  }
}

schedules.update

Update schedule settings. Only provided fields are changed.

NameTypeRequiredDescription
schedule_idstringYesSchedule ID
namestringNoNew name
cronstringNoNew cron expression
goalstringNoNew goal

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "schedules.update", "schedule_id": "uuid", "cron": "0 10 * * 1-5"}'

Response

{ "schedule": { "id": "uuid", "cron": "0 10 * * 1-5", "is_active": true } }

schedules.delete

Delete a schedule permanently.

NameTypeRequiredDescription
schedule_idstringYesSchedule to delete

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "schedules.delete", "schedule_id": "uuid"}'

Response

{ "deleted": true }

schedules.pause

Pause a schedule. Runs stop triggering until resumed.

NameTypeRequiredDescription
schedule_idstringYesSchedule to pause

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "schedules.pause", "schedule_id": "uuid"}'

Response

{ "schedule_id": "uuid", "is_active": false }

schedules.resume

Resume a paused schedule.

NameTypeRequiredDescription
schedule_idstringYesSchedule to resume

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "schedules.resume", "schedule_id": "uuid"}'

Response

{ "schedule_id": "uuid", "is_active": true }

Cron expression reference

# Format: minute hour day-of-month month day-of-week
#
# "0 9 * * *"     Every day at 9:00 AM UTC
# "0 9 * * 1"     Every Monday at 9:00 AM UTC
# "0 9 * * 1-5"   Weekdays at 9:00 AM UTC
# "0 */6 * * *"   Every 6 hours
# "30 14 1 * *"   1st of each month at 2:30 PM UTC

Agents & Specialists

List and inspect agents and specialists in your workspace.

agents.list

List all agents with their assistants.

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "agents.list"}'

Response

{
  "agents": [
    {
      "id": "agent-uuid",
      "name": "Market Analyzer",
      "deliverable": "Market Report",
      "assistant": [
        { "id": "asst-uuid", "name": "Research Analyst" }
      ]
    }
  ]
}

agents.get

Get agent details.

NameTypeRequiredDescription
agent_idstringYesAgent ID

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "agents.get", "agent_id": "agent-uuid"}'

Response

{ "agent": { "id": "agent-uuid", "name": "Market Analyzer", ... } }

specialists.list

List all specialists.

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "specialists.list"}'

Response

{
  "specialists": [
    { "id": "uuid", "name": "SEO Expert", "is_default": false }
  ]
}

specialists.get

Get specialist details.

NameTypeRequiredDescription
specialist_idstringYesSpecialist ID

Example

curl -X POST https://app.growhold.com/functions/v1/api \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"action": "specialists.get", "specialist_id": "uuid"}'

Response

{ "specialist": { "id": "uuid", "name": "SEO Expert", ... } }

MCP Server

Connect Growhold to Claude Desktop, Cursor, or any MCP-compatible AI client using the Model Context Protocol.

Setup

Add the MCP server to your Claude Desktop configuration. On macOS, edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "growhold": {
      "url": "https://app.growhold.com/functions/v1/mcp",
      "headers": {
        "Authorization": "Bearer gh_your_api_key"
      }
    }
  }
}

Available tools

The MCP server exposes all API actions as tools. Tool availability depends on your API key permissions.

ToolPermissionDescription
knowledge_listknowledgeList knowledge entries
knowledge_addknowledgeAdd text or file as knowledge
knowledge_removeknowledgeRemove a knowledge entry
knowledge_applyknowledgeApply knowledge to agent/specialist
runs_listrunsList agent runs
runs_getrunsGet run details with cards
runs_startrunsStart an async agent run
runs_stoprunsStop a running agent
runs_pauserunsPause a running agent
runs_resumerunsResume a paused agent
cards_listrunsList output cards for a run
cards_getrunsGet card with signed file URLs
schedules_listschedulesList schedules
schedules_createschedulesCreate a schedule
schedules_updateschedulesUpdate a schedule
schedules_deleteschedulesDelete a schedule
schedules_pauseschedulesPause a schedule
schedules_resumeschedulesResume a schedule
agents_listagentsList agents
agents_getagentsGet agent details
specialists_listspecialistsList specialists
specialists_getspecialistsGet specialist details

Raw JSON-RPC

For custom MCP clients, send JSON-RPC 2.0 requests directly:

List tools

curl -X POST https://app.growhold.com/functions/v1/mcp \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'

Call a tool

curl -X POST https://app.growhold.com/functions/v1/mcp \
  -H "Authorization: Bearer gh_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "agents_list",
      "arguments": {}
    }
  }'

Error Handling

API errors return a JSON object with an error field and an appropriate HTTP status code.

{ "error": "Invalid or expired API key" }
StatusMeaning
400Bad request, missing or invalid parameters
401Missing or invalid API key
403Insufficient permissions for this action
404Resource not found
500Internal server error