Export Control Classification
Unified ML, AMA and Annex I classification API with separate authorization and restriction assessment.
The Export Control API uses one classification engine for the EU Military List (ML), French other military equipment (AMA), and Annex I dual-use items under Regulation (EU) 2021/821. Intrinsic product classification remains strictly separate from transaction-dependent controls such as catch-all, cyber-surveillance, sanctions, and national measures.
Required scope: export_control
The response is a non-binding preliminary assessment. It does not replace review by the export-control function or a decision from the competent authority.
Operating modes
| Mode | Endpoint | Behavior |
|---|---|---|
| Desktop and chat | POST /v1/export-control/chat | SSE stream, optional clarification questions, durable job recoverable after disconnect |
| Single API call | POST /v1/export-control/jobs | Autonomous processing, no question returned to the caller |
| Batch API | POST /v1/export-control/jobs/batch | Up to 20 dossiers using the same pipeline per item |
| Polling | GET /v1/export-control/jobs/{job_id} | Job status and terminal result |
| Batch polling | GET /v1/export-control/jobs/batch/{batch_id} | Progress and item-level results |
| Screening | POST /v1/export-control/screening | Fast triage without a classification verdict |
Chat, job, and batch use the same analysis and quality-control pipeline. In autonomous API mode, the engine answers intermediate questions from the supplied dossier. If a dispositive fact remains unavailable, it returns review_required instead of inventing the fact or issuing NON_CLASSE.
Classification dossier
| Field | Type | Required | Description |
|---|---|---|---|
content | string | Yes, or image | Description of the item, software, or technology |
assessment_target | string | No | auto (default), tangible_item, intangible_asset, or mixed_dossier |
intangible_type | string | No | Known subtype: software, source code, documentation, CAD, data, know-how, or technical assistance |
image_base64 | string | No | Base64-encoded image |
image_media_type | string | No | image/jpeg, image/png, image/webp, or image/gif |
product_identity | object | No | Manufacturer, product, model or P/N, version, and customs code |
technical_facts | array | No | Sourced technical facts with value, unit, source, and locator |
classification_date | date | No | Date on which control lists must be applied |
transaction_context | object | No | Jurisdiction, destination, end user, end use, and transaction type |
{
"content": "IP router with AES-256 encryption and IPsec VPN",
"assessment_target": "mixed_dossier",
"product_identity": {
"manufacturer": "Example Networks",
"product_name": "SecureRouter",
"model_or_part_number": "SR-5000",
"version_or_configuration": "Firmware 8.2"
},
"technical_facts": [
{
"name": "Symmetric key length",
"value": "256",
"unit": "bit",
"source": "Manufacturer datasheet",
"locator": "Section 4.2",
"verified": true
}
],
"classification_date": "2026-07-13",
"transaction_context": {
"export_jurisdiction": "FR",
"destination_country": "DE",
"end_user": "Example GmbH",
"known_end_use": "Corporate network infrastructure",
"transaction_type": "intra_eu_transfer"
}
}Autonomous job and retry
curl -X POST https://api.thetradehub.eu/v1/export-control/jobs \
-H "X-API-Key: th_live_your_api_key" \
-H "Idempotency-Key: case-1" \
-H "Content-Type: application/json" \
-d @dossier.jsonReusing the same Idempotency-Key returns the same act. A retryable failure restarts the same job and creates neither a second classification nor duplicate billing.
Unified response
The terminal result contains:
| Field | Meaning |
|---|---|
status | classified, review_required, or needs_clarification for interactive chat |
routing_assessment | Requested, detected, and effective assessment object. The engine may widen scope but never narrow it. |
memo.classification_verdict | ML, AMA, Annex I, or NON_CLASSE intrinsic classification |
memo.licensing_or_restriction_flags | Authorization, prohibition, verification, or escalation signals |
memo.transaction_assessment | Checks performed, pending checks, and missing transaction context |
memo.citations | Versioned sources with stable identifiers and locators |
memo.provenance | Decision ID, methodology version, corpus versions, and timestamp |
{
"status": "classified",
"routing_assessment": {
"requested_target": "mixed_dossier",
"detected_target": "mixed_dossier",
"effective_target": "mixed_dossier",
"intangible_type": "software",
"confidence": 0.95,
"mismatch": false,
"scope_expanded": false
},
"memo": {
"classification_verdict": {
"regime": "ANNEXE_I",
"entry_ref": "5A002",
"eu_ecn": "5A002",
"us_eccn_evidence": ["5A002"],
"confidence": 0.91,
"jurisdiction": "FR/EU",
"classification_date": "2026-07-13",
"opposable": false,
"legal_basis": {
"legal_source": "Consolidated Regulation (EU) 2021/821",
"celex": "02021R0821",
"effective_date": "2025-11-15",
"control_list_version": "Delegated Regulation (EU) 2025/2003"
}
},
"licensing_or_restriction_flags": [],
"transaction_assessment": {
"status": "screening_required",
"performed_checks": [],
"pending_checks": ["sanctions_destination", "catch_all_art4"]
},
"provenance": {
"decision_id": "f0ec3e52-0bc9-4c5f-bd04-4f3874cffdd7",
"methodology_version": "TTH-EC-2026.07",
"corpus_versions": {},
"generated_at": "2026-07-13T10:15:00Z"
}
}
}No flag means no authorization conclusion when transaction_assessment.pending_checks is not empty. us_eccn_evidence is secondary US evidence and never becomes an EU ECN. review_required means that no operational verdict was issued and the act is not billed.
SSE chat
The first job event provides job_id and session_id. Generic step events are followed by classification or review_required, result, and done. After a browser disconnect, retrieve the result through GET /v1/export-control/jobs/{job_id}.
Compatibility
/v1/military-classification/* remains available during migration. These paths are aliases of the unified engine, not a separate classification service.
Last updated