Skip to content

Subscription

Billing state for the account behind the current brand. An account is the billing container: it holds one subscription and owns one or more brands.

GET /subscription/status

json
{
  "subscribed": true,
  "on_trial": false,
  "status": "active",
  "plan": { "id": 3, "name": "Solo", "slug": "solo", "popular": true },
  "interval": "month",
  "next_billing_date": "2026-09-14T00:00:00.000000Z",
  "on_grace_period": false,
  "trial_ends_at": null
}
FieldNotes
statustrialing, active, cancelled, or the raw Stripe status
intervalmonth or year, null with no subscription
on_grace_periodCancelled but still paid up to next_billing_date

GET /subscription/plans

Plans available to subscribe to, with their Stripe price ids.

json
[
  {
    "id": 3,
    "name": "Solo",
    "slug": "solo",
    "popular": true,
    "features": { "brands": 1, "storage_limit": 5 },
    "prices": [
      { "stripe_id": "price_...", "interval": "month", "amount": 29.0, "currency": "EUR" },
      { "stripe_id": "price_...", "interval": "year", "amount": 290.0, "currency": "EUR" }
    ]
  }
]

POST /subscription/checkout

Start a Stripe Checkout session.

bash
curl -X POST https://api.postlyra.com/subscription/checkout \
  -H "Authorization: Bearer $POSTLYRA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"plan_id": 3, "interval": "month"}'
json
{ "url": "https://checkout.stripe.com/c/pay/..." }

Send the user to url. interval must be month or year.

POST /subscription/switch

Change plan on an existing subscription. Same body as checkout.

json
{ "message": "Plan updated successfully." }

Returns 422 No active subscription found. if there is nothing to switch.

Cancelling

There is no cancel endpoint. Cancel from Studio, under Billing, which opens the Stripe billing portal.

Public plans

GET /public/plans needs no authentication. It is what a pricing page reads, cached for 5 minutes, and it returns prices in cents:

json
{
  "plans": [
    {
      "slug": "solo",
      "location": "default",
      "popular": true,
      "sort_order": 1,
      "name": { "en": "Solo" },
      "description": { "en": "For one person running their own social media." },
      "prices": {
        "monthly": { "amount": 2900, "currency": "EUR" },
        "yearly": { "amount": 29000, "currency": "EUR" }
      },
      "features": { "brands": 1, "storage_limit": 5 }
    }
  ],
  "generated_at": "2026-08-15T09:00:00+00:00"
}

Only plans that are active, visible, and have both a monthly and a yearly price appear.

Postlyra, by MAVA Design