curl --request GET \
--url https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking \
--header 'Authorization: Bearer <token>'import requests
url = "https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking', 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-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking",
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-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking"
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-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking")
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{
"status_code": 200,
"data": {
"trackable": true,
"tracking_number": "9400100000000000000000",
"carrier": "usps",
"carrier_label": "USPS",
"service": "USPS Ground Advantage",
"status": "delivered",
"status_label": "Delivered",
"shipped_at": "2026-08-24T15:02:00Z",
"estimated_delivery_at": "2026-08-27T00:00:00Z",
"delivered_at": "2026-08-26T17:45:00Z",
"delivered_to": "J.SMITH",
"synced_at": "2026-08-26T18:02:00Z",
"carrier_tracking_url": "https://tools.usps.com/go/TrackConfirmAction?tLabels=9400100000000000000000",
"events": [
{
"status": "label_created",
"status_label": "Label created",
"description": "Shipping label created, item awaiting pickup",
"occurred_at": "2026-08-24T15:02:00Z",
"occurred_at_local": "2026-08-24T10:02:00",
"utc_offset_minutes": -300,
"city": "Austin",
"state": "TX",
"postal_code": "78701",
"country": "US"
},
{
"status": "in_transit",
"status_label": "In transit",
"description": "Departed shipping facility",
"occurred_at": "2026-08-25T02:40:00Z",
"occurred_at_local": "2026-08-24T21:40:00",
"utc_offset_minutes": -300,
"city": "Dallas",
"state": "TX",
"postal_code": "75201",
"country": "US"
},
{
"status": "delivered",
"status_label": "Delivered",
"description": "Delivered, in/at mailbox",
"occurred_at": "2026-08-26T17:45:00Z",
"occurred_at_local": "2026-08-26T11:45:00",
"utc_offset_minutes": -360,
"city": "Denver",
"state": "CO",
"postal_code": "80202",
"country": "US"
}
]
},
"query_generated_time": 1712847600000
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Track a Mailed Document
Where a mailed document is, and everywhere it has been.
Returns the current delivery stage plus the carrier’s full scan history, oldest first. Reads what we already hold rather than calling the carrier, so it is cheap to poll while a page is open; use the refresh endpoint to force a live read.
Scan times come in two forms. occurred_at is UTC and is what to sort by.
occurred_at_local is the wall-clock reading at the place the parcel was
scanned, with utc_offset_minutes giving the zone — display those, or a
parcel scanned at 21:14 in Memphis will read as 02:14 the next day.
An empty events list is normal for the first several hours after a label is
bought and does not mean tracking has failed. Check trackable to tell that
apart from a service that has no barcode at all, such as a letter.
curl --request GET \
--url https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking \
--header 'Authorization: Bearer <token>'import requests
url = "https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking', 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-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking",
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-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking"
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-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.finogates.com/v1/platform/payments/document-mailing/{payment_id}/tracking")
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{
"status_code": 200,
"data": {
"trackable": true,
"tracking_number": "9400100000000000000000",
"carrier": "usps",
"carrier_label": "USPS",
"service": "USPS Ground Advantage",
"status": "delivered",
"status_label": "Delivered",
"shipped_at": "2026-08-24T15:02:00Z",
"estimated_delivery_at": "2026-08-27T00:00:00Z",
"delivered_at": "2026-08-26T17:45:00Z",
"delivered_to": "J.SMITH",
"synced_at": "2026-08-26T18:02:00Z",
"carrier_tracking_url": "https://tools.usps.com/go/TrackConfirmAction?tLabels=9400100000000000000000",
"events": [
{
"status": "label_created",
"status_label": "Label created",
"description": "Shipping label created, item awaiting pickup",
"occurred_at": "2026-08-24T15:02:00Z",
"occurred_at_local": "2026-08-24T10:02:00",
"utc_offset_minutes": -300,
"city": "Austin",
"state": "TX",
"postal_code": "78701",
"country": "US"
},
{
"status": "in_transit",
"status_label": "In transit",
"description": "Departed shipping facility",
"occurred_at": "2026-08-25T02:40:00Z",
"occurred_at_local": "2026-08-24T21:40:00",
"utc_offset_minutes": -300,
"city": "Dallas",
"state": "TX",
"postal_code": "75201",
"country": "US"
},
{
"status": "delivered",
"status_label": "Delivered",
"description": "Delivered, in/at mailbox",
"occurred_at": "2026-08-26T17:45:00Z",
"occurred_at_local": "2026-08-26T11:45:00",
"utc_offset_minutes": -360,
"city": "Denver",
"state": "CO",
"postal_code": "80202",
"country": "US"
}
]
},
"query_generated_time": 1712847600000
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Path Parameters
The document-mailing payment id.
Response
Where the mailed document is, with its full scan history.

