Applications
Docs / Control plane

Applications

An Application is one of your products. List, create, read. Every send names one, so "which product sent this?" is a filter. Create respects the plan's application cap.

Authentication

Authorization: Bearer spw_

List and show need applications:read. Create needs applications:write. Endpoints: GET /v1/applications, POST /v1/applications, GET /v1/applications/{id}.

Create parameters

namestring ≤ 255requiredDisplay name.
slugstring ≤ 64requiredalpha_dash. Unique per account.
environmentenumrequiredprod | staging | dev.
daily_send_limitinteger ≥ 1optionalPer-app daily cap; null inherits account.

Worked example

curl -X POST https://spoolway.com/api/v1/applications \
  -H "Authorization: Bearer spw_…" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Billing", "slug": "billing-prod", "environment": "prod" }'
201 Createdcaptured LOCAL
{
  "data": {
    "id": 2,
    "name": "Billing",
    "slug": "billing-prod",
    "environment": "prod",
    "daily_send_limit": null,
    "default_transport_id": null,
    "archived_at": null,
    "created_at": "2026-08-06T08:11:01+00:00"
  }
}
200 list
{
  "data": [
    {
      "id": 2,
      "name": "Billing",
      "slug": "billing-prod",
      "environment": "prod",
      "daily_send_limit": null,
      "default_transport_id": null,
      "archived_at": null,
      "created_at": "2026-08-06T08:11:01+00:00"
    },
    {
      "id": 1,
      "name": "App",
      "slug": "app",
      "environment": "prod",
      "daily_send_limit": null,
      "default_transport_id": 1,
      "archived_at": null,
      "created_at": "2026-08-06T08:11:00+00:00"
    }
  ],
  "next_cursor": null
}

Show

One application by id. Same object as a list row. Cross-account is 404.

curl https://spoolway.com/api/v1/applications/2 \
  -H "Authorization: Bearer spw_…"
200 showcaptured LOCAL
{
  "data": {
    "id": 2,
    "name": "Billing",
    "slug": "billing-prod",
    "environment": "prod",
    "daily_send_limit": null,
    "default_transport_id": null,
    "archived_at": null,
    "created_at": "2026-08-06T08:11:01+00:00"
  }
}

Responses & failures

422slug already on this account
response body
{
  "message": "An application with this slug already exists on this account."
}
What to do: pick a free slug or use the existing application. Plan cap exhaustion is also 422 with type: plan_limit.

401 / 403 as on every other surface. Cross-account show is 404.