Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/boxc-customsproducts-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
x-logo:
url: https://storage.googleapis.com/boxc_cdn/public/boxc-logo.png
altText: BoxC
title: BoxC CalculateDuty Customs Products API
version: '1.123'
description: 'A simple but powerful logistics API that drives international ecommerce by utilizing a single integration with access to dozens of carriers and global markets. BoxC can complete every leg or only select steps of a shipment''s journey on your behalf with our routing engine.
'
servers:
- url: https://api.boxc.com/v1
tags:
- name: CustomsProducts
x-displayName: Customs\Products
description: 'Not to be confused with Fulfillment [Products](/#tag/Products), Customs Products are for clearing shipments containing regulated items like Food and Cosmetics (PGA). Customs Products contain information about the item including the manufacturer, seller, importer, etc. Shipments that are determined to be PGA must provide the `product_id` in the line item. Manifesting PGA shipments will notify the relevant agencies.
Several properties are conditional and offer different options based on the `coi` and `type` of product.
**Important:** This resource and its operations are in Beta and subject to change without notice.
'
paths:
/customs/products:
get:
tags:
- CustomsProducts
summary: GET /customs/products
description: Retrieves a paginated list of customs products.
operationId: getCustomsProducts
parameters:
- in: query
name: limit
description: The number of results to return.
required: false
schema:
type: integer
default: 50
maximum: 100
minimum: 50
- in: query
name: order
description: The sort order of the results.
required: false
schema:
type: string
enum:
- asc
- desc
default: desc
- in: query
name: page_token
description: Used for selecting the page after the initial query.
required: false
schema:
type: string
default: null
security:
- JWT:
- read_shipments
x-badges:
- name: Beta
position: after
x-codeSamples:
- lang: cURL
label: cURL
source: "curl -H \"Authorization: Bearer <YOUR TOKEN>\" \\\n -H \"Accept: application/json\" \\\n https://api.boxc.com/v1/customs/products\\?limit=50\\&order=desc\n"
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
products:
type: array
items:
$ref: '#/components/schemas/CustomsProduct'
next_page:
type: string
description: Page token. Set by the system.
example: ZGF0ZV9lbmQ9MjAyMy0wNy0yOCZsaW1pdD01MCZvcmRlcj1kZXNjJnBhZ2U9MSZsYXN0X2lkPTE1Mzg0Nw
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
examples:
invalidToken:
summary: Bad Request
description: Invalid page token
value:
code: 1025
message: Invalid page token
errors:
- Invalid page token
'401':
$ref: '#/components/schemas/Unauthorized'
'403':
$ref: '#/components/schemas/Forbidden'
'429':
$ref: '#/components/schemas/RateLimit'
post:
tags:
- CustomsProducts
summary: POST /customs/products
description: Creates a customs product.
operationId: addCustomsProduct
security:
- JWT:
- write_shipments
x-badges:
- name: Beta
position: after
x-codeSamples:
- lang: cURL
label: cURL
source: "curl -X POST https://api.boxc.com/v1/customs/products \\\n -H \"Authorization: Bearer <YOUR TOKEN>\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"product\":{\n \"coo\": \"CN\",\n \"coi\": \"US\",\n \"code\": \"1231-21\",\n \"contact: {\n \"name\": \"John Doe\",\n \"email\": \"john@doe.com\",\n \"phone\": \"1231231234\"\n },\n \"brand_name\": \"Tyson\",\n \"description\": \"Chicken wings\",\n \"packaging\": {\n \"type\": \"BAG\",\n \"quantity\": 1\n },\n \"quantity\": 1,\n \"uom\": \"PCS\",\n \"type\": \"FOO\",\n \"processing_code\": \"PRO\",\n \"intended_use_code\": \"210.000\",\n \"prior_notice_submitter\": {\n \"use_consignor\": true\n },\n \"affirmation_of_compliance\":[\n {\n \"code\": \"FME\",\n \"value\": \"K\"\n }\n ],\n \"manufacturer\": {\n \"use_consignor\": false,\n \"id\": {\n \"type\": \"DUNS\",\n \"value\": \"16324234\"\n },\n \"address\": {\n \"name\": \"hey\",\n \"street1\": \"123 main st\",\n \"city\": \"Dallas\",\n \"province\": \"TX\",\n \"postal_code\": \"75325\",\n \"country\": \"US\"\n }\n },\n \"importer\": {\n \"use_consignor\": true\n },\n \"shipper\": {\n \"use_consignor\": true\n }\n }\n }'\n"
requestBody:
content:
application/json:
schema:
type: object
properties:
product:
$ref: '#/components/schemas/CustomsProduct'
required:
- product
responses:
'200':
description: Success OK.
content:
application/json:
schema:
type: object
properties:
product:
$ref: '#/components/schemas/CustomsProduct'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
examples:
validation:
summary: Validation error
description: The request schema is invalid.
value:
code: 1000
message: 'Validation Error. /product/type: Product type must be one of [FOO, COS, FOO-CCW]'
status: error
errors:
- '/product/type: Product type must be one of [FOO, COS, FOO-CCW]'
cannotAdd:
summary: Bad Request
description: Product can't be created
value:
code: 1462
message: Product could not be added to the catalog
errors:
- Product could not be added to the catalog
'401':
$ref: '#/components/schemas/Unauthorized'
'403':
$ref: '#/components/schemas/Forbidden'
'429':
$ref: '#/components/schemas/RateLimit'
/customs/products/{id}:
get:
tags:
- CustomsProducts
summary: GET /customs/products/{id}
description: Retrieves a customs product.
operationId: getCustomsProductById
security:
- JWT:
- read_shipments
x-badges:
- name: Beta
position: after
parameters:
- name: id
in: path
description: The product ID
required: true
schema:
type: integer
x-codeSamples:
- lang: cURL
label: cURL
source: "curl -H \"Authorization: Bearer <YOUR TOKEN>\" \\\n -H \"Accept: application/json\" \\\n https://api.boxc.com/v1/customs/products/{id}\n"
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
product:
$ref: '#/components/schemas/CustomsProduct'
required:
- product
'401':
$ref: '#/components/schemas/Unauthorized'
'403':
$ref: '#/components/schemas/Forbidden'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/NotFound'
examples:
notFound:
summary: Not Found
description: Customs Product not found
value:
code: 1460
message: Customs Product not found
errors:
- Customs Product not found
'429':
$ref: '#/components/schemas/RateLimit'
put:
tags:
- CustomsProducts
summary: PUT /customs/products/{id}
description: Updates a customs product.
operationId: updateCustomsProduct
security:
- JWT:
- write_shipments
x-badges:
- name: Beta
position: after
parameters:
- name: id
in: path
description: The product id.
required: true
schema:
type: integer
x-codeSamples:
- lang: cURL
label: cURL
source: "curl -X PUT https://api.boxc.com/v1/customs/products/{id} \\\n -H \"Authorization: Bearer <YOUR TOKEN>\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"product\":{\n \"coo\": \"CN\",\n \"coi\": \"US\",\n \"code\": \"1231-21\",\n \"brand_name\": \"Tyson\",\n \"contact\": {\n \"name\": \"John Doe\",\n \"email\": \"john@doe.com\",\n \"phone\": \"1231231234\"\n },\n \"description\": \"Chicken wings\",\n \"packaging\": {\n \"type\": \"BAG\",\n \"quantity\": 1\n },\n \"quantity\": 1,\n \"uom\": \"PCS\",\n \"type\": \"FOO\",\n \"processing_code\": \"PRO\",\n \"intended_use_code\": \"210.000\",\n \"prior_notice_submitter\": {\n \"use_consignor\": true\n },\n \"affirmation_of_compliance\":[\n {\n \"code\": \"FME\",\n \"value\": \"K\"\n }\n ],\n \"manufacturer\": {\n \"use_consignor\": false,\n \"id\": {\n \"type\": \"DUNS\",\n \"value\": \"16324234\"\n },\n \"address\": {\n \"name\": \"hey\",\n \"street1\": \"123 main st\",\n \"city\": \"Dallas\",\n \"province\": \"TX\",\n \"postal_code\": \"75325\",\n \"country\": \"US\"\n }\n },\n \"importer\": {\n \"use_consignor\": true\n },\n \"shipper\": {\n \"use_consignor\": true\n }\n }\n }'\n"
requestBody:
content:
application/json:
schema:
type: object
properties:
product:
$ref: '#/components/schemas/CustomsProduct'
required:
- product
responses:
'200':
description: Success OK.
content:
application/json:
schema:
type: object
properties:
product:
$ref: '#/components/schemas/CustomsProduct'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/BadRequest'
examples:
validation:
summary: Validation error
description: The request schema is invalid.
value:
code: 1000
message: 'Validation Error. /product/type: Product type must be one of [FOO, COS, FOO-CCW]'
status: error
errors:
- '/product/type: Product type must be one of [FOO, COS, FOO-CCW]'
cannotUpdate:
summary: Bad Request
description: Product can't be updated
value:
code: 1462
message: Product could not be added to the catalog
errors:
- Product could not be added to the catalog
cannotChangeType:
summary: Immutable Type
description: Product type can't be changed
value:
code: 1463
message: Product type can't be changed
errors:
- Product type can't be changed
'401':
$ref: '#/components/schemas/Unauthorized'
'403':
$ref: '#/components/schemas/Forbidden'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/NotFound'
examples:
notFound:
summary: Not Found
description: Customs Product not found
value:
code: 1460
message: Customs Product not found
errors:
- Customs Product not found
'429':
$ref: '#/components/schemas/RateLimit'
delete:
tags:
- CustomsProducts
summary: DELETE /customs/products/{id}
description: Deletes a customs product. It is only a soft delete since products may still be referenced from shipments.
operationId: deleteCustomsProduct
security:
- JWT:
- write_shipments
x-badges:
- name: Beta
position: after
parameters:
- name: id
in: path
description: The product ID
required: true
schema:
type: integer
x-codeSamples:
- lang: cURL
label: cURL
source: "curl -X DELETE https://api.boxc.com/v1/customs/products/{id} \\\n -H \"Authorization: Bearer <YOUR TOKEN>\" \\\n -H \"Content-Type: application/json\"\n"
responses:
'200':
description: OK
'401':
$ref: '#/components/schemas/Unauthorized'
'403':
$ref: '#/components/schemas/Forbidden'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/NotFound'
examples:
notFound:
summary: Not Found
description: Customs Product not found
value:
code: 1460
message: Customs Product not found
errors:
- Customs Product not found
'429':
$ref: '#/components/schemas/RateLimit'
components:
schemas:
rate-limit:
description: Too Many Requests
content:
application/json:
schema:
type: object
summary: Too Many Requests
description: Error for too many requests in a given time frame. See [Rate Limits](/#tag/RateLimit) for more information.
properties:
code:
description: Error code. Refer to the list of [Errors](/#tag/Errors).
type: integer
message:
description: Error message explaining the code.
type: string
status:
type: string
enum:
- error
example: error
errors:
description: Displays processing error.
type: array
minItems: 1
maxItems: 1
items:
type: string
examples:
rateLimit:
summary: Too Many Requests
description: Too many requests. Please wait before trying again.
value:
code: 1015
message: Too many requests. Please wait before trying again.
errors:
- Too many requests. Please wait before trying again.
RateLimit:
$ref: '#/components/schemas/rate-limit'
forbidden:
description: Forbidden
content:
application/json:
schema:
type: object
summary: Forbidden
description: Error relating to insufficient permissions for a resource
properties:
code:
description: Error code. Refer to the list of [Errors](/#tag/Errors).
type: integer
message:
description: Error message explaining the code.
type: string
status:
type: string
enum:
- error
example: error
errors:
description: Displays processing error.
type: array
minItems: 1
maxItems: 1
items:
type: string
examples:
revoked:
summary: Forbidden Authorization Revoked
description: 'Forbidden: Authorization revoked'
value:
code: 1008
message: 'Forbidden: Authorization revoked'
errors:
- 'Forbidden: Authorization revoked'
scope:
summary: Forbidden Scope
description: 'Forbidden: Missing required scope'
value:
code: 1009
message: 'Forbidden: Missing required scope'
errors:
- 'Forbidden: Missing required scope'
customs-product:
type: object
properties:
affirmation_of_compliance:
type:
- array
- 'null'
default: null
example:
- code: FME
value: K
- code: FSX
value: ''
minItems: 1
maxItems: 5
description: The affirmation of compliance is required for products of `type` "FOO". You may include up to 5 AOC codes to a product.
items:
oneOf:
- type: object
title: FME
properties:
code:
type: string
description: AOC Code
const: FME
example: FME
value:
type: string
description: AOC Value
enum:
- A
- B
- C
- D
- E
- F
- K
example: K
required:
- code
- value
- type: object
title: FSVP
properties:
code:
type: string
description: AOC Code
const: FSX
example: FSX
value:
type: string
description: AOC Value. Always an empty string.
const: ''
example: ''
required:
- code
- type: object
title: Other
properties:
code:
type: string
description: AOC Code
enum:
- PFR
- CFR
- GFR
- IFR
- ORN
- SFR
- SRN
example: FME
value:
type: string
description: AOC Value
example: K
minLength: 1
maxLength: 15
required:
- code
- value
brand_name:
type: string
description: Brand name
pattern:
- A-Z0-9\s
minLength: 3
maxLength: 35
example: Test
code:
type:
- string
- 'null'
default: null
minLength: 7
maxLength: 7
description: The importing country's government's code for this product. Refer to https://www.accessdata.fda.gov/scripts/ora/pcb/index.cfm?action=main.pcb for FDA codes.
example: 1234-57
coi:
type: string
pattern:
- A-Z
minLength: 2
maxLength: 2
description: Country of import code
example: US
coo:
type: string
pattern:
- A-Z
minLength: 2
maxLength: 2
description: Country of origin code
example: CN
compliance_code:
type:
- array
- 'null'
description: The compliance code requirement and options depend on the `type`.
default: null
example:
- code: COS
value: '1231231'
items:
type: object
properties:
code:
type: string
description: Code
example: COS
value:
type: string
description: Value
maxLength: 20
minLength: 1
example: '1243123'
required:
- code
- value
contact:
type: object
description: Point of contact information for the `importer` and `prior_notice_submitter`.
example:
name: John Doe
email: john@doe.com
phone: '1231231234'
properties:
email:
type: string
maxLength: 64
description: Contact's email address
default: null
example: john@doe.com
name:
type: string
maxLength: 40
description: Contact's full name
default: null
example: John Doe
phone:
type: string
maxLength: 20
description: Contact's phone number
default: null
example: '1231231234'
required:
- email
- name
- phone
created_at:
type: string
description: The date and time this product was created.
example: '2025-08-29 12:13:14'
readOnly: true
deleted_at:
type: string
description: The date and time this product was deleted.
example: '2025-08-29 19:11:33'
readOnly: true
description:
type: string
description: Product description
pattern:
- A-Z0-9\s
minLength: 3
maxLength: 45
example: Test
fsvp_importer:
type: object
description: FSVP (Foreign Supplier Verification Program) Importer of the product. Required for products where `type` is "FOO".
example:
exempt: false
use_consignor: false
id:
type: DUNS
value: '1231231'
address:
name: Test
street1: test
street2: null
city: test
province: null
postal_code: null
country: CN
email: test@mail.com
phone: 1234-47223
properties:
exempt:
type: boolean
description: Indicates this product is exempt from Foreign Supplier Verification Program (FSVP). If `false` then FSVP details must be provided.
default: false
example: true
use_consignor:
type: boolean
description: Option to use the shipment's `consignor` address. If false then an `address` must be provided.
example: false
id:
type: object
description: FSVP Importer id
properties:
type:
type: string
enum:
- DUNS
- FEI
value:
type: string
maxLength: 32
required:
- type
- value
address:
type: object
description: Address and contact information for the FSVP Importer if `use_consignor=false`.
properties:
name:
type:
- string
- 'null'
maxLength: 40
default: null
description: Name
street1:
type:
- string
- 'null'
default: null
description: Street address 1
maxLength: 50
street2:
type:
- string
- 'null'
default: null
description: Street address 2
maxLength: 50
city:
type:
- string
- 'null'
default: null
description: City
maxLength: 40
province:
type:
- string
- 'null'
default: null
description: Province or state code
maxLength: 40
postal_code:
type:
- string
- 'null'
default: null
description: Postal code
maxLength: 10
country:
type:
- string
- 'null'
pattern:
- A-Z
default: null
description: Country code
maxLength: 2
minLength: 2
email:
type:
- string
- 'null'
default: null
description: E-mail address
maxLength: 64
phone:
type:
- string
- 'null'
default: null
description: Phone number
maxLength: 20
required:
- name
- street1
- city
- country
- email
- phone
required:
- use_consignor
id:
description: Product ID
type: integer
readOnly: true
example: 121006
importer:
type: object
description: Importing party for this product.
example:
use_consignor: false
address:
name: Test
street1: test
street2: null
city: test
province: null
postal_code: null
country: CN
email: test@mail.com
phone: 1234-47223
properties:
use_consignor:
type: boolean
description: Option to use the shipment's `consignor` address. If false then an address must be provided.
address:
type: object
description: Address and contact information for the importer if `use_consignor=false`.
properties:
name:
type:
- string
- 'null'
maxLength: 40
default: null
description: Name
street1:
type:
- string
- 'null'
default: null
description: Street address 1
maxLength: 50
street2:
type:
- string
- 'null'
default: null
description: Street address 2
maxLength: 50
city:
type:
- string
- 'null'
default: null
description: City
maxLength: 40
province:
type:
- string
- 'null'
default: null
description: Province or state code
maxLength: 40
postal_code:
type:
- string
- 'null'
default: null
description: Postal code
maxLength: 10
country:
type:
- string
- 'null'
pattern:
- A-Z
default: null
description: Country code
maxLength: 2
minLength: 2
email:
type:
- string
- 'null'
default: null
description: E-mail address
maxLength: 64
phone:
type:
- string
- 'null'
default: null
description: Phone number
maxLength: 20
required:
- name
- street1
- city
- country
- email
- phone
required:
- use_consignor
intended_use_code:
type: string
description: The intended use code options depends on the `type` of product and `coi`.
example: '100.000'
manufacturer:
type: object
description: Manufacturer of the product.
example:
use_consignor: false
id:
type: DUNS
value: '1231231'
address:
name: Test
street1: test
street2: null
city: test
province: null
postal_code: null
country: CN
email: test@mail.com
phone: 1234-47223
properties:
use_consignor:
type: boolean
description: Option to use the shipment's `consignor` address. If false then an address must be provided.
id:
type: object
description: Manufacturer id
properties:
type:
type: string
enum:
- DUNS
- FEI
value:
type: string
maxLength: 32
required:
- type
- value
address:
type: object
description: Address and contact information for the manufacturer if `use_consignor=false`.
properties:
name:
type:
- string
- 'null'
maxLength: 40
default: null
description: Name
street1:
type:
- string
- 'null'
default: null
# --- truncated at 32 KB (45 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/boxc/refs/heads/main/openapi/boxc-customsproducts-api-openapi.yml