Docs
Plans

List plans

GEThttps://api.norreach.app/v1/plans

The workspace's plans — each one Nora wrote from a brief — newest first, a page at a time, with their budget, autonomy, channels and how many cards are done or waiting for a person.

plans:readOperation id: list_plans
GET/plans
curl -X GET "https://api.norreach.app/v1/plans" \
  -H "Authorization: Bearer $NORREACH_API_KEY"
List plans
{
  "object": "list",
  "data": [
    {
      "id": "6a7b8c9d-0e1f-4a2b-8c3d-4e5f6a7b8c9d",
      "object": "plan",
      "name": "Example Care — 20 new nurse placements in Stockholm",
      "status": "review",
      "goal_type": "lead_gen",
      "playbook": "Local services",
      "brand_name": "Example Care",
      "lead_status": "have",
      "start_date": "2026-11-10",
      "end_date": "2026-12-09",
      "rationale": "Clinics decide in two weeks; the plan warms them with proof before it asks.",
      "kpis": [
        "Meetings booked",
        "Cost per lead"
      ],
      "budget": {
        "total": {
          "amount_minor": 1500000,
          "currency": "SEK"
        },
        "per_week": {
          "amount_minor": 350000,
          "currency": "SEK"
        },
        "split": [
          {
            "label": "Meta ads",
            "amount": {
              "amount_minor": 1000000,
              "currency": "SEK"
            },
            "cost_class": "high",
            "note": "Two weeks of lead ads"
          }
        ]
      },
      "autonomy": {
        "preset": "auto_veto",
        "policies": {
          "quiet_hours": true,
          "disclosure": true,
          "ai_call": false
        }
      },
      "channels": [
        {
          "channel": "email",
          "role": "recommended",
          "enabled": true
        },
        {
          "channel": "paid_ad",
          "role": "optional",
          "enabled": true
        }
      ],
      "cards": {
        "total": 24,
        "completed": 0,
        "awaiting_approval": 3
      },
      "generation": {
        "step": 7,
        "total": 7,
        "note": "done",
        "done": true,
        "failed": false
      },
      "created_at": "2026-11-04T09:12:33.120Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Authorizations

Authorizationstringheaderrequired

Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope plans:read. API keys and scopes

Query parameters

limitintegerquery

Page size (1–200, default 50).

cursorstringquery

The next_cursor of the previous page.

statusenumquery
One of:generatingreviewactivepausedcompletedfailed
goal_typeenumquery
One of:brand_awarenesslead_gennurture

Response

200application/json— List plans

object"list"required
dataobject[]required
Show child attributes
data[].idstring (uuid)required

An id (UUID).

data[].object"plan"required
data[].namestring | nullrequired
data[].statusenumrequired
One of:generatingreviewactivepausedcompletedfailed
data[].goal_typeenumrequired
One of:brand_awarenesslead_gennurture
data[].playbookstring | nullrequired
data[].brand_namestring | nullrequired
data[].lead_statusenumrequired

have = the plan works on the workspace's own contacts; need = it finds people first.

One of:haveneed
data[].start_datestring | nullrequired
data[].end_datestring | nullrequired
data[].rationalestring | nullrequired

Nora's reasoning for the plan's shape.

data[].kpisstring[]required
data[].budgetobjectrequired
Show child attributes
data[].budget.totalobjectrequired

Money in integer minor units (öre, cents).

Show child attributes
data[].budget.total.amount_minorintegerrequired
data[].budget.total.currencystringrequired
data[].budget.per_weekobjectrequired

Money in integer minor units (öre, cents).

Show child attributes
data[].budget.per_week.amount_minorintegerrequired
data[].budget.per_week.currencystringrequired
data[].budget.splitobject[]required
Show child attributes
data[].budget.split[].labelstringrequired
data[].budget.split[].amountobjectrequired

Money in integer minor units (öre, cents).

data[].budget.split[].cost_classenumrequired
One of:freelowhighcustomer
data[].budget.split[].notestringrequired
data[].autonomyobjectrequired

What Nora may do in this plan without asking.

Show child attributes
data[].autonomy.presetenumrequired

ask_everything = every piece waits for a person; auto_veto = Nora goes ahead unless you stop her; full_auto = Nora runs it.

One of:ask_everythingauto_vetofull_auto
data[].autonomy.policiesobjectrequired

Per-kind switches. quiet_hours and disclosure are always on.

data[].channelsobject[]required
Show child attributes
data[].channels[].channelstringrequired
data[].channels[].roleenumrequired
One of:recommendedoptional
data[].channels[].enabledbooleanrequired
data[].cardsobjectrequired
Show child attributes
data[].cards.totalintegerrequired
data[].cards.completedintegerrequired
data[].cards.awaiting_approvalintegerrequired
data[].generationobjectrequired
Show child attributes
data[].generation.stepintegerrequired
data[].generation.totalintegerrequired
data[].generation.notestringrequired

What Nora is doing now (her own words).

data[].generation.donebooleanrequired

The plan is written (it is in review or later).

data[].generation.failedbooleanrequired
data[].created_atstring | nullrequired
has_morebooleanrequired
next_cursorstring | nullrequired

Errors

Errors are application/problem+json with a stable code.

StatusCodeMeaning
400bad_requestThe request couldn't be read.
400unknown_fieldThe request has a field this operation doesn't know.
400invalid_cursorThat cursor doesn't belong to this list.
401unauthorizedA valid API key is required.
403insufficient_scopeThis API key doesn't have the scope this operation needs.
403feature_not_enabledThe API isn't switched on for this workspace.
429rate_limitedToo many requests. Slow down and try again.
500server_errorSomething went wrong on our side.
503unavailableThe API isn't available right now. Try again shortly.