Skip to main content

Charges API

Complete API reference for managing charge templates and pricing in the Billerang catalog.

Overview​

A ChargeTemplate defines how a product is priced. Billerang supports four charge types, each with its own billing behavior:

TypeCodeBilling TriggerExample
RecurringRECURRINGCalendar-based (monthly, annual)Monthly subscription fee
SubscriptionSUBSCRIPTIONOn subscription activationSetup fee
TerminationTERMINATIONOn subscription cancellationEarly termination fee
UsageUSAGEPer CDR/EDR eventAPI calls, data transfer
OtherOTHERManual applicationAd-hoc charges

Endpoints​

List Charges​

GET /v1/catalog/charges?range=0-24&type=recurring&status=active

Query Parameters:

ParameterTypeDescription
rangestringPagination range
typestringFilter: recurring, subscription, termination, usage, other
statusstringFilter: draft, active, archived
invoice_categorystringFilter by invoice sub-category
expandstringInclude: pricing, pricing.versions

Response:

[
{
"code": "RC_PLATFORM_MONTHLY",
"name": "Monthly Platform Fee",
"type": "recurring",
"status": "active",
"invoice_category": "ISC_SUBSCRIPTION",
"pricing_mode": "FLAT"
}
]

Get Charge​

GET /v1/catalog/charges/{code}?expand=pricing

Response:

{
"code": "RC_PLATFORM_MONTHLY",
"name": "Monthly Platform Fee",
"type": "recurring",
"status": "active",
"invoice_category": "ISC_SUBSCRIPTION",
"tax_class": "TAX_STANDARD",
"accounting_article": "ART_PLATFORM",
"amount_editable": false,
"unit": {
"input": "each",
"rating": "each",
"multiplier": 1,
"decimals": 2
},
"recurring": {
"calendar": "MONTHLY",
"prorate_on_start": true,
"prorate_on_end": true,
"charge_in_advance": true,
"duration_months": null
},
"pricing": {
"mode": "FLAT",
"base_currency": "USD",
"dimensions": [],
"versions": [
{
"version": 1,
"status": "published",
"valid_from": "2024-01-01T00:00:00Z",
"price": 99.00
}
]
}
}

Create/Upsert Charge​

POST /v1/catalog/charges/{code}

UPSERT semantics: creates if not found, updates if exists.

Recurring Charge Example​

{
"code": "RC_PLATFORM_MONTHLY",
"name": "Monthly Platform Fee",
"type": "recurring",
"invoice_category": "ISC_SUBSCRIPTION",
"tax_class": "TAX_STANDARD",
"recurring": {
"calendar": "MONTHLY",
"prorate_on_start": true,
"prorate_on_end": true,
"charge_in_advance": true
},
"pricing": {
"mode": "FLAT",
"base_currency": "USD",
"price": 99.00,
"auto_publish": true
}
}

Usage Charge Example​

{
"code": "UC_API_CALLS",
"name": "API Call Usage",
"type": "usage",
"invoice_category": "ISC_USAGE",
"tax_class": "TAX_STANDARD",
"usage": {
"filter_expression": "#{edr.parameter1 == 'API_CALL'}",
"priority": 1,
"counter_code": "CTR_MONTHLY_CALLS"
},
"pricing": {
"mode": "TIERED",
"base_currency": "USD",
"tiers": [
{ "from": 0, "to": 100000, "rate": 0.001 },
{ "from": 100001, "to": 1000000, "rate": 0.0008 },
{ "from": 1000001, "to": null, "rate": 0.0005 }
],
"auto_publish": true
}
}

One-Shot Charge Example​

{
"code": "OS_SETUP_FEE",
"name": "Setup Fee",
"type": "subscription",
"invoice_category": "ISC_SETUP",
"one_shot": {
"immediate_invoicing": true
},
"pricing": {
"mode": "FLAT",
"base_currency": "USD",
"price": 499.00
}
}

Update Charge​

PUT /v1/catalog/charges/{code}

Partial update. Change status, pricing, or any field:

{
"status": "active",
"name": "Updated Monthly Fee"
}

Delete Charge​

DELETE /v1/catalog/charges/{code}

Only allowed for draft charges not linked to any product.

Pricing Modes​

FLAT​

Fixed price regardless of quantity.

{ "mode": "FLAT", "base_currency": "USD", "price": 99.00 }

PER_UNIT​

Price multiplied by quantity.

