Classement Export Control
API unifiée de classement ML, AMA et Annexe I, avec analyse distincte des autorisations et restrictions.
L'API Export Control applique un moteur unique aux matériels de guerre de la liste ML, aux autres matériels de guerre et assimilés français (AMA) et aux biens à double usage de l'Annexe I du règlement (UE) 2021/821. Le classement intrinsèque du bien reste strictement séparé des mesures liées à l'opération, notamment les clauses attrape-tout, la cybersurveillance, les sanctions et les mesures nationales.
Scope requis : export_control
La réponse est une pré-appréciation non opposable. Elle ne remplace ni l'analyse du responsable export control, ni une décision de l'autorité compétente.
Modes d'utilisation
| Mode | Endpoint | Comportement |
|---|---|---|
| Desktop et chat | POST /v1/export-control/chat | Flux SSE, questions de clarification possibles, job durable récupérable après une coupure |
| API unitaire | POST /v1/export-control/jobs | Traitement autonome, aucune question renvoyée au client, faits absents qualifiés en interne |
| API batch | POST /v1/export-control/jobs/batch | Jusqu'à 20 dossiers, même pipeline de classement pour chaque item |
| Polling | GET /v1/export-control/jobs/{job_id} | Statut et résultat du job unitaire |
| Polling batch | GET /v1/export-control/jobs/batch/{batch_id} | Progression et résultats item par item |
| Screening | POST /v1/export-control/screening | Présélection rapide sans verdict de classement |
Le chat, le job et le batch utilisent le même parcours d'analyse et de contrôle qualité. En mode API autonome, le moteur répond lui-même aux questions intermédiaires à partir du dossier fourni. Si un fait décisif reste introuvable, il retourne review_required au lieu d'inventer le fait ou de conclure NON_CLASSE.
Dossier de classement
| Champ | Type | Requis | Description |
|---|---|---|---|
content | string | Oui, ou image | Description du bien, logiciel ou technologie |
assessment_target | string | Non | auto (défaut), tangible_item, intangible_asset ou mixed_dossier |
intangible_type | string | Non | Sous-type connu : logiciel, code source, documentation, CAO, données, savoir-faire ou assistance technique |
image_base64 | string | Non | Image encodée en base64 |
image_media_type | string | Non | image/jpeg, image/png, image/webp ou image/gif |
product_identity | object | Non | Fabricant, produit, modèle ou P/N, version et code douanier |
technical_facts | array | Non | Faits techniques sourcés avec valeur, unité, source et localisateur |
classification_date | date | Non | Date à laquelle les listes de contrôle doivent être appliquées |
transaction_context | object | Non | Juridiction, destination, utilisateur final, usage final et type d'opération |
La description libre reste acceptée. Un dossier structuré améliore toutefois la vérification des seuils, la recherche exacte de précédents et la reproductibilité du mémo.
{
"content": "Routeur IP avec chiffrement AES-256 et VPN IPsec",
"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": "Longueur de clé symétrique",
"value": "256",
"unit": "bit",
"source": "Fiche technique constructeur",
"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": "Infrastructure réseau d'entreprise",
"transaction_type": "intra_eu_transfer"
}
}Job autonome et reprise
curl -X POST https://api.thetradehub.eu/v1/export-control/jobs \
-H "X-API-Key: th_live_votre_cle_api" \
-H "Idempotency-Key: case-1" \
-H "Content-Type: application/json" \
-d @dossier.jsonRéutiliser la même Idempotency-Key retourne le même acte. Un échec réessayable relance le même job et ne crée ni second classement ni double facturation.
import time
import httpx
client = httpx.Client(
base_url="https://api.thetradehub.eu",
headers={"X-API-Key": "th_live_votre_cle_api"},
)
job = client.post(
"/v1/export-control/jobs",
headers={"Idempotency-Key": "case-1"},
json={"content": "Routeur IP avec chiffrement AES-256 et VPN IPsec"},
).json()
while True:
current = client.get(f"/v1/export-control/jobs/{job['id']}").json()
if current["status"] in {"completed", "failed"}:
print(current)
break
time.sleep(2)Réponse unifiée
{
"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": "Règlement (UE) 2021/821 consolidé",
"celex": "02021R0821",
"effective_date": "2025-11-15",
"control_list_version": "Règlement délégué (UE) 2025/2003"
},
"reasoning_summary": "Les fonctions cryptographiques satisfont les critères de l'entrée 5A002."
},
"licensing_or_restriction_flags": [],
"transaction_assessment": {
"status": "screening_required",
"context_complete": true,
"performed_checks": [],
"pending_checks": ["sanctions_destination", "catch_all_art4"],
"note": "Le classement est conclu. Les contrôles transactionnels restent distincts."
},
"citations": [],
"provenance": {
"decision_id": "f0ec3e52-0bc9-4c5f-bd04-4f3874cffdd7",
"engine": "export-control-api",
"methodology_version": "TTH-EC-2026.07",
"corpus_versions": {},
"generated_at": "2026-07-13T10:15:00Z"
}
},
"trace": [
"corpus_sources_consulted",
"legal_criteria_assessed",
"cross_regime_checks_completed",
"decision_quality_gate_applied"
]
}Règles de lecture
classification_verdictporte exclusivement le classement ML, AMA, Annexe I ouNON_CLASSE.routing_assessmentindique l'objet demandé, l'objet détecté et le périmètre effectivement examiné. Le moteur peut élargir la demande, jamais la réduire.- Pour un actif intangible, le verdict porte sur le logiciel, la technologie ou la documentation elle-même, notamment au regard de ML21, ML22, AMA3 et des groupes D/E de l'Annexe I, et non uniquement sur son matériel parent.
licensing_or_restriction_flagsporte les obligations ou risques d'autorisation, d'interdiction et d'escalade.- L'absence de flag ne vaut pas autorisation lorsque
transaction_assessment.pending_checksn'est pas vide. us_eccn_evidenceconstitue un indice américain secondaire et ne devient jamais un ECN de l'Union européenne.review_requiredsignifie qu'aucun verdict opérationnel n'a été rendu. Cet acte n'est pas facturé.
Chat SSE
Le premier événement job fournit job_id et session_id. Les événements step exposent des jalons génériques, puis classification ou review_required, result et done. Le résultat reste disponible par GET /v1/export-control/jobs/{job_id} après une coupure du navigateur.
Compatibilité
Les chemins /v1/military-classification/* restent acceptés pendant la période de migration. Ils sont des alias du moteur unifié et ne correspondent plus à un service de classement distinct.
Dernière mise à jour