Organizations
Get Consolidated MRR
Retrieve consolidated monthly recurring revenue across all tenants in an organization.
GET
/
v1
/
organizations
/
{id}
/
analytics
/
mrr
Consolidated MRR across an organization's tenants
curl --request GET \
--url https://billing.example.com/v1/organizations/{id}/analytics/mrr \
--header 'Authorization: Bearer <token>'import requests
url = "https://billing.example.com/v1/organizations/{id}/analytics/mrr"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://billing.example.com/v1/organizations/{id}/analytics/mrr', 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://billing.example.com/v1/organizations/{id}/analytics/mrr",
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;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://billing.example.com/v1/organizations/{id}/analytics/mrr"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://billing.example.com/v1/organizations/{id}/analytics/mrr")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://billing.example.com/v1/organizations/{id}/analytics/mrr")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"by_currency": [
{
"total_mrr": 123,
"currency": "<string>",
"converted_mrr": 123,
"rate": 123,
"fx_error": "<string>",
"by_tenant": [
{
"tenant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tenant_name": "<string>",
"mrr": 123,
"currency": "<string>"
}
]
}
],
"normalized_mrr": 123,
"reporting_currency": "<string>",
"fx": {
"rates": {},
"source": "live",
"as_of": "2023-11-07T05:31:56Z"
}
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Yes | The unique identifier of the organization (e.g. org_4f3e2d1c0b9a8765). |
Example Request
curl https://api.recurso.dev/v1/organizations/org_4f3e2d1c0b9a8765/analytics/mrr \
-H "Authorization: Bearer rsk_live_xxx"
Response
Returns consolidated MRR data with a per-tenant breakdown.{
"data": {
"organization_id": "org_4f3e2d1c0b9a8765",
"total_mrr": 1285000,
"currency": "INR",
"total_active_subscriptions": 347,
"by_tenant": [
{
"tenant_id": "tenant_a1b2c3d4",
"tenant_name": "Acme SaaS India",
"mrr": 725000,
"active_subscriptions": 195
},
{
"tenant_id": "tenant_e5f6a7b8",
"tenant_name": "Acme SaaS SEA",
"mrr": 340000,
"active_subscriptions": 98
},
{
"tenant_id": "tenant_c9d0e1f2",
"tenant_name": "Acme SaaS EU",
"mrr": 220000,
"active_subscriptions": 54
}
],
"computed_at": "2026-06-23T10:15:30Z"
}
}
MRR values are in the smallest currency unit (paise for INR). Divide by 100 to get
the amount in the base unit. For example,
1285000 paise equals INR 12,850.00.MRR is computed as a point-in-time snapshot. The
computed_at field indicates when
the calculation was last performed. Data may be cached for up to 5 minutes.⌘I
Consolidated MRR across an organization's tenants
curl --request GET \
--url https://billing.example.com/v1/organizations/{id}/analytics/mrr \
--header 'Authorization: Bearer <token>'import requests
url = "https://billing.example.com/v1/organizations/{id}/analytics/mrr"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://billing.example.com/v1/organizations/{id}/analytics/mrr', 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://billing.example.com/v1/organizations/{id}/analytics/mrr",
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;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://billing.example.com/v1/organizations/{id}/analytics/mrr"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://billing.example.com/v1/organizations/{id}/analytics/mrr")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://billing.example.com/v1/organizations/{id}/analytics/mrr")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"by_currency": [
{
"total_mrr": 123,
"currency": "<string>",
"converted_mrr": 123,
"rate": 123,
"fx_error": "<string>",
"by_tenant": [
{
"tenant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tenant_name": "<string>",
"mrr": 123,
"currency": "<string>"
}
]
}
],
"normalized_mrr": 123,
"reporting_currency": "<string>",
"fx": {
"rates": {},
"source": "live",
"as_of": "2023-11-07T05:31:56Z"
}
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}{
"error": {
"code": "BAD_REQUEST",
"message": "<string>"
}
}