Queue the annual CARF export for a calendar year
curl --request POST \
--url https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '{
"year": 2025
}'import requests
url = "https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports"
payload = { "year": 2025 }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({year: 2025})
};
fetch('https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports', 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.range.org/v2/workflows/{workflowId}/carf/annual-exports",
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([
'year' => 2025
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports"
payload := strings.NewReader("{\n \"year\": 2025\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.range.org/v2/workflows/{workflowId}/carf/annual-exports")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"year\": 2025\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"year\": 2025\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"occurrence_at": "2023-11-07T05:31:56Z",
"rerun_of": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"requested_cutoff": "2023-11-07T05:31:56Z",
"execution_status": "queued",
"tx_sync_status": "not_applicable",
"delivery_status": "not_required",
"review_status": "not_required",
"carf_missing_count": 123,
"created_at": "2023-11-07T05:31:56Z",
"cases": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "execution"
}
],
"period": {
"start": "<string>",
"end": "<string>",
"label": "<string>"
},
"warnings": [
"<string>"
],
"reason": "<string>",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": null
}CARF
Request an annual CARF export
Request a CARF export for a calendar year using Europe/London boundaries.
POST
/
v2
/
workflows
/
{workflowId}
/
carf
/
annual-exports
Queue the annual CARF export for a calendar year
curl --request POST \
--url https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '{
"year": 2025
}'import requests
url = "https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports"
payload = { "year": 2025 }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({year: 2025})
};
fetch('https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports', 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.range.org/v2/workflows/{workflowId}/carf/annual-exports",
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([
'year' => 2025
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports"
payload := strings.NewReader("{\n \"year\": 2025\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.range.org/v2/workflows/{workflowId}/carf/annual-exports")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"year\": 2025\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/workflows/{workflowId}/carf/annual-exports")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"year\": 2025\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"occurrence_at": "2023-11-07T05:31:56Z",
"rerun_of": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"requested_cutoff": "2023-11-07T05:31:56Z",
"execution_status": "queued",
"tx_sync_status": "not_applicable",
"delivery_status": "not_required",
"review_status": "not_required",
"carf_missing_count": 123,
"created_at": "2023-11-07T05:31:56Z",
"cases": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "execution"
}
],
"period": {
"start": "<string>",
"end": "<string>",
"label": "<string>"
},
"warnings": [
"<string>"
],
"reason": "<string>",
"queued_at": "2023-11-07T05:31:56Z",
"started_at": null
}The annual export classifies every transfer in the reporting period that has no CARF type, including transfers already sent. The run is held for review when review is enabled.
Authorizations
AuthorizationAuthorization
Authorization method required to allow user to access the api endpoints.
Path Parameters
Body
application/json
Calendar year (Europe/London).
Required range:
1970 <= x <= 9999Example:
2025
Response
202 - application/json
Inclusive observation bound; period.end is the exclusive end of the stored half-open period.
Available options:
queued, running, succeeded, failed, cancelled, skipped Available options:
not_applicable, waiting, completed, expired Available options:
not_required, pending, sending, sent, failed, cancelled, held CARF review: needs_labels and awaiting_review are held (delivery held); sent once released.
Available options:
not_required, needs_labels, awaiting_review, sent CARF: reported transfers with no type. Null outside CARF review.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Example:
null
Last modified on November 10, 2026
Was this page helpful?