Merge a plan into another
POST
/v1/plans/:id/merge
curl -X POST "https://api.summerbase.com/v1/plans/:id/merge" \ -H "Authorization: Bearer sb_..." \ -H "Content-Type: application/json" \ -d '{ "merged_plan_id": "stripe:prod_QhR2sT4uV6wX8y" }'const response = await fetch("https://api.summerbase.com/v1/plans/:id/merge", { method: "POST", headers: { Authorization: "Bearer sb_...", "Content-Type": "application/json", }, body: JSON.stringify({ "merged_plan_id": "stripe:prod_QhR2sT4uV6wX8y" }),})const data = await response.json()Merge another plan into this one: its prices, identities and properties move here, and it is deleted. Every chart by plan then reads its prices under this plan, as far back as they go.
It cannot be undone. Moving a price back onto a plan of its own is a
PATCH of the price.
Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”id
required
string
The plan’s Summerbase id, or an identity ref: a source slug and that
source’s own id for it, joined by a colon — stripe:prod_123.
Example
backend:growthQuery Parameters
Section titled “Query Parameters”expand[]
Array<string>
Relationships to include in the response instead of fetching separately. A dotted path expands what an expanded record can expand in turn — at most 4 deep, 10 paths a request, and never back to a record already on the path.
Request Bodyrequired
Section titled “Request Bodyrequired”Media typeapplication/json
object
merged_plan_id
required
The plan to merge into this one, which is deleted — a Summerbase id, or a source identity.
string
Example
{ "merged_plan_id": "stripe:prod_QhR2sT4uV6wX8y"}Response
Section titled “Response”Returns the plan object.
Media typeapplication/json
Example
{ "archived": false, "created_at": "2025-09-08T14:12:30Z", "id": "0198f1a4-1d2e-7a40-9b31-5c6d7e8f9a0b", "identities": [ "stripe:prod_QhR2sT4uV6wX8y" ], "name": "Growth", "object": "plan", "price_count": 2, "properties": { "tier": "mid" }, "properties_by_source": { "backend": { "tier": "mid" } }}