Export the company's milestone items as a CSV
The grants that the milestone report would count for the same range and filters, newest first, as a CSV with one row per grant: id, created_at, updated_at, subscription_token, rule_id, rule_name, source, status, deferral_reason, occurrence_key, variant_id, variant_title, main_variant_id, substituted, quantity, unit_price, currency_code, volume_policy and order_id. The file is built in the request, so a range of more than 20000 grants is refused; choose a shorter range or filter by rule, status or source. The response names a signed link to the file that expires after 12 hours. Needs the milestone_items feature to work for the company. Nothing is changed. Responses are not cached.
curl --request POST \
--url https://api.fluid.app/api/subscription_pro/milestone_report/export_csv \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": "2026-10-01",
"to": "2026-10-31",
"status": "fulfilled"
}
'import requests
url = "https://api.fluid.app/api/subscription_pro/milestone_report/export_csv"
payload = {
"from": "2026-10-01",
"to": "2026-10-31",
"status": "fulfilled"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({from: '2026-10-01', to: '2026-10-31', status: 'fulfilled'})
};
fetch('https://api.fluid.app/api/subscription_pro/milestone_report/export_csv', 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/export_csv",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => '2026-10-01',
'to' => '2026-10-31',
'status' => 'fulfilled'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/subscription_pro/milestone_report/export_csv"
payload := strings.NewReader("{\n \"from\": \"2026-10-01\",\n \"to\": \"2026-10-31\",\n \"status\": \"fulfilled\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/subscription_pro/milestone_report/export_csv")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": \"2026-10-01\",\n \"to\": \"2026-10-31\",\n \"status\": \"fulfilled\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/milestone_report/export_csv")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": \"2026-10-01\",\n \"to\": \"2026-10-31\",\n \"status\": \"fulfilled\"\n}"
response = http.request(request)
puts response.read_body{
"url": "https://storage.googleapis.com/fluid-uploads/uploads/20261031/6f1c2d9e-3b7a-4c1e-9d2f-8a5b7c3e1f40/milestone-report-2026-10-01-2026-10-31.csv",
"status": 200,
"meta": {
"request_id": "7d2f4c1a-9b3e-4f6d-8a21-3c5e0b9f1d42",
"timestamp": "2026-10-31T12:00:00Z"
}
}{
"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
Body
The range and filters of the milestone report. A page is not taken.
The first day (UTC). Defaults to 29 days before to.
The last day (UTC), inclusive. Defaults to today. At most 365 days after from.
Only the grants of this rule.
Only the grants in this status.
planned, on_order, fulfilled, deferred, skipped_out_of_stock, voided Only the grants from this source.
rule, manual, retention_offer curl --request POST \
--url https://api.fluid.app/api/subscription_pro/milestone_report/export_csv \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"from": "2026-10-01",
"to": "2026-10-31",
"status": "fulfilled"
}
'import requests
url = "https://api.fluid.app/api/subscription_pro/milestone_report/export_csv"
payload = {
"from": "2026-10-01",
"to": "2026-10-31",
"status": "fulfilled"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({from: '2026-10-01', to: '2026-10-31', status: 'fulfilled'})
};
fetch('https://api.fluid.app/api/subscription_pro/milestone_report/export_csv', 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/export_csv",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from' => '2026-10-01',
'to' => '2026-10-31',
'status' => 'fulfilled'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/subscription_pro/milestone_report/export_csv"
payload := strings.NewReader("{\n \"from\": \"2026-10-01\",\n \"to\": \"2026-10-31\",\n \"status\": \"fulfilled\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/subscription_pro/milestone_report/export_csv")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"from\": \"2026-10-01\",\n \"to\": \"2026-10-31\",\n \"status\": \"fulfilled\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/subscription_pro/milestone_report/export_csv")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"from\": \"2026-10-01\",\n \"to\": \"2026-10-31\",\n \"status\": \"fulfilled\"\n}"
response = http.request(request)
puts response.read_body{
"url": "https://storage.googleapis.com/fluid-uploads/uploads/20261031/6f1c2d9e-3b7a-4c1e-9d2f-8a5b7c3e1f40/milestone-report-2026-10-01-2026-10-31.csv",
"status": 200,
"meta": {
"request_id": "7d2f4c1a-9b3e-4f6d-8a21-3c5e0b9f1d42",
"timestamp": "2026-10-31T12:00:00Z"
}
}{
"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"
}
}