Skip to main content
The Billing API lets you model products as price points, orchestrate checkout with your PSPs, and manage subscriptions end-to-end — including pausing/resuming, discounts, migrations, and refunds.

Base URL

All API requests should be made to:
https://billing.funnelfox.com/{org_id}/v1
Replace {org_id} with your organization ID.

Available endpoints

  • POST /payment/refund — Refund an order (full or partial; optional “soft” refund)
  • POST /subscription/enable_autorenew — Turn on autorenew
  • POST /subscription/disable_autorenew — Turn off autorenew
  • POST /subscription/migration — Move a sub to another price point (price_prorate, delayed_start)
  • POST /discount — Apply a percentage discount for a number of iterations
  • POST /subscription/defer — Delay the next charge until a time
  • POST /subscription/pause — Stop billing and access until a time
  • POST /subscription/resume — Cancel pause and restart billing/access
  • POST /price_points — List price points (filter by ident)
  • POST /pp/export_csv — Export all price points to CSV
  • POST /pp/import_csv — Bulk-create price points from CSV
  • POST /pp/update — Update by ident
  • POST /pp/create — Create a price point
  • POST /feature/create — Create a feature (timebased, lifetime, consumable)
  • POST /features — List all features
  • POST /my_assets — Fetch user ownership (subscriptions & one-off purchases)
  • POST /checkout/create_client_session — Get a client token & order for the selected price point
  • POST /checkout/update_client_session — Re-bind an order to a different price point
  • POST /checkout/create_payment — Charge using a payment_method_token
  • POST /checkout/one_click — One-click purchase by external_id + pp_ident
  • POST /checkout/resume_payment — Complete a payment after additional action
Learn more in the FunnelFox Billing API reference.

Making requests

Path parameters

All endpoints defined under https://billing.funnelfox.com/{org_id}/v1/... require the org_id in the URL path.

Request body

Most endpoints accept JSON parameters in the request body. Parameters vary by endpoint - see the API Reference for details.

Example request

curl -X POST 'https://billing.funnelfox.com/{org_id}/v1/price_points' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
    "ident": null
  }'

Response format

All successful responses follow this structure:
{
  "data": {
    // Response data specific to the endpoint
  },
  "status": "success"
}

Example response

{
  "data": {
    "price_points": [
      {
        "ident": "monthly-premium",
        "currency": {
          "code": "USD",
          "minor_units": 2,
          "title": "US Dollar",
          "symbol": "$"
        },
        "intro_type": "free_trial",
        "lifetime_price": null,
        "intro_free_trial_period": 7,
        "intro_free_trial_period_duration": "days",
        "intro_paid_trial_price": null,
        "intro_paid_trial_period": null,
        "intro_paid_trial_period_duration": null,
        "next_price": "9.99",
        "next_period": 1,
        "next_period_duration": "months",
        "features": [
          {
            "ident": "premium-access"
          }
        ]
      }
    ]
  },
  "status": "success"
}

Filtering

The POST /price_points endpoint is the only one that supports narrowing results by ident to retrieve specific price points. Pass an ident value to retrieve only the matching price point:
curl -X POST 'https://billing.funnelfox.com/{org_id}/v1/price_points' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
    "ident": "pro_monthly_usd"
  }'
List all price points (no filter):
curl -X POST 'https://billing.funnelfox.com/{org_id}/v1/price_points' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{}'

Error handling

The API returns standard HTTP status codes with detailed error messages.
{
  "status": "error",
  "req_id": "acMMsjP9",
  "error": [
    {
      "msg": "Error description",
      "type": "error_type"
    }
  ]
}
Response fields:
  • status - Always "error" for failed requests
  • req_id - Unique request identifier for debugging
  • error - Array of error objects with msg (description) and type (error category)
I