Skip to content
postpeg

Billing

Plans are priced by connected accounts. You can manage billing from the dashboard, or through the API if you’d rather build it into your own product.

Plans

Plans
FieldDescription
Trialfree, 7 days1 niche, 10 breakdowns, 10 scripts, 3 carousels, 3 connected accounts and every feature. A trial niche is fetched once, when it is created or its sources change; paid plans refresh niches daily. No card needed. Every platform except X, which needs a paid plan: connecting or posting to it on a trial answers 402 subscription_required.
Starter$29 per month1 niche, 10 competitors each, 100 breakdowns, 100 scripts and 5 carousels a month. 10 connected accounts. Unlimited posts, scheduling, analytics, comments and DMs.
Pro$79 per month5 niches, 10 competitors each, 500 breakdowns, 500 scripts and 20 carousels a month. 50 connected accounts. Unlimited posts, scheduling, analytics, comments and DMs.
Scale$199 per month15 niches, 10 competitors each, 1,500 breakdowns, 1,500 scripts and 45 carousels a month. Unlimited connected accounts (fair use: up to 150 accounts). Unlimited posts, scheduling, analytics, comments and DMs.

Breakdowns, scripts and carousels reset on the 1st of the month (UTC); see your use so far with GET /v1/tiktok/usage in TikTok growth. At a limit the call answers 402 limit_reached; there is no overage.

When the trial ends without a plan, the API answers 402 subscription_required except for GET /v1/me and the endpoints on this page. Accounts postpeg connected (TikTok, Bluesky) are kept for 3 days, so paying in that time picks up where you left off; accounts on your own Zernio key are never touched. See also Pricing.

Current plan

GET/v1/billing

Your plan, the subscription state and the plans on offer. It keeps working after the trial or subscription ends, so a client can always show how to pay.

curl https://api.postpeg.com/v1/billing \
  -H "Authorization: Bearer $POSTPEG_KEY"
Response · 200 OK
{
  "plan": "trial",
  "subscription_status": null,
  "current_period_end": null,
  "cancel_at_period_end": false,
  "trial_ends_at": "2026-10-01T13:55:02.114Z",
  "plans": [
    {
      "id": "starter",
      "name": "Starter",
      "price_usd": 29,
      "account_limit": 10
    },
    {
      "id": "pro",
      "name": "Pro",
      "price_usd": 79,
      "account_limit": 50
    },
    {
      "id": "scale",
      "name": "Scale",
      "price_usd": 199,
      "account_limit": 150
    }
  ]
}

For Scale, account_limit is the fair-use cap.

Checkout

POST/v1/billing/checkout

Checkout fields
FieldDescription
planstarter | pro | scale · requiredThe plan to buy.
success_urlhttp(s) URLWhere to send the buyer after paying.

Returns a link to a hosted checkout page. The plan switches as soon as the payment is confirmed, usually within seconds.

curl https://api.postpeg.com/v1/billing/checkout \
  -H "Authorization: Bearer $POSTPEG_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "plan": "pro",
    "success_url": "https://example.com/billing/done"
  }'
Response · 200 OK
{
  "url": "https://…",
  "expires_at": "2026-09-24T15:02:11.000Z"
}

Billing portal

POST/v1/billing/portal

A link to the billing portal, where the customer changes plan, updates their card, downloads invoices or cancels. The body is optional: pass return_url to choose where the portal sends them back.

curl https://api.postpeg.com/v1/billing/portal \
  -H "Authorization: Bearer $POSTPEG_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "return_url": "https://example.com/settings/billing"
  }'
Response · 200 OK
{
  "url": "https://…"
}

Before the first checkout there’s no billing account yet:

Response · 409 Conflict
{
  "type": "https://postpeg.com/errors/conflict",
  "title": "Conflict",
  "status": 409,
  "detail": "No billing account yet; start with POST /v1/billing/checkout",
  "code": "conflict",
  "request_id": "8f14e45f-ceea-467a-9575-1f2a5c3e6b0d"
}