REST API
Subscriptions

Subscriptions

Subscription Statuses

StatusDescription
trialFree trial period
activePaid and active
expiredPast expiration date
cancelledManually cancelled
pending_paymentAwaiting payment confirmation

Public Routes

GET /subscriptions/plans

List available subscription plans (public).

Auth: None

Response:

{
  "success": true,
  "data": {
    "plans": [
      {
        "id": "uuid",
        "name": "Starter",
        "slug": "starter",
        "description": "For small shops",
        "price_per_month": 15000,
        "duration_months": 1,
        "included_stores": 1,
        "extra_store_price_per_month": 12000,
        "sort_order": 1
      }
    ],
    "count": 3
  }
}

GET /subscriptions/plans/:id

Get a single plan.

Auth: None


Owner Routes

GET /subscriptions/my-subscription

View own subscription details.

Auth: Required + Owner


GET /subscriptions/store-limit

Check store limit against current plan.

Auth: Required + Owner


Admin Routes

POST /subscriptions/plans

Create a pricing tier.

Auth: Required + Admin

Request Body:

{
  "name": "Business",
  "slug": "business",
  "description": "For growing businesses",
  "price_per_month": 45000,
  "duration_months": 1,
  "included_stores": 3,
  "extra_store_price_per_month": 12000,
  "sort_order": 2
}

PATCH /subscriptions/plans/:id

Update a pricing tier.

Auth: Required + Admin


DELETE /subscriptions/plans/:id

Deactivate a plan.

Auth: Required + Admin


GET /subscriptions/all

List all subscriptions (admin view).

Auth: Required + Admin

Query: status, organisation, page, page_size


GET /subscriptions/all/:id

Get subscription detail (admin view).

Auth: Required + Admin


POST /subscriptions/all/:id/activate

Activate or update a subscription.

Auth: Required + Admin

Request Body:

{
  "status": "active",
  "payment_reference": "PAY-123",
  "payment_date": "2024-01-15T00:00:00Z",
  "amount_paid": 45000,
  "notes": "January payment"
}

PATCH /subscriptions/all/:id/extra-stores

Set extra store slots.

Auth: Required + Admin

Request Body:

{
  "extra_stores": 2
}