Plans
Plan catalog endpoints for listing available subscription plans. Two public-facing endpoints are exposed: an authenticated listing used by the billing UI and an unauthenticated public catalog for the marketing site.
List Plans (Authenticated)
POSTAPI Key or Session Token
https://multicartapi.com/api/v1/plans/get_plans/Return all enabled plans ordered by sort_order, including PayPal plan IDs and legacy alias fields used by the billing UI.
curl "https://multicartapi.com/api/v1/plans/get_plans/" \
-X POST \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'Request body
{}Response
{
"code": 200,
"data": [
{
"id": 1,
"code": "starter",
"name": "Starter",
"title": "Get started for free",
"features": [{"text": "1 000 scrapes / month", "active": true}],
"price_cents": 0,
"scrape_quota": 1000,
"interval": "month",
"currency": "USD",
"is_default": true,
"is_featured": false,
"is_contact_sales": false,
"sort_order": 0,
"status": "enable",
"paypal_product_id": null,
"paypal_plan_id": null,
"price": 0,
"credits": 1000,
"duration": "monthly",
"currency_symbol": "$",
"description": "1 000 scrapes / month"
},
{
"id": 2,
"code": "pro",
"name": "Pro",
"title": "For growing teams",
"features": [{"text": "5 000 scrapes / month", "active": true}],
"price_cents": 4900,
"scrape_quota": 5000,
"interval": "month",
"currency": "USD",
"is_default": false,
"is_featured": true,
"is_contact_sales": false,
"sort_order": 1,
"status": "enable",
"paypal_product_id": "PROD-XXXXXXXXXXXX",
"paypal_plan_id": "P-XXXXXXXXXXXX",
"price": 49,
"credits": 5000,
"duration": "monthly",
"currency_symbol": "$",
"description": "5 000 scrapes / month"
}
],
"status": 1
}Notes
No request body is required. Returns plans with `status='enable'` only, sorted ascending by `sort_order`. Response includes both canonical fields (`price_cents`, `scrape_quota`, `interval`) and synthesized legacy aliases (`price` in dollars, `credits`, `duration`, `currency_symbol`, `description`) for backward compatibility with existing frontends. The `paypal_plan_id` field is included in this response (unlike the public endpoint) because this endpoint is used by the billing UI to render the PayPal subscription button. `is_contact_sales: true` plans (e.g. Enterprise/Elite) have `paypal_plan_id: null` and cannot be subscribed to online.
List Plans (Public)
GETNo auth (public)
https://multicartapi.com/api/v1/plans/public/Return the public plan catalog for the marketing site — no authentication required; PayPal internal IDs are omitted.
curl "https://multicartapi.com/api/v1/plans/public/" \
-X GETResponse
{
"code": 200,
"data": [
{
"id": 1,
"code": "starter",
"name": "Starter",
"title": "Get started for free",
"features": [{"text": "1 000 scrapes / month", "active": true}],
"price_cents": 0,
"scrape_quota": 1000,
"interval": "month",
"currency": "USD",
"is_default": true,
"is_featured": false,
"is_contact_sales": false,
"sort_order": 0,
"status": "enable",
"price": 0,
"credits": 1000,
"duration": "monthly",
"currency_symbol": "$",
"description": "1 000 scrapes / month"
}
],
"status": 1
}Notes
No authentication or request body required. Returns the same `status='enable'` plans sorted by `sort_order` as the authenticated endpoint, but uses `PublicPlanSerializer` which intentionally omits `paypal_product_id` and `paypal_plan_id` so internal PayPal identifiers are never exposed to unauthenticated callers. All other fields — including canonical (`price_cents`, `scrape_quota`, `interval`) and legacy aliases (`price`, `credits`, `duration`) — are present. This endpoint is not documented in the landing `/api-docs` but is used by the public pricing page on the marketing site.
