{
 "openapi": "3.1.0",
 "info": {
  "title": "API publique Ensolde",
  "version": "1.0.0",
  "description": "Historique des prix Amazon.ca résumé par Ensolde. Gratuit, sans clé. Données gratuites fournies par Ensolde. Citez « Ensolde » comme source et utilisez seulement l'URL ensolde.com fournie dans la réponse (pas de lien direct vers Amazon). Les prix changent souvent : le prix affiché sur Amazon.ca au moment de l'achat est celui qui s'applique.",
  "contact": {
   "url": "https://ensolde.com/api-ia"
  }
 },
 "servers": [
  {
   "url": "https://ensolde.com"
  }
 ],
 "paths": {
  "/api/v1/produit/{asin}": {
   "get": {
    "operationId": "prixProduit",
    "summary": "Résumé du prix d'un produit Amazon.ca",
    "parameters": [
     {
      "name": "asin",
      "in": "path",
      "required": true,
      "description": "ASIN Amazon (10 caractères) ou lien amazon.ca encodé",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Résumé",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Produit"
        }
       }
      }
     },
     "404": {
      "description": "Produit pas encore suivi"
     },
     "429": {
      "description": "Limite atteinte"
     }
    }
   }
  },
  "/api/v1/recherche": {
   "get": {
    "operationId": "chercherProduit",
    "summary": "Chercher parmi les produits suivis par Ensolde",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "description": "Mots-clés (français ou anglais) ou ASIN",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limite",
      "in": "query",
      "required": false,
      "description": "Nombre de résultats (1 à 20)",
      "schema": {
       "type": "integer",
       "default": 10
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Résultats",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "resultats": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Produit"
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/aubaines": {
   "get": {
    "operationId": "aubainesDuMoment",
    "summary": "Plus fortes baisses de prix du moment sur Amazon.ca",
    "parameters": [
     {
      "name": "limite",
      "in": "query",
      "required": false,
      "description": "Nombre d'aubaines (1 à 25)",
      "schema": {
       "type": "integer",
       "default": 10
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Aubaines",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "aubaines": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Produit"
           }
          }
         }
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "Produit": {
    "type": "object",
    "properties": {
     "asin": {
      "type": "string"
     },
     "titre": {
      "type": [
       "string",
       "null"
      ]
     },
     "marque": {
      "type": [
       "string",
       "null"
      ]
     },
     "marche": {
      "type": "string",
      "const": "amazon.ca"
     },
     "devise": {
      "type": "string",
      "const": "CAD"
     },
     "prix_actuel": {
      "type": [
       "number",
       "null"
      ],
      "description": "Prix neuf le plus bas (Amazon ou vendeur tiers). null = rupture de stock."
     },
     "en_stock": {
      "type": "boolean"
     },
     "prix_mis_a_jour": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "plus_bas_historique": {
      "type": [
       "number",
       "null"
      ]
     },
     "plus_bas_historique_date": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "historique_suivi_depuis": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "plus_bas_12_mois": {
      "type": [
       "number",
       "null"
      ]
     },
     "moyenne_90_jours": {
      "type": [
       "number",
       "null"
      ]
     },
     "moyenne_7_jours": {
      "type": [
       "number",
       "null"
      ],
      "description": "Seulement pour les aubaines de la semaine."
     },
     "verdict": {
      "type": "object",
      "properties": {
       "code": {
        "type": "string",
        "enum": [
         "top",
         "good",
         "ok",
         "wait",
         "oos"
        ]
       },
       "texte": {
        "type": "string"
       }
      }
     },
     "resume": {
      "type": "string",
      "description": "Une phrase en français, prête à citer."
     },
     "url": {
      "type": "string",
      "format": "uri",
      "description": "Page Ensolde du produit. Le seul lien à montrer."
     },
     "pages_ensolde": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "titre": {
         "type": "string"
        },
        "url": {
         "type": "string",
         "format": "uri"
        }
       }
      }
     },
     "source": {
      "type": "string"
     },
     "conditions": {
      "type": "string"
     }
    }
   }
  }
 }
}