API FoodStudio
Intégrez FoodStudio dans votre boutique, ERP ou backend :
- Sushis — pack d’images studio à partir d’une photo
- Améliorer couleur — même photo, saturation amplifiée (couleurs plus éclatantes)
Base URL : https://api.foodstudio.app
Créez une clé API dans Mon compte → API. Chaque image générée consomme 1 crédit.
Authentification
Toutes les routes /v1/* exigent une clé API :
Authorization: Bearer fsak_votre_cle
# ou
X-Api-Key: fsak_votre_cle
CORS est ouvert sur /v1/* pour les apps front (shops). Préférez l’appel côté serveur pour ne pas exposer la clé.
Générateur Sushis
GET Métadonnées
curl https://api.foodstudio.app/v1/sushis \
-H "Authorization: Bearer fsak_…"
# → presets disponibles + solde crédits
POST Générer
Envoyez l’image source d’une des façons suivantes :
image_url— URL HTTPS publique de la photoimage_base64— base64 (+mimeoptionnel)source_data_url— data URL complètedata:image/…;base64,…- multipart
image— fichier binaire
Optionnel : preset_ids (tableau) pour limiter les presets. Sans ce champ : pack complet = default_preset_ids du moment (actuellement 16 images → jusqu’à 16 crédits). Les nouvelles vues ajoutées côté FoodStudio arrivent donc automatiquement ; si vous figez une liste preset_ids, il faut la mettre à jour vous-même.
Optionnel : background (alias background_color, bg) — couleur de fond studio. Formats acceptés :
- Hex :
"#FFFFFF","#1A1A1A","FFF" - RGB :
"rgb(26,26,26)","26,26,26", ou{"r":26,"g":26,"b":26} - Nom / texte :
"beige","black","warm cream","matte anthracite"
Par défaut : fond blanc / off-white studio. N’affecte pas nobg (transparent), ni les presets dark mood studio-eye-level / studio-macro-dark (fond noir fixe).
Optionnel : style (alias photo_style) — rendu photo global appliqué à toutes les vues studio (pas nobg). Défaut : standard.
standard— rendu studio actuel, équilibréultra-hd— Ultra Photo Réaliste HD (macro détaillée, softbox, specular, DoF f/2.8, 8K)spectacular— Spectacular Highlights (reflets punchy, high-gloss luxe)soft-luxe— Soft Luxe (lumière douce fine-dining)crisp-catalog— Crisp Catalog (e-commerce, netteté uniforme)
Réponse
{
"ok": true,
"urls": [
"https://api.foodstudio.app/files/outputs/sushis/…png",
"https://api.foodstudio.app/files/outputs/sushis/…jpg"
],
"images": [
{
"preset_id": "nobg",
"url": "https://api.foodstudio.app/files/…",
"mime": "image/png",
"image_id": "i_…"
}
],
"credits_left": 984,
"credits_used": 8
}
Utilisez urls pour brancher directement votre shop (carousel, fiche produit, etc.).
Presets par défaut (pack complet) : nobg, vues studio (côté, duos, flat lay duo, macro, menu, plongeante), studio-high-angle, studio-gourmand, vues plat, studio-flatlay, studio-zenithal, plus dark mood fond noir fixe studio-eye-level (plan de face eye-level) et studio-macro-dark (gros plan macro).
Progression (SSE) — progress bar
Sans stream, la réponse JSON arrive à la fin du pack. Pour afficher une barre de progression style par style, activez le stream :
- Body JSON :
"stream": true - Query :
?stream=1 - Header :
Accept: text/event-stream
Réponse text/event-stream avec un événement par étape :
event: start
data: {"type":"start","total":12,"presets":[{"id":"nobg","title":"…"},…]}
event: preset_start
data: {"type":"preset_start","index":1,"total":12,"preset_id":"nobg","title":"…","ratio":0}
event: preset_done
data: {"type":"preset_done","index":1,"total":12,"preset_id":"nobg","url":"https://…","ratio":0.083,…}
event: preset_error
data: {"type":"preset_error","preset_id":"studio-side","error":"…","ratio":0.16,…}
event: done
data: {"type":"done","ok":true,"urls":[…],"images":[…],"credits_left":970,"credits_used":11}
event: error
data: {"ok":false,"error":"insufficient_credits",…}
Utilisez ratio (0→1) ou index/total pour la progress bar. Chaque preset_done contient déjà l’URL de l’image (affichage progressif possible).
Améliorer couleur
Envoie une photo → reçoit la même image avec la saturation amplifiée (couleurs plus éclatantes), sans changer le cadrage ni le sujet.
1 crédit par appel. Intensité au choix :
- Presets :
soft(25),medium(50, défaut),hard(80) - Ou niveau précis : entier de
1à99(sur 100)
GET Métadonnées
curl https://api.foodstudio.app/v1/enhance-color \ -H "Authorization: Bearer fsak_…"
POST Amplify saturation
curl https://api.foodstudio.app/v1/enhance-color \
-H "Authorization: Bearer fsak_…" \
-H "Content-Type: application/json" \
-d '{
"image_url": "https://cdn.monshop.com/produits/plat.jpg",
"intensity": "medium"
}'
# intensity peut aussi être "soft", "hard", ou un nombre 1–99 :
# "intensity": 65
Réponse
{
"ok": true,
"url": "https://api.foodstudio.app/files/outputs/enhance-color/….jpg",
"urls": ["https://api.foodstudio.app/files/outputs/enhance-color/….jpg"],
"image_id": "i_…",
"mime": "image/jpeg",
"intensity": { "preset": "medium", "level": 50 },
"credits_left": 990,
"credits_used": 1
}
url (et urls[0]) pointe vers l’image saturée. Multipart supporté : -F image=@photo.jpg -F intensity=hard.
Exemples pour un shop externe
Node — Sushis
const res = await fetch('https://api.foodstudio.app/v1/sushis', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.FOODSTUDIO_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
image_url: 'https://cdn.monshop.com/produits/sushi-saumon.jpg',
// preset_ids: ['nobg', 'studio-side', 'studio-top'], // optionnel
// background: '#1A1A1A', // hex
// background: { r: 26, g: 26, b: 26 }, // RGB
// background: 'warm beige', // texte
// style: 'ultra-hd', // standard | ultra-hd | spectacular | soft-luxe | crisp-catalog
}),
});
const data = await res.json();
if (!data.ok) throw new Error(data.error);
// data.urls → liste d’images générées
// data.background → couleur résolue (label + hex si numérique)
// data.style → { id, title } du rendu appliqué
console.log(data.urls);
Node — Sushis avec progress bar (SSE)
const res = await fetch('https://api.foodstudio.app/v1/sushis', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.FOODSTUDIO_API_KEY,
'Content-Type': 'application/json',
'Accept': 'text/event-stream',
},
body: JSON.stringify({
image_url: 'https://cdn.monshop.com/produits/sushi-saumon.jpg',
stream: true,
}),
});
const reader = res.body.getReader();
const dec = new TextDecoder();
let buf = '';
while (true) {
const { value, done } = await reader.read();
if (done) break;
buf += dec.decode(value, { stream: true });
const chunks = buf.split('\n\n');
buf = chunks.pop() || '';
for (const chunk of chunks) {
const ev = (chunk.match(/^event: (.+)$/m) || [])[1];
const raw = (chunk.match(/^data: (.+)$/m) || [])[1];
if (!ev || !raw) continue;
const data = JSON.parse(raw);
if (ev === 'preset_start' || ev === 'preset_done') {
setProgress(Math.round((data.ratio || 0) * 100)); // votre UI
setLabel(data.title); // ex. "Plongée légère 45°"
}
if (ev === 'preset_done') appendImage(data.url); // affichage progressif
if (ev === 'done') console.log('pack OK', data.urls);
if (ev === 'error') throw new Error(data.error);
}
}
Node — Améliorer couleur
const res = await fetch('https://api.foodstudio.app/v1/enhance-color', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.FOODSTUDIO_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
image_url: productImageUrl,
intensity: 'hard', // ou 1–99
}),
});
const data = await res.json();
// data.url → photo aux couleurs plus éclatantes
console.log(data.url);
PHP
$ch = curl_init('https://api.foodstudio.app/v1/sushis');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('FOODSTUDIO_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'image_url' => $productImageUrl,
]),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);
$urls = $data['urls'] ?? [];
Upload multipart
curl https://api.foodstudio.app/v1/sushis \ -H "Authorization: Bearer fsak_…" \ -F "image=@/path/sushi.jpg"
Erreurs courantes
401 api_key_required— clé manquante ou invalide400 missing_image— aucunimage_url/ fichier402 insufficient_credits— rechargez sur my.foodstudio.app413 image_too_large— image source trop lourde (~10 Mo max)502 no_images_generated/enhance_failed— échec IA (réessayer)400 invalid_intensity— utilisez soft / medium / hard ou 1–99
Crédits & facturation
1 crédit = 1 image générée. Le pack Sushis par défaut produit jusqu’à 8 images. enhance-color = 1 crédit.
Achetez des crédits sur Mon compte. Gérez vos clés (création / révocation) dans l’onglet API.