curl --request GET \
--url https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau \
--header 'Authorization: <api-key>'import requests
url = "https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau', 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://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau",
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: <api-key>"
],
]);
$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://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"policyNumber": "POL-2025-001",
"primaryInsuredName": "Mercy General Hospital",
"transactionAction": "NEW_BUSINESS",
"policyVersion": 1,
"effectiveDate": "2025-01-01",
"transactionTimestamp": "2025-01-15T10:30:00.000Z",
"policyStartDate": "2025-01-01",
"policyEndDate": "2026-01-01",
"createdAt": "2025-01-15T10:30:00.000Z",
"createdBy": "api-key|abc123",
"policyPremium": 85000,
"policyPremiumChange": 85000,
"fieldColumns": {}
},
{
"policyNumber": "POL-2025-001",
"primaryInsuredName": "Mercy General Hospital",
"transactionAction": "ENDORSE",
"policyVersion": 2,
"effectiveDate": "2025-06-01",
"transactionTimestamp": "2025-06-01T14:00:00.000Z",
"policyStartDate": "2025-01-01",
"policyEndDate": "2026-01-01",
"createdAt": "2025-06-01T14:00:00.000Z",
"createdBy": "api-key|abc123",
"policyPremium": 102000,
"policyPremiumChange": 17000,
"fieldColumns": {}
}
],
"totalCount": 2
}List Bordereau Rows
Returns a paginated, flat list of transaction-level premium rows (a “bordereau”). Each row represents one policy transaction and includes fixed columns (policy number, insured name, action, dates, premium, premium change) plus optional field columns resolved from the policy’s field data.
Use periodStart and periodEnd to scope the report to transactions whose
transactionTimestamp falls within the half-open interval [periodStart, periodEnd).
Use actions to filter by transaction type (e.g. only NEW_BUSINESS and ENDORSE).
Use columns with {"kind":"field"} entries to transpose any policy fields
into the fieldColumns map on each row. Each entry maps a dot-path into the
policy’s field data to a named column header. Each row resolves its paths
against the policy data as of that transaction’s effective date, so
fields that vary over the policy term (e.g. a mid-term endorsement’s
changes, or the post-cancellation status) report the value the transaction
put in force. A path that does not exist in the policy data yields an empty
value, not an error.
Note: this endpoint accepts {"kind":"field"} column specs ONLY — its
typed JSON rows always carry every fixed property, so fixed-column selection
and ordering have no meaning here, and a {"kind":"fixed"} entry is
rejected with HTTP 400. For full column selection and ordering use an
export run (POST /policies/bordereau/export-runs), whose finished
file downloads as CSV or Excel and can be delivered to Google Drive.
Required permission: policy.view
curl --request GET \
--url https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau \
--header 'Authorization: <api-key>'import requests
url = "https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau', 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://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau",
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: <api-key>"
],
]);
$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://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://go.aiinsurance.io/api/v1/companies/{companyId}/policies/bordereau")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"items": [
{
"policyNumber": "POL-2025-001",
"primaryInsuredName": "Mercy General Hospital",
"transactionAction": "NEW_BUSINESS",
"policyVersion": 1,
"effectiveDate": "2025-01-01",
"transactionTimestamp": "2025-01-15T10:30:00.000Z",
"policyStartDate": "2025-01-01",
"policyEndDate": "2026-01-01",
"createdAt": "2025-01-15T10:30:00.000Z",
"createdBy": "api-key|abc123",
"policyPremium": 85000,
"policyPremiumChange": 85000,
"fieldColumns": {}
},
{
"policyNumber": "POL-2025-001",
"primaryInsuredName": "Mercy General Hospital",
"transactionAction": "ENDORSE",
"policyVersion": 2,
"effectiveDate": "2025-06-01",
"transactionTimestamp": "2025-06-01T14:00:00.000Z",
"policyStartDate": "2025-01-01",
"policyEndDate": "2026-01-01",
"createdAt": "2025-06-01T14:00:00.000Z",
"createdBy": "api-key|abc123",
"policyPremium": 102000,
"policyPremiumChange": 17000,
"fieldColumns": {}
}
],
"totalCount": 2
}Authorizations
API key authentication. Send your raw API key as the Authorization header value with NO scheme prefix — Authorization: YOUR-API-KEY. Do NOT prefix it with Bearer or ApiKey, and do not use an X-API-Key header; those are not accepted.
Path Parameters
Company identifier
Query Parameters
Inclusive lower bound on transactionTimestamp. Only transactions at or after
this timestamp are included.
Exclusive upper bound on transactionTimestamp. Only transactions before
this timestamp are included.
Comma-separated list of transaction actions to include.
Valid values: NEW_BUSINESS, ENDORSE, CANCEL, REINSTATE, RENEW.
Omit to include all actions.
Note: Unrecognized action values are not rejected — they silently match zero rows. Double-check spelling if results are unexpectedly empty.
JSON-encoded array of {"kind":"field"} column specs (see
BordereauColumnSpec). Each entry maps a path (dot-separated path into
the policy's field data) to a header (the key it appears under in each
row's fieldColumns map).
Any field path is accepted, including bare top-level per-segment fields
(e.g. policyStatus): each row resolves its paths against the policy
data as of that transaction's effective date. A malformed dot-path
(empty, or with leading/trailing/doubled dots) is rejected with HTTP 400
(InvalidProperties); a well-formed path that doesn't exist in the
policy data yields an empty value.
{"kind":"fixed"} entries are rejected with HTTP 400 on this endpoint —
the typed JSON rows always include every fixed property.
JSON-encoded policy filters selecting which policies contribute
transactions. Tenant filters must use fieldType: "declared" and a
policy-surface listFilters key. Fixed system filters remain explicit;
implicit field-derived forms fail with 400
implicit-filters-disabled.
Field to sort results by. Default transactionTimestamp.
policyNumber, primaryInsuredName, effectiveDate, transactionTimestamp, createdAt Sort direction (default desc).
asc, desc Maximum number of rows to return per request. Default 50, maximum 1000.
1 <= x <= 1000Number of rows to skip before returning results. Default 0.
x >= 0