Plans

Start the next season

curl -X POST https://api.subscriby.net/v1/projects/7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13/plans/$SERIES_PLAN/successor \
  -H "Authorization: Bearer sbt_..." \
  -H "Idempotency-Key: $(uuidgen)"

The plan list's "start next season" button. For a kind: pass_series plan only: creates a new pass_series plan copied from the one named, its price, currency, description, eligibility, linked resources, overlap rule, sales cutoff and seat cap, with two deliberate differences: it is created inactive, and its slate is empty, because a season that went straight on sale with last year's dates would be selling something that has already happened. Rules are carried forward with their date bounds shifted by the length of the finished season; the slate itself and any blackouts are not, since both name windows that have run.

The old season's successor_plan_id is pointed at the new plan (and a presale window is set if the old season had none), which is what lets current holders be offered the next season first. Answers 201 with the new plan in the same discriminated shape as any other read and emits plan.created for it. Compose it with a PATCH (pass_series.window_ids or pass_series.rules) and put it on sale with publish.

Not idempotent across calls. Call it once per season. Every call creates another plan, named after the source with a season number appended, and re-points the old season's successor at the newest one. Read the source plan first: if pass_series.successor_plan_id is already set, the next season exists. The Idempotency-Key protects a retry of the same call, not a second call with a new key.

post/v1/projects/{project}/plans/{plan}/successor

Request

  • Base URL: https://api.subscriby.net
  • URL: https://api.subscriby.net/v1/projects/{project}/plans/{plan}/successor
  • Auth: HTTP bearer

Path parameters

projectstring uuid required

The project, resolved by the route binder.

planstring uuid required

The finished season, resolved within the project by the route binder.

Headers

Idempotency-Keystring uuid required

A key unique to this operation, such as a fresh UUID. The same key replays the original 2xx response for 24 hours (with Idempotent-Replay: true), so a retry after a timeout never repeats the write; the same key with a different body is refused with 409.

Response

The new season, 201, inactive with an empty slate.

Example response

{
  "data": {
    "id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
    "project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
    "kind": "subscription",
    "name": "Premium Monthly",
    "description": "Unlimited access to the research channel.",
    "price": "29.00",
    "currency": {
      "id": "8f27a0d4-63be-4915-8c07-1a5d9e34b628",
      "iso": "USD",
      "symbol": "$"
    },
    "active": true,
    "sales_cap": 10,
    "sales_cap_sold": 3,
    "cadence": "Per Month",
    "resources": [
      {
        "id": "b73c5f21-9d80-4a6e-8215-4f70ce13a9d6",
        "name": "Research channel",
        "kind": "telegram:supergroup",
        "connector": "telegram"
      }
    ],
    "billing": {
      "billing_cycle": "month",
      "billing_cycle_count": 1,
      "recurring": true,
      "trial_days": 7,
      "trial_type": "plan"
    },
    "pass": {
      "timezone": "America/New_York",
      "schedule_mode": "repeating",
      "recurrence": "weekly",
      "sales_cutoff_minutes": 60,
      "sales_cutoff_anchor": "before_start",
      "slots": [
        {
          "start_time": "09:00",
          "duration_minutes": 840
        }
      ],
      "upcoming_windows": [
        {
          "id": "3d5a8c72-b016-4e94-8fa7-61c209d4e738",
          "starts_at": "2026-09-20T13:00:00Z",
          "ends_at": "2026-09-21T03:00:00Z",
          "status": "scheduled"
        }
      ]
    },
    "pass_series": {
      "timezone": "America/New_York",
      "prevent_overlaps": true,
      "sales_cutoff_anchor": "before_start",
      "seat_cap": 50,
      "seats_taken": 37,
      "seats_remaining": 13,
      "starts_at": "2026-09-20T13:00:00Z",
      "ends_at": "2026-11-29T22:00:00Z",
      "window_count": 10,
      "presale_hours": 48,
      "windows": [
        {
          "id": "3d5a8c72-b016-4e94-8fa7-61c209d4e738",
          "plan_id": "0b8e6a2f-4c1d-4e3a-9f52-7d6c1b2a3e45",
          "plan_name": "Match Day Pass",
          "starts_at": "2026-09-20T13:00:00Z",
          "ends_at": "2026-09-20T16:00:00Z",
          "status": "scheduled"
        }
      ],
      "rules": [
        {
          "source_plan_id": "0b8e6a2f-4c1d-4e3a-9f52-7d6c1b2a3e45",
          "kind": "date_range",
          "from_at": "2026-09-01T00:00:00Z",
          "to_at": "2026-12-01T00:00:00Z"
        }
      ]
    },
    "created_at": "2026-05-18T10:05:00Z",
    "updated_at": "2026-05-18T10:05:00Z"
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.