Royalties
What the authenticated user is owed, and what has been paid to them
Resource Overview
Two read-only endpoints that return the royalty position of the user who owns the access token: the current available amount with its period-by-period history, and the payment history. They are the same figures the limbo dashboard shows that person.
/royalties/summary/royalties/payments
Read-only, any user with API access
filter[period-from], filter[period-to] (optional)
Period Filter
Both endpoints accept the same optional range. Both bounds are inclusive and either may be sent alone.
| Parameter | Format | Description |
|---|---|---|
filter[period-from] |
YYYY-MM |
First month to include (e.g. 2026-01) |
filter[period-to] |
YYYY-MM |
Last month to include (e.g. 2026-06) |
- • The month is two digits, 01 to 12:
2026-3and2026-13are rejected, they are not corrected. - •
/royalties/summary: the filter narrowsdata.evolutionandmeta.periodscounts the filtered entries.data.current_availableandmeta.payeesdo not change. - •
/royalties/payments: the filter narrows the list andmeta.totalcounts the filtered list. - • A malformed value, or a
period-fromlater thanperiod-to, answers422. It is never ignored.
GET /royalties/payments?filter[period-from]=2026-01&filter[period-to]=2026-06
GET /royalties/summary?filter[period-from]=2026-04
GET /royalties/summary?filter[period-to]=2026-02
Get Royalty Summary
/royalties/summary
Read Only
GET /royalties/summary
Authorization: Bearer {token}
Accept: application/vnd.api+json
Returns the current position plus the history, one entry per published period, oldest first.
Accepts the optional period filter, which narrows
data.evolution only: data.current_available
is always the latest published period, whatever the filter.
Response Fields
| Field | Type | Description |
|---|---|---|
| data.current_available | string | Available amount of the latest period. It is not a running total: each period already carries where the payee stands. |
| data.evolution | array | One entry per published period, oldest first. Empty when there is nothing to show. |
| evolution[].period_year | integer | Year of the period |
| evolution[].period_month | integer | Month of the period (1-12) |
| evolution[].closing_balance | string | Closing balance of the period |
| evolution[].total_paid | string | Total paid in the period |
| evolution[].available | string | Amount available at the end of the period |
| meta.payees | integer | Number of payees resolved for the authenticated user |
| meta.periods | integer | Number of entries in evolution |
When the user is linked to several payees (for example, listed under their own name and under their label's), the amounts of the payees are summed within each period.
Success Response
{
"data": {
"current_available": "450.5000",
"evolution": [
{
"period_year": 2026,
"period_month": 3,
"closing_balance": "500.0000",
"total_paid": "200.0000",
"available": "300.0000"
},
{
"period_year": 2026,
"period_month": 4,
"closing_balance": "750.5000",
"total_paid": "300.0000",
"available": "450.5000"
}
]
},
"meta": {
"payees": 1,
"periods": 2
}
}
current_available matches the available
of the latest period (April 2026), not the sum of the periods.
No Royalties Yet
A user with no matched payee, or whose statements are not published yet, receives a zeroed position. This is a normal answer, not an error.
{
"data": {
"current_available": "0.0000",
"evolution": []
},
"meta": {
"payees": 0,
"periods": 0
}
}
Get Royalty Payments
/royalties/payments
Read Only
GET /royalties/payments
Authorization: Bearer {token}
Accept: application/vnd.api+json
Returns the payments made to the authenticated user, oldest period first. Accepts the optional period filter; it is not paginated.
Response Fields
| Field | Type | Description |
|---|---|---|
| data[].period_year | integer | Year of the period the payment belongs to |
| data[].period_month | integer | Month of the period (1-12) |
| data[].paid_amount | string | null | Amount paid, as a decimal string with four decimals. null when no amount is recorded. |
| data[].paid_full | boolean | Whether the period was paid in full |
| meta.total | integer | Number of payments returned |
Success Response
{
"data": [
{
"period_year": 2026,
"period_month": 3,
"paid_amount": "200.0000",
"paid_full": true
},
{
"period_year": 2026,
"period_month": 4,
"paid_amount": null,
"paid_full": false
}
],
"meta": {
"total": 2
}
}
A user with no matched payee, or with no published payments, receives "data": []
and "meta": {"total": 0} with 200 OK.
Errors
| Status | Code | When |
|---|---|---|
| 401 | - | The request carries no valid bearer token |
| 403 | royalties-disabled |
The royalties statement feature is not enabled in this environment |
| 422 | - | A period filter is malformed (not YYYY-MM, month outside 01-12) or filter[period-from] is later than filter[period-to] |
The endpoints can be switched off per environment. When they are, both answer:
{
"errors": [
{
"status": "403",
"code": "royalties-disabled",
"title": "Forbidden",
"detail": "The royalties statement feature is not enabled."
}
]
}
An invalid period filter answers, naming the offending parameter in source.parameter
(here for filter[period-from]=2026-13):
{
"jsonapi": { "version": "1.0" },
"errors": [
{
"detail": "The filter[period-from] must be a month in YYYY-MM format.",
"source": { "parameter": "filter.period-from" },
"status": "422",
"title": "Unprocessable Entity"
}
]
}
Usage Examples
Show the Current Balance
Read the amount available for the latest published period
GET /royalties/summary
# data.current_available -> "450.5000"
Chart the Evolution
Use data.evolution, already ordered from the oldest period to the latest
GET /royalties/summary
# data.evolution[].period_year / period_month -> x axis
# data.evolution[].available -> y axis
List the Payment History
Show each payment and whether the period was settled in full
GET /royalties/payments
# data[].paid_full -> false: the period was not paid in full