curl --request GET \
--url https://coreapi.io/api/analytics/mrr-financials \
--header 'Authorization: Bearer <token>'import requests
url = "https://coreapi.io/api/analytics/mrr-financials"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://coreapi.io/api/analytics/mrr-financials', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://coreapi.io/api/analytics/mrr-financials",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"months": [
"2026-09"
],
"rows": {},
"totals": {},
"reasons": {},
"meta": {
"asOf": "2023-11-07T05:31:56Z",
"buildId": "<string>",
"scope": "invoice_address",
"currency": "EUR",
"from": "2025-10",
"to": "2026-09",
"findings": {
"error": 0,
"warning": 3,
"info": 12
},
"filtersNotApplied": [
"<string>"
],
"notSnapshotted": [
"one_off",
"accounted_mrr",
"cash_collected"
],
"projectedFrom": "2026-10",
"forecast": {
"incomplete": false,
"failedSubscriptions": 0
},
"build": {
"status": "failed",
"builtAt": "2023-11-07T05:31:56Z",
"buildId": "<string>",
"failed": {
"invariants": [
"CASH_WITHIN_DOCUMENT"
],
"rowCount": 5,
"invoiceRowCount": 5
}
},
"dataBuildId": "<string>"
},
"reasonLabels": {
"contract_start": "Vertragsbeginn",
"price_change": "Preisänderung",
"not_billed": "Nicht abgerechnet"
}
}{
"status": 409,
"type": "ANALYTICS_MRR_FINANCIALS__SNAPSHOT_MONTH_NOT_ENDED",
"title": "An error occurred",
"detail": "<string>"
}{
"status": 422,
"type": "https://tools.ietf.org/html/rfc2616#section-10",
"violations": [
{
"propertyPath": "to",
"message": "Der Zeitraum darf höchstens 36 Monate umfassen.",
"code": "analytics.mrr_financials.range_too_long"
}
],
"title": "Validation Failed",
"detail": "<string>"
}MRR financials table
Monthly recurring revenue (MRR) at the start and end of every month, its movements (new, expansion, contraction, lost, resurrecting) with their reasons, ARR, revenue churn rate, month-over-month growth, non-recurring revenue (one-off and variable, net), cash collected and refunded, and outstanding receivables at the month end. One currency per response, never converted. MRR is the monthly-normalized recurring net amount the contracts entitle to at the last second of the month (time zone of the organisation). Non-recurring revenue is net = gross − tax of the finalized invoice positions (after position discounts), by finalization month; credit notes are negative. Collected cash counts settled payments (status captured, booked, refunded, partial_refunded) by payment date; refunds count separately. The figures come from the latest calculation (meta.asOf).
Required permission: analytics:read.
curl --request GET \
--url https://coreapi.io/api/analytics/mrr-financials \
--header 'Authorization: Bearer <token>'import requests
url = "https://coreapi.io/api/analytics/mrr-financials"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://coreapi.io/api/analytics/mrr-financials', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://coreapi.io/api/analytics/mrr-financials",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"months": [
"2026-09"
],
"rows": {},
"totals": {},
"reasons": {},
"meta": {
"asOf": "2023-11-07T05:31:56Z",
"buildId": "<string>",
"scope": "invoice_address",
"currency": "EUR",
"from": "2025-10",
"to": "2026-09",
"findings": {
"error": 0,
"warning": 3,
"info": 12
},
"filtersNotApplied": [
"<string>"
],
"notSnapshotted": [
"one_off",
"accounted_mrr",
"cash_collected"
],
"projectedFrom": "2026-10",
"forecast": {
"incomplete": false,
"failedSubscriptions": 0
},
"build": {
"status": "failed",
"builtAt": "2023-11-07T05:31:56Z",
"buildId": "<string>",
"failed": {
"invariants": [
"CASH_WITHIN_DOCUMENT"
],
"rowCount": 5,
"invoiceRowCount": 5
}
},
"dataBuildId": "<string>"
},
"reasonLabels": {
"contract_start": "Vertragsbeginn",
"price_change": "Preisänderung",
"not_billed": "Nicht abgerechnet"
}
}{
"status": 409,
"type": "ANALYTICS_MRR_FINANCIALS__SNAPSHOT_MONTH_NOT_ENDED",
"title": "An error occurred",
"detail": "<string>"
}{
"status": 422,
"type": "https://tools.ietf.org/html/rfc2616#section-10",
"violations": [
{
"propertyPath": "to",
"message": "Der Zeitraum darf höchstens 36 Monate umfassen.",
"code": "analytics.mrr_financials.range_too_long"
}
],
"title": "Validation Failed",
"detail": "<string>"
}Autorisierungen
API token of the organisation. Send it as Authorization: Bearer api_... The token is bound to exactly one organisation.
Abfrageparameter
First month (YYYY-MM, time zone of the organisation). Default: to minus 11 months.
^\d{4}-(0[1-9]|1[0-2])$"2025-10"
Last month (YYYY-MM). Default: the current month. At most 36 months per request; from must not be after to.
^\d{4}-(0[1-9]|1[0-2])$"2026-09"
ISO-4217 code of one of the organisation's currencies. Default: the default currency.
"EUR"
Level on which movements are classified. Default: the organisation setting (invoice_address unless changed).
subscription, invoice_address, customer, organisation Analytics segment to narrow the figures to.
Narrow to these customers.
Narrow to these products (MRR and non-recurring revenue; cash has no product).
Antwort
The table.
The MRR financials table: one value per row and month. Money values are objects with an exact decimal amount (two places) and currency; rates are exact decimal strings with six places ("0.001600" = 0.16 %). Contraction and lost are unsigned amounts (they lower MRR); reason amounts are signed.
Months of the range (YYYY-MM, time zone of the organisation), ascending. Every series is aligned with this list.
Series per row key: one_off (Net (gross − tax, after position discounts) of the one-off positions of the documents finalized in the month: one-time prices of subscription items, manual positions, setup fees, and discounts without a parent position (dunning fees are other operating income, not revenue); credit notes and cancellations count negative.), variable (Net (gross − tax, after position discounts) of the usage-based positions of the documents finalized in the month: usage quantities, metered measurements and percentage prices; credit notes and cancellations count negative.), mrr_bop, mrr_eop (MRR at the end of the previous / this month), accounted_mrr ("Accounted MRR": the recurring invoice positions' shares of the month by their service period, 30/360; null for a snapshot copy), billing_gap ("Differenz Vertrag zu Rechnung": mrr_eop − accounted_mrr, its causes under reasons.billing_gap), new, expansion, contraction, lost, resurrecting (movements), arr_eop (MRR × 12), revenue_churn_rate ((contraction + lost) / BoP), mom_growth ((EoP − BoP) / BoP), cash_collected ("Zahlungseingang") and its split by the invoice the money pays, adding up to it: cash_collected_this_month (invoices finalized in the same month), cash_collected_other_months (invoices of other months), cash_collected_unassigned (no finalized invoice: top-ups, prepayments, the part above the gross of an overpaid invoice), cash_collected_refund_returned ("Erstattung zurückgekommen": a negative refund matched from the bank account), cash_refunded ("Zahlungsausgang": refunds, chargebacks, payouts and return debit fees) and its split by kind, adding up to it: cash_refunded_refund ("Erstattungen"), cash_refunded_chargeback ("Rücklastschriften"), cash_refunded_payout ("Auszahlungen"), cash_refunded_return_fee ("Rücklastschrift-Gebühren": the bank fee of a return debit without a return case, not part of the invoice; all four null for a snapshot copy), cash_corrections ("Korrekturen": refunds entered by hand and cancelled by a counter-entry, no money moved, outside cash in and out; 0 over a range that holds both entries) with cash_corrections_reversed ("storniert") and cash_corrections_counter ("Gegenbuchung", negative; all three null for a snapshot copy), cash_net (by payment date, whatever month the invoice belongs to), cash_forecast ("Rechnungsprognose (brutto)": gross of the invoices the billing forecast expects in the month; null for elapsed months), receivables_eop (open amounts of finalized invoices at the month end; months after the current one carry the invoices open today forward). A value is null when the month has no data at all.
Show child attributes
Show child attributes
Total column per row key: flows are summed over the range, mrr_bop is the BoP of the first month, mrr_eop, accounted_mrr, billing_gap, arr_eop and receivables_eop are the value of the last month, rates are null. Totals are computed from the exact amounts and rounded once, so they can differ by a cent from the sum of the rounded cells.
Show child attributes
Show child attributes
Reason split of the movements: expansion and contraction (and new, lost, resurrecting for the detail view), each a map from reason (price_change, quantity_change, discount_start, plan_change, …) to a series aligned with months. Amounts are signed: contraction reasons are negative. billing_gap: the difference contract − invoice per cause (partial_month, billing_start_later, not_yet_billed (the next billing run will invoice it), not_billed (an elapsed month no run will invoice), upcoming_invoice, trial, credit_or_cancellation, billed_after_end, period_shift, price_mismatch, unknown); the causes of a month add up to the billing_gap cell.
Show child attributes
Show child attributes
Calculation time, effective scope and currency, finding counts.
Show child attributes
Show child attributes
German name of every key of reasons: the movement reasons (the one catalogue, the same names as the card "Ursachen der Bewegungen"; every reason is its own "davon" row, added and removed products are not netted) and the causes of billing_gap. "Sonstiges" only for a key outside the catalogue.
Show child attributes
Show child attributes
{
"contract_start": "Vertragsbeginn",
"price_change": "Preisänderung",
"not_billed": "Nicht abgerechnet"
}
War diese Seite hilfreich?