{"openapi": "3.1.0", "info": {"title": "API RFQdecoder", "version": "1.1.0", "summary": "Chiffrage de pièces industrielles depuis un plan PDF, DXF ou STEP.", "description": "Chaque prix est décomposé ligne par ligne, avec l'état de chaque valeur (prouvé, hypothèse, non chiffré) et la liste de ce qui n'est pas inclus. Chiffrage indicatif. Même moteur que https://rfqdecoder.com/app.\n\nAuthentification : en-tête `Authorization: Bearer rfqd_...`. Une unité est décomptée par appel réussi ; un appel refusé ne coûte rien. Serveur MCP équivalent : https://rfqdecoder.com/api/mcp", "contact": {"email": "contact@rfqdecoder.com", "url": "https://rfqdecoder.com/api-mcp-agents-ia/"}}, "servers": [{"url": "https://rfqdecoder.com/api/v1"}], "components": {"securitySchemes": {"cle_api": {"type": "http", "scheme": "bearer", "description": "Cle rfqd_..."}}}, "paths": {"/plans": {"post": {"summary": "Déposer un plan", "tags": ["plans"], "security": [{"cle_api": []}], "description": "PDF, DXF ou STEP, 20 Mo maximum. Ne coûte aucune unité. Le plan n'est visible que de votre clé.", "requestBody": {"required": true, "content": {"multipart/form-data": {"schema": {"type": "object", "required": ["plan"], "properties": {"plan": {"type": "string", "format": "binary"}}}}, "application/json": {"schema": {"type": "object", "required": ["nom_fichier", "contenu_base64"], "properties": {"nom_fichier": {"type": "string"}, "contenu_base64": {"type": "string", "format": "byte"}}}}}}, "responses": {"200": {"description": "plan_id et lecture du plan"}, "400": {"description": "Format refusé"}, "401": {"description": "Cle invalide"}, "413": {"description": "Fichier trop volumineux"}, "429": {"description": "Limites"}}}}, "/chiffrages": {"post": {"summary": "Chiffrer une pièce depuis un plan", "description": "1 unité. Rend le prix unitaire, chaque ligne avec son hypothèse, ce qui n'est pas inclus.", "tags": ["chiffrage"], "security": [{"cle_api": []}], "responses": {"200": {"description": "Resultat"}, "400": {"description": "Requête invalide", "content": {"application/json": {"schema": {"type": "object", "properties": {"ok": {"type": "boolean", "example": false}, "erreur": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Clé manquante ou invalide"}, "402": {"description": "Crédits épuisés"}, "403": {"description": "Clé révoquée ou suspendue"}, "404": {"description": "Plan introuvable"}, "422": {"description": "Plan lisible mais non chiffrable : la réponse dit ce qui manque"}, "429": {"description": "Débit ou quota dépassé (en-tête Retry-After)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["plan_id", "matiere", "quantite"], "properties": {"plan_id": {"type": "string", "description": "Identifiant rendu par POST /plans"}, "matiere": {"type": "string", "description": "Ex. aluminium, acier, inox, fonte, pa6"}, "quantite": {"type": "integer", "minimum": 1}, "lot_de_fabrication": {"description": "Nombre de pièces par lot, ou « commande_entiere »", "oneOf": [{"type": "integer", "minimum": 1}, {"type": "string", "enum": ["commande_entiere"]}]}, "nb_campagnes": {"type": "integer", "minimum": 1, "default": 1}, "epaisseur_mm": {"type": "number", "description": "Pour la tôle si le plan ne la porte pas"}, "ajustements": {"type": "object", "description": "Paramètres du modèle (voir ajustements_possibles dans la réponse)"}}}}}}}}, "/chiffrages/quantites": {"post": {"summary": "Faire varier la quantité", "description": "1 unité par quantité. 2 à 8 quantités.", "tags": ["chiffrage"], "security": [{"cle_api": []}], "responses": {"200": {"description": "Resultat"}, "400": {"description": "Requête invalide", "content": {"application/json": {"schema": {"type": "object", "properties": {"ok": {"type": "boolean", "example": false}, "erreur": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Clé manquante ou invalide"}, "402": {"description": "Crédits épuisés"}, "403": {"description": "Clé révoquée ou suspendue"}, "404": {"description": "Plan introuvable"}, "422": {"description": "Plan lisible mais non chiffrable : la réponse dit ce qui manque"}, "429": {"description": "Débit ou quota dépassé (en-tête Retry-After)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["plan_id", "matiere", "quantites"], "properties": {"plan_id": {"type": "string", "description": "Identifiant rendu par POST /plans"}, "matiere": {"type": "string", "description": "Ex. aluminium, acier, inox, fonte, pa6"}, "lot_de_fabrication": {"description": "Nombre de pièces par lot, ou « commande_entiere »", "oneOf": [{"type": "integer", "minimum": 1}, {"type": "string", "enum": ["commande_entiere"]}]}, "nb_campagnes": {"type": "integer", "minimum": 1, "default": 1}, "epaisseur_mm": {"type": "number", "description": "Pour la tôle si le plan ne la porte pas"}, "ajustements": {"type": "object", "description": "Paramètres du modèle (voir ajustements_possibles dans la réponse)"}, "quantites": {"type": "array", "minItems": 2, "maxItems": 8, "items": {"type": "integer", "minimum": 1}}, "detail": {"type": "boolean", "default": false, "description": "Renvoyer toutes les lignes pour chaque quantité"}}}}}}}}, "/taux-horaire": {"post": {"summary": "Calculer ou lire un taux horaire", "description": "Calcul à partir de vos valeurs : 0 unité. Lecture d'un poste : 1 unité.", "tags": ["taux"], "security": [{"cle_api": []}], "responses": {"200": {"description": "Resultat"}, "400": {"description": "Requête invalide", "content": {"application/json": {"schema": {"type": "object", "properties": {"ok": {"type": "boolean", "example": false}, "erreur": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Clé manquante ou invalide"}, "402": {"description": "Crédits épuisés"}, "403": {"description": "Clé révoquée ou suspendue"}, "404": {"description": "Plan introuvable"}, "422": {"description": "Plan lisible mais non chiffrable : la réponse dit ce qui manque"}, "429": {"description": "Débit ou quota dépassé (en-tête Retry-After)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"poste": {"type": "string", "description": "Poste de la base (une valeur par appel)", "enum": ["accrochage", "bain_anodisation", "bain_chromage", "bain_electropolissage", "bain_galvanisation", "bain_nickel_chimique", "bain_passivation", "bain_zingage", "cabine", "centre_usinage", "centrifugeuse", "chargement", "cintreuse", "colmatage", "consommables_tampographie", "controle_dimensionnel", "controle_visuel", "coupe_denudage", "detourage", "ebarbage", "ebavurage", "electroerosion", "etirage", "finition", "fonderie_cire_perdue", "four", "four_etuvage", "four_frittage", "four_mim", "four_revenu", "four_t6", "four_trempe", "fusion", "grenailleuse", "laser", "ligne_cms", "machine_rotomoulage", "manutention", "marquage_laser", "montage", "montage_manuel", "montage_moule", "moulage", "passivation", "plieuse", "pose_cms", "presse", "presse_compactage", "presse_detourage", "presse_emboutissage_publiee", "presse_extrusion", "presse_extrusion_publiee", "presse_forge", "presse_injection", "presse_injection_dimensionnee", "presse_mim", "presse_mousse", "presse_sous_pression", "presse_sous_pression_publiee", "pretraitement", "rectifieuse", "refusion", "reprise_mim", "reprises", "sablage", "sciage", "scie", "serigraphie", "sertissage", "soudage", "soudage_manuel", "soudure_vague", "souffleuse", "sous_traitance", "tampographie", "test", "thermoformeuse", "tour", "traitement_thermique", "vernissage", "vibrateur"]}, "machine": {"type": "object", "description": "OU vos propres valeurs : le taux est alors calculé (formule du site)", "properties": {"prix_machine_eur": {"type": "number"}, "annees_amortissement": {"type": "number"}, "heures_productives_an": {"type": "number"}, "taux_interet_pct": {"type": "number"}, "surface_m2": {"type": "number"}, "cout_m2_an_eur": {"type": "number"}, "puissance_kw": {"type": "number"}, "taux_charge_pct": {"type": "number"}, "prix_kwh_eur": {"type": "number"}, "maintenance_pct_an": {"type": "number"}, "outils_coupants_eur_h": {"type": "number"}, "operateur_eur_h": {"type": "number"}}}}}}}}}}, "/devis/verification": {"post": {"summary": "Vérifier un devis fournisseur", "description": "1 unité. Compare le prix du devis au prix reconstruit et liste les questions à poser.", "tags": ["devis"], "security": [{"cle_api": []}], "responses": {"200": {"description": "Resultat"}, "400": {"description": "Requête invalide", "content": {"application/json": {"schema": {"type": "object", "properties": {"ok": {"type": "boolean", "example": false}, "erreur": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Clé manquante ou invalide"}, "402": {"description": "Crédits épuisés"}, "403": {"description": "Clé révoquée ou suspendue"}, "404": {"description": "Plan introuvable"}, "422": {"description": "Plan lisible mais non chiffrable : la réponse dit ce qui manque"}, "429": {"description": "Débit ou quota dépassé (en-tête Retry-After)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["plan_id", "matiere", "quantite", "devis"], "properties": {"plan_id": {"type": "string", "description": "Identifiant rendu par POST /plans"}, "matiere": {"type": "string", "description": "Ex. aluminium, acier, inox, fonte, pa6"}, "quantite": {"type": "integer", "minimum": 1}, "lot_de_fabrication": {"description": "Nombre de pièces par lot, ou « commande_entiere »", "oneOf": [{"type": "integer", "minimum": 1}, {"type": "string", "enum": ["commande_entiere"]}]}, "nb_campagnes": {"type": "integer", "minimum": 1, "default": 1}, "epaisseur_mm": {"type": "number", "description": "Pour la tôle si le plan ne la porte pas"}, "ajustements": {"type": "object", "description": "Paramètres du modèle (voir ajustements_possibles dans la réponse)"}, "devis": {"type": "object", "required": ["prix_unitaire_eur"], "properties": {"prix_unitaire_eur": {"type": "number"}, "lignes": {"type": "array", "items": {"type": "object", "properties": {"poste": {"type": "string"}, "montant_eur": {"type": "number"}}}}}}}}}}}}}, "/usage": {"get": {"summary": "Crédits restants, quotas et derniers appels de votre clé", "tags": ["compte"], "security": [{"cle_api": []}], "responses": {"200": {"description": "État de la clé"}}}}, "/recharges": {"post": {"summary": "Recharger la clé en crédits (paiement par carte)", "description": "0 unité. Rend une adresse de paiement Stripe (url_paiement) à ouvrir par un humain. Les crédits sont ajoutés à la clé dès le paiement confirmé. Offres HT : essentiel 100 chiffrages 90 EUR, pro 500 chiffrages 350 EUR, volume 2 000 chiffrages 1 100 EUR. TVA et facture gérées par Stripe (vendeur officiel).", "tags": ["compte"], "security": [{"cle_api": []}], "responses": {"200": {"description": "Resultat"}, "400": {"description": "Requête invalide", "content": {"application/json": {"schema": {"type": "object", "properties": {"ok": {"type": "boolean", "example": false}, "erreur": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Clé manquante ou invalide"}, "402": {"description": "Crédits épuisés"}, "403": {"description": "Clé révoquée ou suspendue"}, "404": {"description": "Plan introuvable"}, "422": {"description": "Plan lisible mais non chiffrable : la réponse dit ce qui manque"}, "429": {"description": "Débit ou quota dépassé (en-tête Retry-After)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "required": ["offre"], "properties": {"offre": {"type": "string", "enum": ["essentiel", "pro", "volume"], "description": "essentiel (100), pro (500) ou volume (2 000 chiffrages)"}}}}}}}}}}