{ "mode": "PER_UNIT", "base_currency": "USD", "price": 0.10 }

TIERED​

Different rates at quantity thresholds (incremental).

{
"mode": "TIERED",
"base_currency": "USD",
"tiers": [
{ "from": 0, "to": 1000000, "rate": 0.002 },
{ "from": 1000001, "to": 10000000, "rate": 0.0015 },
{ "from": 10000001, "to": null, "rate": 0.001 }
]
}

Calculation for 15M tokens:

  • First 1M: 1,000K * $0.002 = $2.00
  • Next 9M: 9,000K * $0.0015 = $13.50
  • Last 5M: 5,000K * $0.001 = $5.00
  • Total: $20.50

VOLUME​

Rate applies to ALL units once threshold is reached.

{
"mode": "VOLUME",
"base_currency": "USD",
"tiers": [
{ "from": 0, "to": 9999, "rate": 1.00 },
{ "from": 10000, "to": null, "rate": 0.80 }
]
}

MATRIX​

Multi-dimensional pricing with dimension columns and price rows.

{
"mode": "MATRIX",
"base_currency": "USD",
"dimensions": [
{ "code": "REGION", "type": "String", "label": "Region" },
{ "code": "TIER", "type": "String", "label": "Customer Tier" }
],
"rows": [
{
"priority": 1,
"values": [
{ "dimensionCode": "REGION", "stringValue": "US" },
{ "dimensionCode": "TIER", "stringValue": "enterprise" }
],
"price": 500.00
},
{
"priority": 99,
"description": "Default fallback",
"price": 600.00
}
]
}

Matching logic:

  1. Find row with highest priority number of matching dimensions
  2. null values are wildcards (match anything)
  3. Default row (priority 99, all nulls) is the fallback

FORMULA​

Custom EL expression for dynamic pricing.

{
"mode": "FORMULA",
"base_currency": "USD",
"price_formula": "#{basePrice * (1 - billingAccount.cfValue('negotiated_discount'))}"
}

CUSTOM_SCRIPT​

Groovy/Java script for complex pricing logic.

{
"mode": "CUSTOM_SCRIPT",
"base_currency": "USD",
"rating_script_code": "SCRIPT_COST_PLUS_MARGIN"
}

Pricing Versions​

Each charge's pricing is versioned independently.

Create New Version​

When you update pricing on an active charge, a new version is created:

{
"pricing": {
"mode": "FLAT",
"base_currency": "USD",
"price": 119.00,
"validity": { "from": "2025-01-01T00:00:00Z" },
"version_status": "DRAFT"
}
}

Publish Version​

PUT /v1/catalog/price_plan_versions/{id}
{ "status": "published" }

Version Lifecycle​

Rules:

  • Only one version can be PUBLISHED at a time
  • Publishing closes the previous version
  • Rating engine uses the version whose validity matches the billing date

Multi-Currency Support​

{
"pricing": {
"mode": "FLAT",
"base_currency": "USD",
"price": 99.00,
"currency_prices": [
{ "currency_code": "EUR", "price": 89.00, "use_for_billing_accounts": true },
{ "currency_code": "GBP", "price": 79.00, "use_for_billing_accounts": true },
{ "currency_code": "BRL", "exchange_rate": 5.2 }
]
}
}
  • price: fixed price in that currency (overrides exchange rate)
  • exchange_rate: multiply base price by this rate
  • use_for_billing_accounts: use this currency for BAs set to this currency

Charge Status Lifecycle​

Usage Charge Filtering​

Usage charges match incoming CDR/EDR events using filter parameters:

FieldPurposeExample
filter_expressionEL expression for complex matching#{edr.parameter1 == 'API_CALL'}
priorityMatching order (lower = higher priority)1
counter_codeLinked counter for included unitsCTR_MONTHLY_TOKENS

See Multi-Instance Matching for advanced EDR routing patterns.

Error Codes​

Error CodeHTTPDescription
CHARGE_NOT_FOUND404Charge code doesn't exist
CHARGE_ALREADY_EXISTS409Duplicate charge code
CHARGE_VALIDATION_FAILED400Invalid payload
CHARGE_STATUS_TRANSITION_INVALID422Invalid status change
CHARGE_HAS_ACTIVE_PRODUCTS422Cannot delete charge linked to products
PRICING_VERSION_NOT_FOUND404Pricing version doesn't exist
PRICING_VALIDATION_FAILED400Invalid pricing configuration