Create a plan
/v1/plansamount and interval lock the billing terms for everyone who ever subscribes to this plan. Because changing those after subscribers attach is destructive, both fields are immutable post-create — for term changes, create a new plan and migrate. Use interval: custom with interval_days for non-standard cycles (e.g. 45-day billing).
Body parameters
namestringrequiredInternal name for the plan, 1-200 chars.
amountintegerrequiredAmount in kobo charged each cycle. NGN 5,000 = 500000.
intervalenum<'daily' | 'weekly' | 'monthly' | 'quarterly' | 'biannually' | 'annually' | 'custom'>requiredBilling cadence. custom requires interval_days.
interval_daysintegeroptionalDays between charges. **Required when interval = custom**, ignored otherwise. Range 1-730.
descriptionstringoptionalFree-text description, up to 500 chars. Surfaced in dashboard.
metadataobjectoptionalArbitrary key/value pairs for your own bookkeeping.
Response
201plan_codestringTagPay-assigned code, prefixed with `PLN_`. Use this to subscribe customers.
namestringPlan name.
descriptionstring | nullFree-text description, or null.
amountintegerAmount in kobo per cycle.
currencystringAlways `NGN` today.
intervalstringBilling cadence.
interval_daysinteger | nullCustom cycle length in days; null for standard intervals.
activeboolean`true` by default. Inactive plans cannot accept new subscribers.
metadataobject | nullEchoed metadata, or null.
created_atstringISO-8601 timestamp.
updated_atstringISO-8601 timestamp.
Errors
VALIDATION_ERROR400`interval_days` is required when `interval = custom`.INVALID_KEY401API key missing or invalid. Use your secret key.