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 the premium bordereau as paginated JSON rows, one per policy
transaction (new business, renewal, endorsement, cancellation and
reinstatement), with the policy number, insured name, transaction type,
dates, policy premium and premium change, plus any policy fields you add as
columns. Use it to read or page through bordereau rows in code. For a
complete bordereau file with your choice and order of columns, as CSV, Excel
or a Google Sheet, use Start Bordereau Export Run
(startBordereauExportRun) instead.
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
Query Parameters
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.
