curl --request PUT \
--url https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"categories": [
"LEAFY_GREENS"
],
"effective_date": "2026-01-01",
"exemption_code": "1305_c",
"notes": "Small farm declaration on file.",
"scope": "categories"
}
'import requests
url = "https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}"
payload = {
"categories": ["LEAFY_GREENS"],
"effective_date": "2026-01-01",
"exemption_code": "1305_c",
"notes": "Small farm declaration on file.",
"scope": "categories"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
categories: ['LEAFY_GREENS'],
effective_date: '2026-01-01',
exemption_code: '1305_c',
notes: 'Small farm declaration on file.',
scope: 'categories'
})
};
fetch('https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}', 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://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'categories' => [
'LEAFY_GREENS'
],
'effective_date' => '2026-01-01',
'exemption_code' => '1305_c',
'notes' => 'Small farm declaration on file.',
'scope' => 'categories'
]),
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://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}"
payload := strings.NewReader("{\n \"categories\": [\n \"LEAFY_GREENS\"\n ],\n \"effective_date\": \"2026-01-01\",\n \"exemption_code\": \"1305_c\",\n \"notes\": \"Small farm declaration on file.\",\n \"scope\": \"categories\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"categories\": [\n \"LEAFY_GREENS\"\n ],\n \"effective_date\": \"2026-01-01\",\n \"exemption_code\": \"1305_c\",\n \"notes\": \"Small farm declaration on file.\",\n \"scope\": \"categories\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"categories\": [\n \"LEAFY_GREENS\"\n ],\n \"effective_date\": \"2026-01-01\",\n \"exemption_code\": \"1305_c\",\n \"notes\": \"Small farm declaration on file.\",\n \"scope\": \"categories\"\n}"
response = http.request(request)
puts response.read_body{
"categories": [
"LEAFY_GREENS"
],
"effective_date": "2026-01-01",
"exemption_code": "1305_c",
"gtins": [],
"has_evidence_document": true,
"id": "Wq3XzVn2Yk7mPaR5tBc8Lh",
"notes": "Small farm declaration on file.",
"scope": "categories",
"state": "active"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}Replace an FSMA exemption
Replace every field of an exemption; send them all, and expiry_date null for no expiry. An evidence document already on file is kept. Requires the Owner, Manager or Editor role; a read-only key is refused with 403.
curl --request PUT \
--url https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"categories": [
"LEAFY_GREENS"
],
"effective_date": "2026-01-01",
"exemption_code": "1305_c",
"notes": "Small farm declaration on file.",
"scope": "categories"
}
'import requests
url = "https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}"
payload = {
"categories": ["LEAFY_GREENS"],
"effective_date": "2026-01-01",
"exemption_code": "1305_c",
"notes": "Small farm declaration on file.",
"scope": "categories"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
categories: ['LEAFY_GREENS'],
effective_date: '2026-01-01',
exemption_code: '1305_c',
notes: 'Small farm declaration on file.',
scope: 'categories'
})
};
fetch('https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}', 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://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'categories' => [
'LEAFY_GREENS'
],
'effective_date' => '2026-01-01',
'exemption_code' => '1305_c',
'notes' => 'Small farm declaration on file.',
'scope' => 'categories'
]),
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://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}"
payload := strings.NewReader("{\n \"categories\": [\n \"LEAFY_GREENS\"\n ],\n \"effective_date\": \"2026-01-01\",\n \"exemption_code\": \"1305_c\",\n \"notes\": \"Small farm declaration on file.\",\n \"scope\": \"categories\"\n}")
req, _ := http.NewRequest("PUT", 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.put("https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"categories\": [\n \"LEAFY_GREENS\"\n ],\n \"effective_date\": \"2026-01-01\",\n \"exemption_code\": \"1305_c\",\n \"notes\": \"Small farm declaration on file.\",\n \"scope\": \"categories\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/compliance/api/v1/organizations/{organization_id}/exemptions/{exemption_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"categories\": [\n \"LEAFY_GREENS\"\n ],\n \"effective_date\": \"2026-01-01\",\n \"exemption_code\": \"1305_c\",\n \"notes\": \"Small farm declaration on file.\",\n \"scope\": \"categories\"\n}"
response = http.request(request)
puts response.read_body{
"categories": [
"LEAFY_GREENS"
],
"effective_date": "2026-01-01",
"exemption_code": "1305_c",
"gtins": [],
"has_evidence_document": true,
"id": "Wq3XzVn2Yk7mPaR5tBc8Lh",
"notes": "Small farm declaration on file.",
"scope": "categories",
"state": "active"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}Authorizations
Path Parameters
Identifier of the organization.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Identifier of the exemption, as listed.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Body
The exemption to declare. An update replaces every field, so send them all.
The § 1.1305 subsection invoked.
1305_a, 1305_b, 1305_c, 1305_d, 1305_e, 1305_f, 1305_g, 1305_h, 1305_i, 1305_j, 1305_k, 1305_l all_products covers the whole organization; products covers only the GTINs in gtins; categories covers only the Food Traceability List categories in categories.
all_products, products, categories First day the exemption applies, as YYYY-MM-DD.
GTINs of the covered products, each one of the organization's own. Used only when scope is products; one that is not the organization's is refused with 422.
5008 - 14^[0-9]{8}$|^[0-9]{12,14}$Food Traceability List categories covered. Used only when scope is categories.
50LEAFY_GREENS, FRESH_CUT, FRESH_HERBS, TOMATOES, PEPPERS, SPROUTS, CUCUMBERS, MELONS, TROPICAL_FRUITS, FINFISH, CRUSTACEANS, MOLLUSCAN, DELI_SALADS, NUT_BUTTERS, SOFT_CHEESES, SHELL_EGGS, LEAFY_GREENS_FRESH_CUT, FRUITS_FRESH_CUT, VEGETABLES_FRESH_CUT, FINFISH_HISTAMINE, FINFISH_CIGUATOXIN, FINFISH_OTHER, SMOKED_FINFISH, CHEESE_PASTEURIZED_FRESH_SOFT, CHEESE_PASTEURIZED_SOFT_RIPENED, CHEESE_UNPASTEURIZED Last day the exemption applies, as YYYY-MM-DD; null or omitted means no expiry. It cannot precede effective_date.
Free-form context for compliance staff, up to 10000 characters.
10000^[^\x00]{0,10000}$Response
OK
One declared 21 CFR § 1.1305 exemption.
Identifier of the exemption.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$The § 1.1305 subsection invoked.
1305_a, 1305_b, 1305_c, 1305_d, 1305_e, 1305_f, 1305_g, 1305_h, 1305_i, 1305_j, 1305_k, 1305_l How broadly the exemption applies within the organization.
all_products, products, categories GTIN-14 of each covered product; empty unless scope is products.
Food Traceability List categories covered; empty unless scope is categories.
First day the exemption applies.
Last day the exemption applies; null means no expiry.
pending before the effective date, lapsed after the expiry date, otherwise active.
active, pending, lapsed Whether supporting evidence is on file. It is uploaded on the dashboard, not here.
Free-form context for compliance staff.