Plans

Public API

Run any marketing App from your own system

Every SupaMarketers App is available as a JSON API. Create a run, stream live progress over SSE, and fetch the finished report — with the same API key, Credits balance, and run history as the website.

Quick start

Create an API key in Settings → API Keys (the same key works for MCP), then create a run:

curl -X POST https://api.TODO-APP-DOMAIN/api/v1/runs \
  -H "Authorization: Bearer $SUPAMARKETERS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"app_slug":"oss-growth","input":{"repo_url":"https://github.com/your-org/your-repo"}}'

Subscribe to progress events — the stream survives reconnects via Last-Event-ID:

curl -N https://api.TODO-APP-DOMAIN/api/v1/runs/{run_no}/events \
  -H "Authorization: Bearer $SUPAMARKETERS_API_KEY"

Fetch the finished result once the run reaches a terminal status:

curl https://api.TODO-APP-DOMAIN/api/v1/runs/{run_no} \
  -H "Authorization: Bearer $SUPAMARKETERS_API_KEY"

Replace $SUPAMARKETERS_API_KEY with your key.

Authentication

All endpoints require a Bearer API key in the Authorization header. Create one under Settings → API Keys after signing up. The same key authenticates the MCP surface; a key grants access to the resources of the account that created it.

Authorization: Bearer $SUPAMARKETERS_API_KEY

Base URL

The canonical origin is https://api.TODO-APP-DOMAIN with the same paths as the website origin (https://www.TODO-APP-DOMAIN/api/v1/... also works). All request and response URLs returned by the API are relative paths — resolve them against the origin you called.

Credits & dynamic pricing

Every run consumes Credits from the key owner's balance, prepaid at creation and refunded on failure. Prices are calibrated against real run costs, so they adjust over time — treat the credit_cost returned when creating a run as the authoritative price, not a number cached from documentation. Current prices are always visible in the capability list and on each App's reference page.

Rate & concurrency limits

Limits protect shared capacity and answer with 429 plus a Retry-After header.

SurfaceLimit
Run creation (POST /api/v1/runs)10 / min
Reads (capabilities, run status, events)120 / min
Concurrent active runs per key owner3
Concurrent active runs, platform-wide (all users)12

Per API key unless noted

Error codes

Errors share one envelope: {"error":{"code","message"}}.

HTTPcodeMeaning
400invalid_requestMalformed body, non-JSON content, or file fields (the API is JSON-only)
401unauthorizedMissing or invalid Bearer API key
402insufficient_creditsBalance below the locked credit cost
404app_not_found / run_not_foundUnknown or non-runnable App slug
409pricing_not_readyApp price missing, changed, or recalibrating — retry
422invalid_inputInput schema validation failure
422invalid_brand_contextbrand_context_id rejected
429rate_limitedRate limit exceeded — retry after Retry-After seconds
429concurrency_limitActive-run ceiling reached (per key owner or platform-wide) — wait for a run to finish
500 / 503internal_errorUnexpected server error or busy database — safe to retry

Progress streaming (SSE)

GET /api/v1/runs/{run_no}/events streams the run's event log as Server-Sent Events. Event types: started, tool_running, completed, failed; heartbeats arrive as SSE comments. Pass the last received sequence id via the Last-Event-ID header (or lastEventSeq query parameter) to resume exactly where a dropped connection left off. Clients that cannot hold a connection may poll GET /api/v1/runs/{run_no} instead.

Ready for API use63

These Apps accept JSON input and can run end to end through the API. Each links to a full reference page.