Overview
Revos APIs for billing accounts, contracts, services, pricing, payments, wallets, realtime rating, invoices, and rated transactions.
Overview
The Revos APIs let you manage accounts, contracts, catalog services, priceable attributes, rate cards, pricing logic, payments, and wallets, submit usage for realtime rating, and read invoices (JSON and PDF) and rated transactions.
Download Postman collection
A common pattern is to model an LLM model as a service (for example gpt-4o), with priceable attributes Input_Tokens and Output_Tokens, list-price rate cards per token type, and pricing logic formulas that call Price(Input_Tokens, …). See Services.
Base URL
https://{your-tenant-host}/api/v1/externalUse your Monetize360 tenant API host — the same host used for Mbrix workflow and MObject APIs.
Authentication
All requests require a Bearer token (JWT or access key) and the tenant-wide ADMIN role. Users who are only TENANTADMIN are authenticated but receive 403 on these catalog endpoints.
Assign ADMIN to the caller in Users & Roles, then request a new token so the JWT roles claim includes ADMIN.
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
"https://YOUR_TENANT_HOST/api/v1/external/services?page=0&size=20"Concepts
| Term | Meaning |
|---|---|
| Service | Catalog product (Service object). Its rate cards are the list price. Example: model gpt-4o. |
| Priceable attribute | A ServiceDimension / ContractDimension with type PRICEABLE — the charge line being priced (for example Input_Tokens, Output_Tokens). Nested create always stamps dimType PRICEABLE. |
| Input attribute | An INPUT dimension used as a formula quantity (for example Prompt_Tokens). Optional on composite service create/update as inputAttributes. |
| Rate card | One currency's current price matrix: rows, optional tiers, and row attributeValues. |
| Pricing logic | Ordered formula steps (a rate computation) that turn rate-card values into a final charge. Same concept as Computations in the UI. |
| Contract service | A line on a contract (ContractServices). Rate cards hang off this line, not the contract header. |
| Exception price | Optional ContractServicePriceMatrix. If omitted, rating uses the catalog service rate card. The catalog matrix is not copied onto the contract. |
| Account | Billing customer account. Nested addresses use billing AccountAddress (accountaddress__m), not the CPQ address object. |
| Payment | Flat payment CRUD under /payments. Create validates via the payment manager. |
| Wallet | Flat wallet CRUD under /wallets (record management; operational top-up/drawdown stays on wallet ops APIs). |
| Invoice | Read-only under /invoices: list/get header + line items, and download the stored PDF. |
| Rated transaction | Read-only under /rated-transactions: list/get header + rating dimensions. |
| Realtime rating | Asynchronous usage-event submission through POST /v1/ingest/usage. |
Service ──► priceable attributes (PRICEABLE) e.g. Input_Tokens, Output_Tokens
├──► input attributes (INPUT) e.g. Prompt_Tokens
├──► rate cards (list price, one per currency)
└──► pricing logic (Price(Input_Tokens, Qty) steps)
Contract ──► contract services
├──► priceable attributes (copied from catalog if omitted)
└──► rate cards (optional exception; empty = catalog fallback)
Account ──► addresses (billing AccountAddress)
Payment ──► accountId → Account
Wallet ──► accountId → Account
Invoice ──► accountId → Account; items; stored PDF
UsageEvent ──► realtime rating ──► RatedTransaction
RatedTransaction ──► accountId → Account; dimensionsEndpoint groups
| Group | Prefix | Docs |
|---|---|---|
| Services | /api/v1/external/services | Services |
| Contracts | /api/v1/external/contracts | Contracts |
| Accounts | /api/v1/external/accounts | Accounts |
| Payments | /api/v1/external/payments | Payments |
| Wallets | /api/v1/external/wallets | Wallets |
| Invoices | /api/v1/external/invoices | Invoices |
| Rated transactions | /api/v1/external/rated-transactions | Rated transactions |
| Realtime rating | /v1/ingest/usage | Realtime rating |
| Countries and currencies | /api/v1/external/countries, /api/v1/external/currencies | Reference data |
Pagination and list/GET shape
List endpoints accept page (0-based) and size. Default size is 20; the server caps size at 20 on billing lists. Reference-data lists (countries, currencies) default to 100.
Every list and GET-by-id (except nested rate cards and pricing logic) is wrapped in ApiResponse. List data is a Spring Page. Rows keep lookup UUIDs on the field and a sibling __r object with the display name. Keys are PascalCase. There are no {k,v,fv} cells and no *Obj companions.
{
"requestId": "8f1c2a3b-4d5e-6f70-8192-a3b4c5d6e7f8",
"success": true,
"status": 200,
"errors": [],
"data": {
"content": [
{
"__type__": "Contract",
"Id": "68cc8e84-cf43-423b-888b-a76af162e2e0",
"Name": "Test Contract A",
"ApprovalStatus": "fe07e71d-cba4-4316-9c7c-4935c3adec34",
"ApprovalStatus__r": { "Name": "Approved" }
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 20,
"sort": { "empty": true, "sorted": false, "unsorted": true },
"offset": 0,
"paged": true,
"unpaged": false
},
"last": true,
"totalElements": 1,
"totalPages": 1,
"first": true,
"size": 20,
"number": 0,
"sort": { "empty": true, "sorted": false, "unsorted": true },
"numberOfElements": 1,
"empty": false
}
}GET-by-id uses the same PascalCase row object inside data (no content page). Extra MObject and system fields on the row are returned as PascalCase and are not omitted.
These GET records also attach nested collections under PascalCase keys. Nested items keep the camelCase write-DTO field names (id, name, currency, …):
| GET | Nested keys |
|---|---|
| Service | PriceableAttributes, InputAttributes, RateCards, PricingLogic |
| Contract | Services (summaries; each item includes camelCase exceptionPricing) |
| Contract service | ExceptionPricing, PriceableAttributes, RateCards (list rows also include ExceptionPricing) |
| Invoice | Items |
| Rated transaction | Dimensions |
Contract-service list rows include ExceptionPricing. Other lists stay headers only.
Create/update still return camelCase DTO bodies (no ApiResponse envelope). Nested rate-card and pricing-logic endpoints still return PageResponse / DTO bodies.
Optional q on a list endpoint does a case-insensitive contains match. The fields it searches differ per resource and are documented on each page.
Priceable attribute body
{
"name": "Usage",
"label": "Usage",
"dimensionDataType": "Number",
"isContractInput": false,
"isMeterDimension": false,
"isProration": null,
"meterResetFrequency": null,
"dimValues": [{ "label": "US", "value": "US" }]
}name and dimensionDataType are required. Contract-service attributes may also include dimensionValText.
Composite create order
- Persist the parent (service, or contract / contract service).
- Persist priceable attributes.
- Persist rate cards (resolve
priceDimNameto id).
On PUT, omit a nested array to leave that collection unchanged. If both priceableAttributes and rateCards are sent, existing rate cards are removed first so new attributes can be referenced.
Errors
{
"status": 400,
"error": "Validation Error",
"message": "Service name is required",
"path": "uri=/api/v1/external/services"
}| Status | When |
|---|---|
200 | Successful read or update |
201 | Successful create |
204 | Successful delete |
400 | Validation (missing fields, unresolved name, wrong rate-card fields for priceMethod) |
401 | Missing or invalid token |
403 | Authenticated but missing the ADMIN role |
404 | Parent or nested resource not found |
409 | Duplicate name/number, duplicate currency rate card, or delete blocked by references |