OCR de menu
Cette capacité lit la photo d’une carte de restaurant et en tire une structure nette : intitulé du plat, description, prix et regroupement par section — entrées, plats, desserts. De quoi passer d’un menu papier photographié à des données que vous pouvez publier en ligne, mettre à jour ou faire traduire.
Exécuter en ligne
Exécutez cette tâche sur nos serveurs, avec votre compte. Les outils gratuits tournent dans votre navigateur ; celui-ci est facturé sur votre solde KIT au prix affiché ci-dessus.
Sections, plats et prix remis en ordre
Une carte n’est pas un simple bloc de texte : c’est une hiérarchie. La capacité distingue les sections, rattache chaque plat à la sienne, et sépare l’intitulé, la description et le prix. Vous obtenez un tableau où une ligne égale un plat, avec sa catégorie et son tarif, plutôt qu’une transcription en vrac qu’il faudrait redécouper à la main avant de s’en servir.
De la photo au site ou à l’application
Le point de départ est presque toujours une photo prise au téléphone, parfois de travers ou sous un éclairage inégal. La capacité s’en accommode et rend une structure propre, prête à alimenter la page d’un site, une fiche de plateforme de livraison ou un menu numérique consulté par QR code. Vous gagnez l’étape fastidieuse de la saisie, celle qui décourage la mise à jour d’une carte qui change souvent.
Les prix en euros, votre tarif en dollars
Dans les données extraites, les prix des plats restent en euros, tels qu’ils figurent sur la carte : 12,50 €, 8 €, 24 €. Le tarif du service, lui, s’exprime en dollars US : $0.010 par requête et $0.0575 par image, sans abonnement. La capacité, en version bêta, s’utilise sur cette page ou par l’API pour traiter plusieurs cartes d’affilée, le traitement se faisant de façon asynchrone.
Cas d’usage
Publier sa carte en ligne
Un restaurateur numérise sa carte imprimée pour la publier sur son site, avec ses sections et ses prix — de l’entrée à 8 € au menu du midi à 24 € — sans tout ressaisir.
Reprendre la carte d’un client
Studio Lumen SAS récupère la carte photographiée d’un restaurant client et la structure proprement avant de la mettre en page pour un nouveau site.
Tenir un menu à jour
Un établissement qui change ses plats chaque semaine repart de la photo de la nouvelle carte pour actualiser sa version numérique, au lieu d’éditer chaque ligne à la main.
Questions fréquentes
Les prix des plats sont-ils bien repris ?
Oui, chaque prix est rattaché à son plat et conservé en euros, tel qu’il apparaît sur la carte. Un prix peu lisible sur la photo mérite une dernière vérification.
La carte est-elle organisée par section ?
Oui. Les grandes rubriques — entrées, plats, desserts, boissons — sont reconnues, et chaque plat est rangé sous la sienne.
Une photo prise au téléphone suffit-elle ?
Oui, c’est le cas le plus courant. Une prise de vue à plat, bien éclairée et sans reflet donne la lecture la plus fidèle.
Combien coûte la numérisation d’une carte ?
$0.010 par requête et $0.0575 par image, en dollars US, sans abonnement. Une carte tenant sur une photo compte pour une image. Paiement par PayPal, facture sur demande.
La photo de la carte est-elle conservée ?
Non. L’envoi est chiffré, l’image n’est traitée que le temps d’en extraire les données, puis supprimée.
Quelle taille de photo est acceptée ?
Jusqu’à 25 Mo par image.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/ocr/menu \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"image":"https://ejemplo.com/imagen.jpg"}'const res = await fetch("https://api.kit.forhosting.com/ocr/menu", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"image": "https://ejemplo.com/imagen.jpg"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/ocr/menu",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"image": "https://ejemplo.com/imagen.jpg"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/ocr/menu", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"image":"https://ejemplo.com/imagen.jpg"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"image":"https://ejemplo.com/imagen.jpg"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/ocr/menu", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"image": "https://ejemplo.com/imagen.jpg"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "ocr.menu",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 25 |
max_pages | 10 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
422 | task_failed | La tâche a échoué : elle ne vous est pas facturée. |