---
title: "Launch Nurture"
method: POST
path: "/nurtures/{nurture_id}/launch"
tags: ["Sequences"]
---

# Launch Nurture

`POST /nurtures/{nurture_id}/launch`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/nurtures/{nurture_id}/launch`
- Auth: HTTP bearer

Launch a nurture. THIS SENDS REAL MESSAGES TO REAL PEOPLE.

Proxies the same v2 run flow the app's Go-Live button uses, so enrollment,
schedule and consent checks are identical.

WHY THE PATH IS `/launch` AND NOT THE APP'S `/run/v2`
-----------------------------------------------------
Two reasons, and the second is the load-bearing one.

The `v2` suffix is noise: v1 was removed on 2026-04-21, so there is nothing
left to disambiguate from on a public surface.

`launch` rather than `run` is what gets this operation the right SCOPE.
`build_scope_policy.EXTERNAL_PATH_MARKERS` contains `/launch`, `/send` and
`/publish` - the fragments that mean "this reaches the outside world" - and
an external-tier operation resolves to the `run` ACTION, so the key needs
an explicit `sequences:run` grant rather than plain `sequences:write`. As
`/run` this endpoint classified as an ordinary write, one tier below the
identical `POST /sequences/{id}/run`, which is external. Sending real email
to real people is the definition of external, and the customer issuing a
key should be able to grant "edit my nurtures" without granting "start
sending".

## Path parameters

- `nurture_id` string, required: Nurture id.

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Response `200`

Successful Response

- ApiResponseDict
  - `data` object, required
  - `pagination` PaginationMeta
    - `page` integer, required: Current page number (1-indexed)
    - `limit` integer, required: Items per page
    - `total` integer, required: Total number of items
    - `has_next` boolean, required: Whether there are more pages
    - `next_cursor` string, nullable: Opaque cursor for the next page; null when there are no more items. Pass it back as the `cursor` query param to fetch the following page without computing page numbers.
    - `total_available` integer, nullable: Search endpoints only: how many records really match, when known. Can be larger than `total`, which is capped at the 10,000 results that can be paged. For company search this is a distinct-company estimate. Null when unknown; absent outside search.
    - `total_is_lower_bound` boolean, nullable: Search endpoints only: true when more records match than `total` shows (the result set is larger than the 10,000 results that can be paged). Absent outside search.
    - `notes` string[], nullable: Search endpoints only: plain-language notes about the result, e.g. that more records match than can be paged, or that a reversed `between` range was put in order.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/graph8/apis/graph8-developer-api.md) · [All operations](https://skmtc.dev/graph8/apis/graph8-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/graph8/apis/graph8-developer-api/revisions/2e7cfa0ca921?raw)
