curl --request GET \
--url https://api.flightlinehq.com/v1/reviews/{review_id}/reportimport requests
url = "https://api.flightlinehq.com/v1/reviews/{review_id}/report"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.flightlinehq.com/v1/reviews/{review_id}/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.flightlinehq.com/v1/reviews/{review_id}/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.flightlinehq.com/v1/reviews/{review_id}/report"
req, _ := http.NewRequest("GET", url, nil)
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.flightlinehq.com/v1/reviews/{review_id}/report")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flightlinehq.com/v1/reviews/{review_id}/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"generated_at": "2026-05-30T17:42:00Z",
"issues": [
{
"category": "compliance",
"code": "APR-003",
"severity": "high",
"summary": "The disclosed APR is outside the allowed tolerance.",
"title": "APR tolerance exceeded"
},
{
"category": "documentation",
"code": "DOC-011",
"severity": "medium",
"summary": "A required income document was not found in the package.",
"title": "Missing income documentation"
}
],
"outcome": "issues_found",
"report_pdf_expires_at": "2026-05-30T17:47:00Z",
"report_pdf_url": "https://downloads.example.com/report.pdf?signature=...",
"review_id": "9b2c1f3a-4d5e-6789-abcd-ef0123456789",
"sandbox": false,
"status": "completed",
"summary": {
"critical": 0,
"high": 1,
"info": 0,
"low": 0,
"medium": 1,
"total": 2
}
}{
"error": {
"code": "missing_api_key",
"message": "Missing API key. Send 'Authorization: Bearer <key>'."
}
}{
"error": {
"code": "report_not_ready",
"message": "Report is not available yet for this review."
}
}{
"error": {
"code": "report_not_ready",
"message": "Report not available for this review."
}
}{
"error": {
"code": "review_failed",
"message": "This review failed and has no report. Check the review status; you may need to resubmit."
}
}Get Review Report
Get the customer-released report for a completed review.
Failure contract — the status code tells an integrator what to do:
- 200 — review
completed; the report body follows. - 422 — review
failed(terminal). No report will ever exist; stop polling and inspect the review / resubmit. Distinct from 404 so a failure is never mistaken for “still processing”. - 404 — review not found, OR not finished yet (
queued/processing); keep polling. We never leak verdict-adjacent signal before the publication gate passes.
curl --request GET \
--url https://api.flightlinehq.com/v1/reviews/{review_id}/reportimport requests
url = "https://api.flightlinehq.com/v1/reviews/{review_id}/report"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.flightlinehq.com/v1/reviews/{review_id}/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.flightlinehq.com/v1/reviews/{review_id}/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.flightlinehq.com/v1/reviews/{review_id}/report"
req, _ := http.NewRequest("GET", url, nil)
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.flightlinehq.com/v1/reviews/{review_id}/report")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flightlinehq.com/v1/reviews/{review_id}/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"generated_at": "2026-05-30T17:42:00Z",
"issues": [
{
"category": "compliance",
"code": "APR-003",
"severity": "high",
"summary": "The disclosed APR is outside the allowed tolerance.",
"title": "APR tolerance exceeded"
},
{
"category": "documentation",
"code": "DOC-011",
"severity": "medium",
"summary": "A required income document was not found in the package.",
"title": "Missing income documentation"
}
],
"outcome": "issues_found",
"report_pdf_expires_at": "2026-05-30T17:47:00Z",
"report_pdf_url": "https://downloads.example.com/report.pdf?signature=...",
"review_id": "9b2c1f3a-4d5e-6789-abcd-ef0123456789",
"sandbox": false,
"status": "completed",
"summary": {
"critical": 0,
"high": 1,
"info": 0,
"low": 0,
"medium": 1,
"total": 2
}
}{
"error": {
"code": "missing_api_key",
"message": "Missing API key. Send 'Authorization: Bearer <key>'."
}
}{
"error": {
"code": "report_not_ready",
"message": "Report is not available yet for this review."
}
}{
"error": {
"code": "report_not_ready",
"message": "Report not available for this review."
}
}{
"error": {
"code": "review_failed",
"message": "This review failed and has no report. Check the review status; you may need to resubmit."
}
}Path Parameters
Response
Successful Response
The customer-facing report for a completed review.
Only available once the review is completed (i.e. the internal
publication gate has released the case). Before that, the report
endpoint returns 404 so verdict-adjacent signal never leaks early.
Customer-facing review lifecycle.
A deliberately coarse projection of the internal CaseStatus. Internal
states that are not meaningful to a customer (e.g. the admin-release gate
pending_review, the publication-blocker state) collapse to
processing so we never surface internal workflow detail or
verdict-adjacent signal before the publication gate passes.
queued, awaiting_documents, processing, completed, failed Roll-up of issue counts by severity.
Show child attributes
Show child attributes
{
"critical": 0,
"high": 1,
"info": 0,
"low": 0,
"medium": 1,
"total": 2
}
Show child attributes
Show child attributes
Overall outcome, e.g. 'clear' or 'issues_found'.
"issues_found"
Expiry timestamp for report_pdf_url.
Fresh, short-lived download URL for the current released report PDF. Request this report endpoint again after an amendment or after expiry.
True for sandbox (test-mode) reviews: the issues below are canned sample data.

