settings-v0
Report the company's milestone items
The milestone grant ledger for grants written in a range of days (UTC; a grant is written when it comes due): counts by status, source, deferral reason and rule, the substitutions, and one cursor page of the grants, newest first. Statuses are the grants’ statuses now, so a grant deferred once and delivered later counts as fulfilled. Needs the milestone_items feature to work for the company. Reading changes nothing. Responses are not cached.
GET
/
api
/
subscription_pro
/
milestone_report
Report the company's milestone items
curl --request GET \
--url https://api.fluid.app/api/subscription_pro/milestone_report \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/subscription_pro/milestone_report"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/subscription_pro/milestone_report', 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://api.fluid.app/api/subscription_pro/milestone_report",
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://api.fluid.app/api/subscription_pro/milestone_report"
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://api.fluid.app/api/subscription_pro/milestone_report")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/milestone_report")
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{
"milestone_report": {
"from": "2026-10-01",
"to": "2026-10-31",
"summary": {
"total": 3,
"by_status": {
"planned": 1,
"on_order": 0,
"fulfilled": 1,
"deferred": 0,
"skipped_out_of_stock": 1,
"voided": 0
},
"by_source": {
"rule": 2,
"manual": 1,
"retention_offer": 0
},
"deferred_by_reason": {
"gate_closed": 0,
"out_of_stock": 0
},
"substitutions": 1,
"by_rule": [
{
"rule_id": 41,
"rule_name": "Anniversary watch",
"total": 2,
"by_status": {
"planned": 0,
"on_order": 0,
"fulfilled": 1,
"deferred": 0,
"skipped_out_of_stock": 1,
"voided": 0
},
"substitutions": 1
}
]
},
"grants": [
{
"id": 5523,
"subscription_token": "sb_8f2c1d9e7a",
"source": "rule",
"status": "fulfilled",
"deferral_reason": null,
"rule_id": 41,
"rule_name": "Anniversary watch",
"occurrence_key": "anniversary:1",
"item_key": "3f1c2a9e-5b7d-4e8f-9a1b-2c3d4e5f6a7b",
"variant_id": 9013,
"variant_title": "Classic Watch, silver",
"main_variant_id": 9012,
"substituted": true,
"quantity": 1,
"unit_price": "0.00",
"currency_code": "USD",
"volume_policy": "zero",
"removable": false,
"order_id": 771204,
"created_at": "2026-10-03T06:00:12Z",
"updated_at": "2026-10-03T06:02:40Z"
}
]
},
"status": 200,
"meta": {
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer token authentication
Query Parameters
The first day (UTC). Defaults to 29 days before to.
The last day (UTC), inclusive. Defaults to today. At most 365 days after from, so the range covers at most 366 days.
Only the grants of this rule.
Available options:
planned, on_order, fulfilled, deferred, skipped_out_of_stock, voided Available options:
rule, manual, retention_offer The cursor of the page to read; left out is the newest page.
Grants per page.
Required range:
1 <= x <= 100⌘I
Report the company's milestone items
curl --request GET \
--url https://api.fluid.app/api/subscription_pro/milestone_report \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/subscription_pro/milestone_report"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/subscription_pro/milestone_report', 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://api.fluid.app/api/subscription_pro/milestone_report",
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://api.fluid.app/api/subscription_pro/milestone_report"
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://api.fluid.app/api/subscription_pro/milestone_report")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/milestone_report")
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{
"milestone_report": {
"from": "2026-10-01",
"to": "2026-10-31",
"summary": {
"total": 3,
"by_status": {
"planned": 1,
"on_order": 0,
"fulfilled": 1,
"deferred": 0,
"skipped_out_of_stock": 1,
"voided": 0
},
"by_source": {
"rule": 2,
"manual": 1,
"retention_offer": 0
},
"deferred_by_reason": {
"gate_closed": 0,
"out_of_stock": 0
},
"substitutions": 1,
"by_rule": [
{
"rule_id": 41,
"rule_name": "Anniversary watch",
"total": 2,
"by_status": {
"planned": 0,
"on_order": 0,
"fulfilled": 1,
"deferred": 0,
"skipped_out_of_stock": 1,
"voided": 0
},
"substitutions": 1
}
]
},
"grants": [
{
"id": 5523,
"subscription_token": "sb_8f2c1d9e7a",
"source": "rule",
"status": "fulfilled",
"deferral_reason": null,
"rule_id": 41,
"rule_name": "Anniversary watch",
"occurrence_key": "anniversary:1",
"item_key": "3f1c2a9e-5b7d-4e8f-9a1b-2c3d4e5f6a7b",
"variant_id": 9013,
"variant_title": "Classic Watch, silver",
"main_variant_id": 9012,
"substituted": true,
"quantity": 1,
"unit_price": "0.00",
"currency_code": "USD",
"volume_policy": "zero",
"removable": false,
"order_id": 771204,
"created_at": "2026-10-03T06:00:12Z",
"updated_at": "2026-10-03T06:02:40Z"
}
]
},
"status": 200,
"meta": {
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": null
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}