Docs
Plans

One plan

GEThttps://api.norreach.app/v1/plans/{id}

A plan with its Overview numbers: how many leads stand at each stage of its arc, and how many people it found (and how many became contacts).

plans:readOperation id: get_plan
GET/plans/{id}
curl -X GET "https://api.norreach.app/v1/plans/{id}" \
  -H "Authorization: Bearer $NORREACH_API_KEY"
One plan
{
  "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",
  "overview": {
    "arc": {
      "curiosity": 40,
      "awareness": 22,
      "consideration": 9,
      "proof": 4,
      "offer": 2,
      "urgency": 0,
      "decision": 1
    },
    "pool": {
      "total": 120,
      "unlocked": 30,
      "waiting": 90
    }
  }
}

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

Path parameters

idstring (uuid)pathrequired

An id (UUID).

Response

200application/json— One plan

idstring (uuid)required

An id (UUID).

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

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

One of:haveneed
start_datestring | nullrequired
end_datestring | nullrequired
rationalestring | nullrequired

Nora's reasoning for the plan's shape.

kpisstring[]required
budgetobjectrequired
Show child attributes
budget.totalobjectrequired

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

Show child attributes
budget.total.amount_minorintegerrequired
budget.total.currencystringrequired
budget.per_weekobjectrequired

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

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

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

Show child attributes
budget.split[].amount.amount_minorintegerrequired
budget.split[].amount.currencystringrequired
budget.split[].cost_classenumrequired
One of:freelowhighcustomer
budget.split[].notestringrequired
autonomyobjectrequired

What Nora may do in this plan without asking.

Show child attributes
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
autonomy.policiesobjectrequired

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

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

What Nora is doing now (her own words).

generation.donebooleanrequired

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

generation.failedbooleanrequired
created_atstring | nullrequired
overviewobjectrequired

The plan's Overview numbers.

Show child attributes
overview.arcobject | nullrequired

How many leads stand at each stage of the plan's arc (null = couldn't be counted).

overview.poolobject | nullrequired

People found for the plan: all of them, those who became contacts, those still waiting.

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.
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.
404not_foundThat doesn't exist.
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.