Subrite statistics
Endpoints for Subrite statistics
Endpoints for Subrite statistics
GET/api/v1/stats/stats
Authentication: Bearer token (JWT)
totalActiveSubcriptionsnumberRequiredtotalActivePaidSubcriptionsnumberRequiredtotalActiveMembersnumberRequiredtotalActivePaidMembersnumberRequiredtotalRegisteredMembersnumberRequiredtotalLoginYesterdaynumberRequiredtotalWaitingForActivationSubscriptionsnumberRequiredtotalRecurringRevenueTotalRecurringRevenueDTORequired4 fieldstotalRecurringRevenuerecurringMrrnumberRequiredField path: totalRecurringRevenue.recurringMrrrecurringArrnumberRequiredField path: totalRecurringRevenue.recurringArrestimatedMrrnumberRequiredField path: totalRecurringRevenue.estimatedMrrestimatedArrnumberRequiredField path: totalRecurringRevenue.estimatedArrtotalChurnTotalChurnDTORequired3 fieldstotalChurntotalChurnnumberRequiredField path: totalChurn.totalChurntotalChurnPeriodLabelstringRequiredField path: totalChurn.totalChurnPeriodLabeltotalChurnYearnumberRequiredField path: totalChurn.totalChurnYear{
"totalActiveSubcriptions": 0,
"totalActivePaidSubcriptions": 0,
"totalActiveMembers": 0,
"totalActivePaidMembers": 0,
"totalRegisteredMembers": 0,
"totalLoginYesterday": 0,
"totalWaitingForActivationSubscriptions": 0,
"totalRecurringRevenue": {
"recurringMrr": 0,
"recurringArr": 0,
"estimatedMrr": 0,
"estimatedArr": 0
},
"totalChurn": {
"totalChurn": 0,
"totalChurnPeriodLabel": "string",
"totalChurnYear": 0
}
}unauthorized
This response has no body.
forbiddenResource
messageCodestringRequiredmessagestringerrorsarray of FieldErrorRequired7 fieldserrorsfieldstringRequired when parent is presentField path: errors[].fieldfieldValuestringRequired when parent is presentField path: errors[].fieldValueidentifierstringRequired when parent is presentField path: errors[].identifieridentifierValuestringRequired when parent is presentField path: errors[].identifierValuemessageCodestringRequired when parent is presentField path: errors[].messageCodemessagestringField path: errors[].messageerrorTypestringRequired when parent is presentField path: errors[].errorType{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/stats \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/total-stats
Authentication: Bearer token (JWT)
daysnumberRequiredtotalNewPaidSubscriptionsnumberRequiredtotalPaidRenewalsnumberRequiredtotalCanceledPaidSubscriptionsnumberRequiredtotalStoppedPaidSubscriptionsnumberRequiredtotalReactivatedSubscriptionsnumberRequired{
"totalNewPaidSubscriptions": 0,
"totalPaidRenewals": 0,
"totalCanceledPaidSubscriptions": 0,
"totalStoppedPaidSubscriptions": 0,
"totalReactivatedSubscriptions": 0
}badRequest
messageCodestringRequired"badRequest"messagestringerrorsarray of FieldErrorRequired7 fieldserrorsfieldstringRequired when parent is presentField path: errors[].fieldfieldValuestringRequired when parent is presentField path: errors[].fieldValueidentifierstringRequired when parent is presentField path: errors[].identifieridentifierValuestringRequired when parent is presentField path: errors[].identifierValuemessageCodestringRequired when parent is presentField path: errors[].messageCodemessagestringField path: errors[].messageerrorTypestringRequired when parent is presentField path: errors[].errorType{
"messageCode": "badRequest",
"message": "string",
"errors": [
{}
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl 'https://api.subrite.no/api/v1/stats/total-stats?days=%3Cdays%3E' \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/feeds
Authentication: Bearer token (JWT)
pagenumberOptional1minimum: 1takenumberOptional10minimum: 1maximum: 50orderBystringOptional"createdAt"Allowed values: "createdAt", "id", "updatedAt"orderDirectionstringOptional"desc"Allowed values: "asc", "desc"filterFilteredActivityLogActionOptional"initial_purchase", "subscription_renewed", "auto_renewal_turned_off", "auto_renewal_turned_on", "subscription_expired", "payment_failed", "subscription_deactivated", "subscription_inactive", "subscription_reactivated", "subscription_stopped", "next_renewal_updated", "recurring_price_updated", "activation_date_updated", "subscription_activated", "subscription_canceled_before_activation", "update_member_profile", "update_consent", "login", "change_initiated", "change_completed", "change_cancelled", "seat_invitation_sent", "seat_invitation_removed", "seat_invitation_accepted", "seat_member_added", "group_owner_access_enabled", "group_owner_access_disabled", "seat_gift_receiver_added", "seat_gift_receiver_removed", "seat_gift_receiver_accepted", "seat_gift_receiver_invitation_sent", "invoice_sent", "payment_method_updated", "payment_method_removed", "payment_provider_updated", "invoice_address_updated", "delivery_address_updated", "credit_note_created", "refund_registered", "payment_registered", "vipps_recurring_charge_initiated", "ledger_matched", "ledger_unmatched", "ledger_transaction_ignored", "signup"excludestringOptionalitemsarray of ActivityLogResponseRequired6 fieldsitemsactionActivityLogActionRequired when parent is presentField path: items[].action"initial_purchase", "subscription_renewed", "auto_renewal_turned_off", "auto_renewal_turned_on", "subscription_expired", "payment_failed", "subscription_activated", "subscription_deactivated", "subscription_inactive", "subscription_reactivated", "subscription_stopped", "subscription_canceled_before_activation", "activation_date_updated", "next_renewal_updated", "recurring_price_updated", "change_initiated", "change_completed", "change_cancelled", "seat_invitation_sent", "seat_invitation_removed", "seat_invitation_accepted", "seat_member_added", "group_owner_access_enabled", "group_owner_access_disabled", "seat_gift_receiver_added", "seat_gift_receiver_removed", "seat_gift_receiver_accepted", "seat_gift_receiver_invitation_sent", "invoice_sent", "payment_method_updated", "payment_method_removed", "payment_provider_updated", "invoice_address_updated", "delivery_address_updated", "credit_note_created", "refund_registered", "payment_registered", "vipps_recurring_charge_initiated", "ledger_matched", "ledger_unmatched", "ledger_transaction_ignored", "update_member_profile", "update_consent", "login", "signup", "gdpr_deleted"feedobjectRequired when parent is presentField path: items[].feedcreatedAtstring (date-time)Required when parent is presentField path: items[].createdAtmemberIdstringRequired when parent is presentField path: items[].memberIdmemberNumbernumberRequired when parent is presentField path: items[].memberNumberidnumberRequired when parent is presentField path: items[].idmetaPageMetaRequired6 fieldsmetapagenumberRequiredField path: meta.pagetakenumberRequiredField path: meta.takecountnumberRequiredField path: meta.countpageCountnumberRequiredField path: meta.pageCounthasPreviousPagebooleanRequiredField path: meta.hasPreviousPagehasNextPagebooleanRequiredField path: meta.hasNextPage{
"items": [
{
"feed": {}
}
],
"meta": {
"page": 0,
"take": 0,
"count": 0,
"pageCount": 0,
"hasPreviousPage": true,
"hasNextPage": true
}
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/feeds \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/referrer-stats
Authentication: Bearer token (JWT)
daysnumberOptionaldateFromstringOptionaldateTostringOptionalpagenumberOptional1minimum: 1takenumberOptional10minimum: 1maximum: 50orderBystringOptional"count"Allowed values: "count"orderDirectionstringOptional"desc"Allowed values: "asc", "desc"itemsarray of ReferrerStatsDtoRequired3 fieldsitemsreferrerstringRequired when parent is presentField path: items[].referrercountnumberRequired when parent is presentField path: items[].countlastPurchasedAtstring (date-time)Required when parent is presentField path: items[].lastPurchasedAtmetaPageMetaRequired6 fieldsmetapagenumberRequiredField path: meta.pagetakenumberRequiredField path: meta.takecountnumberRequiredField path: meta.countpageCountnumberRequiredField path: meta.pageCounthasPreviousPagebooleanRequiredField path: meta.hasPreviousPagehasNextPagebooleanRequiredField path: meta.hasNextPage{
"items": [
{}
],
"meta": {
"page": 0,
"take": 0,
"count": 0,
"pageCount": 0,
"hasPreviousPage": true,
"hasNextPage": true
}
}badRequest
Same fields as Get all stats for nth days (400).
{
"messageCode": "badRequest",
"message": "string",
"errors": [
{}
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/referrer-stats \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/export/referrer-stats
Authentication: Bearer token (JWT)
dateFromstring (date-time)OptionaldateTostring (date-time)OptionalfileFormatstringOptionalThis response has no body.
unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/export/referrer-stats \
--header 'Authorization: Bearer <token>'POST/api/v1/stats/cron/subscription-summary
Authentication: Bearer token (JWT)
application/jsontenantIdsarray of numberOptional[]{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/subscription-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'POST/api/v1/stats/cron/product-summary
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/product-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'POST/api/v1/stats/cron/member-summary
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/member-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'POST/api/v1/stats/cron/subscription-activity-summary
Authentication: Bearer token (JWT)
application/jsontenantIdsarray of numberOptional[]dataDatestring (date-time)Optional{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/subscription-activity-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}'POST/api/v1/stats/cron/recurring-revenue
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/recurring-revenue \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'POST/api/v1/stats/cron/consent-activity-summary
Authentication: Bearer token (JWT)
application/json{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/consent-activity-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}'POST/api/v1/stats/cron/consent-channel-activity-summary
Authentication: Bearer token (JWT)
application/json{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/consent-channel-activity-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}'POST/api/v1/stats/cron/podcast-access-summary
Authentication: Bearer token (JWT)
application/json{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/podcast-access-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": [],
"dataDate": "yyyy-MM-dd"
}'POST/api/v1/stats/cron/spotify-user-summary
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/spotify-user-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'GET/api/v1/stats/historical-subscriptions
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/typeSubscriptionTypeOptional"all", "free", "paid"groupByGroupByTypeOptional"subscriptionPlan", "package", "paymentProvider"noOfLineNoOfLineOptional3, 4, 5, 7, 100dataarray of HistoricalStatsDataRequired3 fieldsdatalabelnumberRequired when parent is presentField path: data[].labelentitiesarray of StatsGraphDataRequired when parent is presentField path: data[].entities4 fieldsdata[].entitiesidnumberRequired when parent is presentField path: data[].entities[].idnamestringRequired when parent is presentField path: data[].entities[].namecountnumberRequired when parent is presentField path: data[].entities[].countadditionalDatanumberField path: data[].entities[].additionalDatayearnumberRequired when parent is presentField path: data[].yearperiodTimelineGranularityRequired"daily", "weekly", "monthly", "quarterly", "yearly"{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-subscriptions \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-products
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/typeProductTypeOptional"all", "free", "paid"noOfLineNoOfLineOptional3, 4, 5, 7, 100Same fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-products \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-members
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/typeMemberTypeOptional"all", "paid"Same fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-members \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-current-revenue
Each bucket carries two series — recurring (auto-renew on) and expiring (auto-renew off). Buckets after the current period are projected from active subscriptions and capped 12 months ahead. Every bucket carries the same shape whether it was measured or projected — the split point is the current period — and the plan and package options for the graph filter are served separately by /current-revenue-filter-options.
Authentication: Bearer token (JWT)
estimationRevenuePeriodOptional"monthly", "quarterly", "yearly"periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/subscriptionPlanIdnumberOptionalminimum: 1packageIdnumberOptionalminimum: 1Same fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-current-revenue \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/current-revenue-filter-options
All-time options, independent of the graph window. The two lists co-filter each other from the selection passed in: subscriptionPlanId narrows the packages to those observed with that plan, packageId narrows the plans the same way, and neither list is narrowed by its own selection — so every option offered draws a chart with data in it, and the current choice can always be changed. Pass the graph filter as it stands and re-fetch when it changes; omit both for every option the tenant has. The pairs come from the snapshots the graph itself renders, so a package that has carried several plans over its life keeps all of them. Served under the dashboard permission so an admin without plans-and-products access can still filter the graph. Not paged, because each list fills one dropdown: at most 500 plans and the same number of packages are returned, so a tenant with a very long product history cannot produce an unbounded response. Both lists are ordered by revenue in the most recent snapshot, largest first, with name breaking ties; options no longer sold rank last.
Authentication: Bearer token (JWT)
subscriptionPlanIdnumberOptionalminimum: 1packageIdnumberOptionalminimum: 1availablePlansarray of RevenueFilterOptionRequired2 fieldsavailablePlansidnumberRequired when parent is presentField path: availablePlans[].idnamestringRequired when parent is presentField path: availablePlans[].nameavailablePackagesarray of RevenueFilterOptionRequired2 fieldsavailablePackagesidnumberRequired when parent is presentField path: availablePackages[].idnamestringRequired when parent is presentField path: availablePackages[].name{
"availablePlans": [
{}
],
"availablePackages": [
{}
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/current-revenue-filter-options \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/timeline-extent
Authentication: Bearer token (JWT)
graphTimelineGraphRequired"subscriptions", "currentRevenue", "members", "products", "consents", "consentChanges", "consentSource", "subscriptionActivity", "podcastUsers"earliestDatestring{
"earliestDate": "2021-03-15"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl 'https://api.subrite.no/api/v1/stats/timeline-extent?graph=subscriptions' \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-subscriptions-activity
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/Same fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-subscriptions-activity \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-churn-rates
Authentication: Bearer token (JWT)
periodDataSelectionPeriodOptional"weekly", "monthly"typeChurnTypeOptional"gross", "net"groupByGroupByTypeOptional"subscriptionPlan", "package", "paymentProvider"subscriptionTypeSubscriptionTypeOptional"all", "free", "paid"noOfLineNoOfLineOptional3, 4, 5, 7, 100detailsChurnHistoricalStatsResDtoRequired2 fieldsdetailsChurndataarray of HistoricalStatsDataRequiredField path: detailsChurn.data3 fieldsdetailsChurn.datalabelnumberRequired when parent is presentField path: detailsChurn.data[].labelentitiesarray of StatsGraphDataRequired when parent is presentField path: detailsChurn.data[].entitiesNested fields omitted: depth limit.yearnumberRequired when parent is presentField path: detailsChurn.data[].yearperiodDataSelectionPeriodRequiredField path: detailsChurn.period"weekly", "monthly"totalChurnHistoricalStatsResDtoRequired2 fieldstotalChurndataarray of HistoricalStatsDataRequiredField path: totalChurn.data3 fieldstotalChurn.datalabelnumberRequired when parent is presentField path: totalChurn.data[].labelentitiesarray of StatsGraphDataRequired when parent is presentField path: totalChurn.data[].entitiesNested fields omitted: depth limit.yearnumberRequired when parent is presentField path: totalChurn.data[].yearperiodDataSelectionPeriodRequiredField path: totalChurn.period"weekly", "monthly"{
"detailsChurn": {
"data": [],
"period": "weekly"
},
"totalChurn": {
"data": [],
"period": "weekly"
}
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-churn-rates \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-consent-activity
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/consentIdsarray of numberOptionalSame fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-consent-activity \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-consent-summary
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/statusMemberConsentStatusOptional"accepted", "withdrawn"noOfLineNoOfLineOptional3, 4, 5, 7, 100Same fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-consent-summary \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/historical-consent-channel-summary
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/typeMemberConsentStatusOptional"accepted", "withdrawn"consentIdsarray of numberOptionalnoOfLineNoOfLineOptional3, 4, 5, 7, 100Same fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/historical-consent-channel-summary \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/subscription-ended-by-reason
Authentication: Bearer token (JWT)
filterSubscriptionEndedFilterOptional"yesterday", "last_7_days", "last_30_days", "last_year"dataarray of SubscriptionEndedByReasonDataRequired2 fieldsdatareasonstringRequired when parent is presentField path: data[].reasonquantitynumberRequired when parent is presentField path: data[].quantity{
"data": [
{}
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/subscription-ended-by-reason \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/payment-method-stats
Authentication: Bearer token (JWT)
viewTypePaymentMethodViewTypeOptional"quantity", "share_and_churn"dataarray of PaymentMethodDataRequired4 fieldsdatapaymentProviderstringRequired when parent is presentField path: data[].paymentProviderquantitynumberRequired when parent is presentField path: data[].quantitysharenumberField path: data[].sharechurnRatenumberField path: data[].churnRate{
"data": [
{}
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/payment-method-stats \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/podcast-users-summary
Authentication: Bearer token (JWT)
periodTimelineGranularityOptional"daily", "weekly", "monthly", "quarterly", "yearly"fromDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/toDatestringOptionalpattern: /^\d{4}-\d{2}-\d{2}$/subscriptionStatusSUBSCRIPTION_STATUSOptional"all", "active"Same fields as Get historical subscriptions (200).
{
"data": [
{
"entities": []
}
],
"period": "daily"
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/podcast-users-summary \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/podcast-download-stats
Returns download counts for 1 day, 7 days, 30 days, all time, hourly breakdown, and episode breakdown
Authentication: Bearer token (JWT)
datestringOptionalpodcastIdnumberOptionalfromDatestringOptionaltoDatestringOptionalperiodstringOptional"daily"Aggregation period for time-series chartAllowed values: "daily", "weekly", "monthly"episodeIdstringOptionalsummarySummaryCardsDtoRequired4 fieldssummarylast1DaynumberRequiredField path: summary.last1Daylast7DaysnumberRequiredField path: summary.last7Dayslast30DaysnumberRequiredField path: summary.last30DaysallTimenumberRequiredField path: summary.allTimetodayHourlyDownloadsarray of HourlyDownloadDtoRequired2 fieldstodayHourlyDownloadshournumberRequired when parent is presentField path: todayHourlyDownloads[].hourcountnumberRequired when parent is presentField path: todayHourlyDownloads[].countepisodeTablearray of EpisodeDownloadDtoRequired7 fieldsepisodeTableepisodeIdstringRequired when parent is presentField path: episodeTable[].episodeIdepisodeNamestringField path: episodeTable[].episodeNamepodcastIdstringRequired when parent is presentField path: episodeTable[].podcastIdpodcastNamestringField path: episodeTable[].podcastNamepublishedDatestring (date-time)Field path: episodeTable[].publishedDatetotalDownloadsnumberRequired when parent is presentField path: episodeTable[].totalDownloadspercentageOfTotalnumberRequired when parent is presentField path: episodeTable[].percentageOfTotaltimeSeriesDataarray of TimeSeriesDataPointDtoRequired2 fieldstimeSeriesDatadatestringRequired when parent is presentField path: timeSeriesData[].datecountnumberRequired when parent is presentField path: timeSeriesData[].count{
"summary": {
"last1Day": 0,
"last7Days": 0,
"last30Days": 0,
"allTime": 0
},
"todayHourlyDownloads": [
{}
],
"episodeTable": [
{}
],
"timeSeriesData": [
{}
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/podcast-download-stats \
--header 'Authorization: Bearer <token>'POST/api/v1/stats/cron/podcast-download-summary
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/podcast-download-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'POST/api/v1/stats/backfill/podcast-download-summary
Re-runs the hourly aggregation with the current deduplication logic and overwrites existing hourly counts. Use to repair historical rows (e.g. inflated counts). Does not move the regular hourly cron checkpoint.
Authentication: Bearer token (JWT)
application/jsontenantIdnumberRequiredfromDatestringRequiredtoDatestringRequired{
"tenantId": 32,
"fromDate": "2026-05-20",
"toDate": "2026-05-21"
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/backfill/podcast-download-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantId": 32,
"fromDate": "2026-05-20",
"toDate": "2026-05-21"
}'GET/api/v1/stats/checkout-funnel-stats
Returns funnel stage counts, conversion rates, and comparison data for checkout flow
Authentication: Bearer token (JWT)
fromDatestringOptionaltoDatestringOptionalpackageSlugstringOptionalpaymentMethodstringOptionalpackageSlugsarray of stringOptionalmaxItems: 3paymentMethodsarray of stringOptionalmaxItems: 3viewModestringOptional"single"View modeAllowed values: "single", "compare-packages", "compare-payments"funnelsarray of FunnelDataDtoRequired6 fieldsfunnelsidstringRequired when parent is presentField path: funnels[].idnamestringRequired when parent is presentField path: funnels[].namestagesarray of FunnelStageDtoRequired when parent is presentField path: funnels[].stages5 fieldsfunnels[].stagesnamestringRequired when parent is presentField path: funnels[].stages[].namecountnumberRequired when parent is presentField path: funnels[].stages[].countpercentagenumberRequired when parent is presentField path: funnels[].stages[].percentagedropnumberField path: funnels[].stages[].dropdropPercentnumberField path: funnels[].stages[].dropPercentconversionRatenumberRequired when parent is presentField path: funnels[].conversionRatepreviousConversionRatenumberField path: funnels[].previousConversionRatechangenumberField path: funnels[].changeavailablePackagesarray of stringRequiredavailablePaymentMethodsarray of stringRequired{
"funnels": [
{
"stages": []
}
],
"availablePackages": [
"string"
],
"availablePaymentMethods": [
"string"
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/checkout-funnel-stats \
--header 'Authorization: Bearer <token>'POST/api/v1/stats/cron/checkout-funnel-summary
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/checkout-funnel-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'GET/api/v1/stats/customer-economics
Authentication: Bearer token (JWT)
datestring (date-time)OptionalarpunumberRequiredchurn3mnumberRequiredlifetimeValuenumberRequiredlifetimeLengthnumberRequired{
"arpu": 0,
"churn3m": 0,
"lifetimeValue": 0,
"lifetimeLength": 0
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/customer-economics \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/accumulated-payment-flow
Authentication: Bearer token (JWT)
yearnumberOptionalminimum: 2000maximum: 2100monthnumberOptionalminimum: 1maximum: 12currentMonthMonthlyPaymentFlowDataRequired3 fieldscurrentMonthyearnumberRequiredField path: currentMonth.yearmonthnumberRequiredField path: currentMonth.monthdaysarray of DailyPaymentDataRequiredField path: currentMonth.days2 fieldscurrentMonth.daysdaynumberRequired when parent is presentField path: currentMonth.days[].dayaccumulatedAmountnumberRequired when parent is presentField path: currentMonth.days[].accumulatedAmountpreviousMonthMonthlyPaymentFlowDataRequired3 fieldspreviousMonthyearnumberRequiredField path: previousMonth.yearmonthnumberRequiredField path: previousMonth.monthdaysarray of DailyPaymentDataRequiredField path: previousMonth.days2 fieldspreviousMonth.daysdaynumberRequired when parent is presentField path: previousMonth.days[].dayaccumulatedAmountnumberRequired when parent is presentField path: previousMonth.days[].accumulatedAmount{
"currentMonth": {
"year": 2024,
"month": 12,
"days": []
},
"previousMonth": {
"year": 2024,
"month": 12,
"days": []
}
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/accumulated-payment-flow \
--header 'Authorization: Bearer <token>'GET/api/v1/stats/logged-in-user-stats
Authentication: Bearer token (JWT)
fromDatestringOptionaltoDatestringOptionaltotalLoggedInnumberRequiredwithSubscriptionnumberRequired{
"totalLoggedIn": 0,
"withSubscription": 0
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/logged-in-user-stats \
--header 'Authorization: Bearer <token>'POST/api/v1/stats/cron/logged-in-users-summary
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/logged-in-users-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'GET/api/v1/stats/content-type-visit-stats
Authentication: Bearer token (JWT)
fromDatestringOptionaltoDatestringOptionaldataPointsarray of ContentTypeVisitDataPointDtoRequired4 fieldsdataPointsdatestringRequired when parent is presentField path: dataPoints[].datecontentTypestringRequired when parent is presentField path: dataPoints[].contentTypedeviceTypestringRequired when parent is presentField path: dataPoints[].deviceTypecountnumberRequired when parent is presentField path: dataPoints[].count{
"dataPoints": [
{}
]
}unauthorized
This response has no body.
forbiddenResource
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/content-type-visit-stats \
--header 'Authorization: Bearer <token>'POST/api/v1/stats/cron/content-type-visit-summary
Authentication: Bearer token (JWT)
application/jsonSame fields as Run subscription summary job for all tenants (Request body).
{
"tenantIds": []
}This response has no body.
unauthorized
Same fields as Get basic stats (403).
{
"messageCode": "string",
"message": "string",
"errors": [
{}
]
}curlcurl https://api.subrite.no/api/v1/stats/cron/content-type-visit-summary \
--request POST \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"tenantIds": []
}'