Passer au contenu
FreshApp Demo

DOCUMENTATION DÉVELOPPEUR

Documentation de l’API de génération

Avec l’API de génération, créez des générations avec les modèles du site depuis votre propre code. Une requête indique un modèle et son entrée ; la réponse est une génération que vous suivez jusqu’à la fin, et ses fichiers se téléchargent depuis ce site. Les modèles, prix, limites et codes d’erreur de cette page sont ceux qui s’appliquent aujourd’hui.

Créer des générations par l’API demande un pack de crédits payant ou un abonnement payant actif, et ne dépense que des crédits payants. Lire, lister et télécharger fonctionnent avec n’importe quelle clé du compte.

Démarrage rapide

Créez une clé sur la page des clés API, gardez-la sur votre serveur et définissez-la comme API_KEY. Les exemples créent une génération avec seed-audio-1.0, la lisent jusqu’à la fin et téléchargent son premier fichier.

Envoyez une nouvelle Idempotency-Key à chaque nouvelle requête. Quand une requête reste sans réponse, renvoyez-la avec la même clé et le même corps : vous obtenez la génération créée par la première requête, facturée une seule fois.

cURL

export API_ORIGIN='https://demo.freshapp.ai'
export API_KEY='sk_YOUR_API_KEY'

curl --fail-with-body "$API_ORIGIN/api/v1/generations" \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: order-1001' \
  -d '{"model":"seed-audio-1.0","input":{"prompt":"Un phare sur une falaise à l’aube, mer calme, lumière douce."}}'

# Read it every 5 to 10 seconds until its status ends.
curl --fail-with-body "$API_ORIGIN/api/v1/generations/GENERATION_ID" \
  -H "Authorization: Bearer $API_KEY"

# A delivered output's url is a signed link: no key needed.
curl --fail-with-body -o result "OUTPUT_URL"

Client TypeScript

import { createClient } from './open-api-client';

const client = createClient({
  baseUrl: "https://demo.freshapp.ai",
  apiKey: process.env.API_KEY, // on your server only
});
const generation = await client.create(
  {
    "model": "seed-audio-1.0",
    "input": {
      "prompt": "Un phare sur une falaise à l’aube, mer calme, lumière douce."
    }
  },
  { idempotencyKey: "order-1001" }
);
const done = await client.wait(generation.id);
for (const output of done.outputs)
  if (output.status === 'delivered') {
    const file = await client.download(output);
    // file.body is the output, as output.content_type says
  }

Hook React

import { createClient } from './open-api-client';
import { useGeneration } from './open-api-react';

// In a browser on this site: no key, the visitor's own session.
const client = createClient();

export function Progress({ id }: { id: string }) {
  const { generation, error, done } = useGeneration(client, id);
  if (error) return <p>{String(error)}</p>;
  return <p>{generation?.status ?? '…'}{done ? ' ✓' : ''}</p>;
}

Clés et permissions

Chaque requête porte Authorization: Bearer avec une clé de la page des clés API. Une clé est sk_ suivi de 43 lettres, chiffres, tirets ou tirets bas, et elle n’est affichée qu’une fois, à sa création ou à son renouvellement. Une requête avec Authorization est jugée sur sa seule clé, jamais sur une session connectée à côté.

Une clé est soit en lecture seule (elle liste, lit et télécharge), soit autorisée à générer (elle crée et annule). Une clé en lecture seule reçoit 403 insufficient_scope quand elle tente de créer ou d’annuler, et rien n’est écrit.

Une clé peut avoir une liste d’adresses IP et de réseaux autorisés : depuis toute autre adresse, elle reçoit 403 ip_not_allowed. Donner plus de permissions à une clé, relever une limite ou élargir sa liste demande une connexion récente ; les restreindre, jamais.

Renouveler une clé lui donne aussitôt une nouvelle valeur et l’ancienne cesse de fonctionner. Révoquer une clé l’arrête pour de bon : ses générations pas encore envoyées à un modèle sont annulées et leurs crédits rendus, et celles déjà en cours se terminent.

Seuls les comptes avec un accès payant créent des générations par l’API (403 not_eligible sinon), et l’API ne dépense que des crédits payants (402 insufficient_credits). Les crédits offerts et de connexion restent pour le site.

Points d’accès de l’API de génération

Tous les chemins sont sur ce site. Les corps des requêtes et des réponses sont en JSON, sauf les fichiers de résultat.

https://demo.freshapp.ai

MéthodeCheminAutorisationRôle
POST/api/v1/generationsgenerations:writeCrée une génération. Demande une Idempotency-Key ; répond 202 avec la génération.
GET/api/v1/generationsgenerations:readLes générations du compte, des plus récentes aux plus anciennes, page par page (limit, cursor, module). Les générations de texte se lisent par identifiant uniquement.
GET/api/v1/generations/{id}generations:readUne génération du compte, avec ses sorties, ses crédits et la raison de sa fin.
POST/api/v1/generations/{id}/cancelgenerations:writeAnnule une génération pas encore envoyée à son modèle et rend ses crédits.
GET, HEAD/api/media/{id}generations:read (ou un lien signé)Le fichier d’une sortie, avec une plage d’octets au plus. Un lien signé n’a pas besoin de clé et marche depuis n’importe quelle adresse.

Modèles et prix

Les modèles activés sur ce site, tels que l’API les accepte : mettez l’identifiant dans model et les champs dans input. Une requête réserve son résultat le plus cher à sa création ; à la fin, vous payez ce qui a été livré.

IdentifiantNomTypePrixMaximum par requêteChamps d’entrée
seed-audio-1.0Seed Audio 1.0Audio75 crédits par minute; au moins 10 pour un résultat livré150 créditsprompt (obligatoire), voice, audio_references, image_url, output_format, sample_rate, speed, volume, pitch, multilingual

Idempotence

Créer une génération demande un en-tête Idempotency-Key de 1 à 128 lettres, chiffres, points, deux-points, tirets bas ou tirets. Utilisez un identifiant de votre propre système, comme un numéro de commande, pour qu’un même travail ait toujours la même clé.

La même clé avec la même requête renvoie la même génération, quel que soit le nombre d’envois, et elle n’est facturée qu’une fois. La même clé avec une autre requête donne 409 idempotency_conflict, et rien n’est créé.

Un délai dépassé ou une connexion coupée ne signifie pas que la requête a échoué. Renvoyez-la avec la même clé et le même corps, et gardez les deux jusqu’à obtenir une réponse. Un 5xx, un 429 ou un 408 se traite de la même façon : attendez ce que dit Retry-After, puis renvoyez la requête telle quelle.

Statuts et suivi

Lisez une génération avec GET /api/v1/generations/{id} toutes les 5 secondes au début, puis jusqu’à toutes les 10 secondes, jusqu’à ce que son statut soit final. Un 429 indique dans Retry-After quand relire.

StatutSens
queuedAcceptée, elle attend d’être envoyée à son modèle. Elle peut encore être annulée.
processingEnvoyée à son modèle, ou ses fichiers sont en cours d’enregistrement et de règlement.
succeededToutes les sorties ont été livrées et les crédits sont réglés.
partially_succeededCertaines sorties ont été livrées et facturées ; les crédits des autres sont revenus.
failedRien n’a été livré ; error dit pourquoi, et les crédits réservés sont revenus.
canceledAnnulée avant l’envoi, par vous ou parce que sa clé a été révoquée ; les crédits sont revenus.

billing.reserved_credits est ce que la création a réservé. Une fois la génération réglée, charged_credits est ce que vous avez payé et refunded_credits ce qui est revenu ; d’ici là, les deux valent null et held_credits indique ce qui est réservé.

Une génération qui attend une vérification manuelle affiche review avec l’heure du début de la vérification, et garde ses crédits jusqu’à la fin de celle-ci ; ensuite, elle continue ou ses crédits reviennent.

Fichiers de résultat

Chaque sortie livrée a une url sur ce site. Pour une clé, c’est un lien signé valable une heure sans la clé et depuis n’importe quelle adresse : vous pouvez le confier à un outil de téléchargement. Après une heure, relisez la génération pour obtenir un nouveau lien.

Avec la clé elle-même, GET /api/media/{id} renvoie aussi le fichier, dans les limites de la liste d’adresses de la clé. Les deux acceptent HEAD et une plage d’octets (Range: bytes=0-1023), et ne redirigent jamais vers un autre site.

Un fichier cité dans une entrée, comme un extrait audio ou une image, doit avoir été envoyé par ce compte sur le site, faire partie des exemples du site, ou être un lien vers une source que le site autorise ; tout le reste est refusé avant toute réservation de crédits.

Limites

Chaque limite ci-dessous est celle que ce site applique aujourd’hui, et chaque refus indique laquelle a été atteinte.

  • Une requête réserve au plus 150 crédits, la requête la plus chère des modèles activés. Une clé peut avoir une limite plus basse, et le max_credits d’une requête l’abaisse pour cette requête ; au-delà, la réponse est 400 request_limit_exceeded.
  • Chaque clé dépense au plus 5 000 crédits par jour UTC, sauf si vous lui fixez sa propre limite, jusqu’à 1 000 000 ; au-delà, la clé reçoit 429 key_daily_limit_exceeded jusqu’au jour UTC suivant.
  • Toutes les clés d’un compte, avec ses clients d’IA, dépensent au plus 10 000 crédits par jour UTC, sauf si vous fixez la limite du compte ; au-delà, la réponse est 429 account_daily_limit_exceeded.
  • Chaque clé et chaque compte envoie au plus 20 créations et annulations et 240 lectures et téléchargements par minute ; au-delà, 429 rate_limited avec Retry-After.
  • Au plus 2 générations d’un compte tournent en même temps ; une autre attend avec 429 too_many_active.
  • Un corps de requête fait au plus 32 Kio de JSON ; plus grand, il donne 413 request_too_large.

Codes d’erreur

Une erreur a la forme {"error": {"code": …, "message": …}}. Le code est toujours l’un de ceux-ci, et le message est en anglais, pour les développeurs. Un 429 ou un 503 indique dans Retry-After combien de secondes attendre. Une génération échouée ou annulée porte dans son champ error l’un des codes marqués comme ceux d’une génération.

HTTPCodeSensQue faire
401invalid_credentialLa clé API est absente, mal formée, inconnue, révoquée ou remplacée.Vérifiez la clé API, sa permission et sa liste d’adresses autorisées.
401credential_revokedLa clé a été révoquée ou renouvelée pendant la requête ; une génération en attente d’une clé révoquée est annulée et ses crédits rendus.Vérifiez la clé API, sa permission et sa liste d’adresses autorisées.
403insufficient_scopeLa clé ne peut pas faire cela : l’erreur nomme la permission requise dans required_scope.Vérifiez la clé API, sa permission et sa liste d’adresses autorisées.
403ip_not_allowedLa clé ne peut pas être utilisée depuis cette adresse : elle est hors de sa liste d’adresses IP autorisées.Vérifiez la clé API, sa permission et sa liste d’adresses autorisées.
401unauthorizedLa session du site a pris fin : reconnectez-vous.Modifiez la requête avant de la renvoyer.
403invalid_originUne requête du site doit venir du site lui-même.Modifiez la requête avant de la renvoyer.
403forbiddenLa requête est arrivée sans adresse client de confiance.Contactez l’assistance du site.
400invalid_requestLa requête est mal formée : son JSON, ses en-têtes (Idempotency-Key, Content-Type) ou sa requête.Modifiez la requête avant de la renvoyer.
400invalid_inputL’entrée ne correspond pas aux champs du modèle, ou le modèle n’a pas pu l’utiliser.Modifiez la requête avant de la renvoyer.
413request_too_largeLe corps de la requête est trop grand.Modifiez la requête avant de la renvoyer.
409idempotency_conflictCette Idempotency-Key a déjà servi pour une autre requête.Modifiez la requête avant de la renvoyer.
404model_unavailableLe modèle est inconnu ou indisponible pour le moment.Modifiez la requête avant de la renvoyer.
404not_foundAucun chemin, aucune génération ni aucun fichier de ce type pour ce compte.Modifiez la requête avant de la renvoyer.
405method_not_allowedLe chemin n’accepte pas cette méthode ; Allow liste celles qu’il accepte.Modifiez la requête avant de la renvoyer.
409not_cancelableLa génération a déjà été envoyée à son modèle, ou elle est terminée.Modifiez la requête avant de la renvoyer.
409not_readyLe fichier n’est pas encore prêt.Attendez ce que dit Retry-After, puis renvoyez-la.
410expiredLe fichier a dépassé la durée de conservation et a été supprimé.Modifiez la requête avant de la renvoyer.
400request_limit_exceededLa requête coûterait plus que son max_credits, ou que la limite par requête de la clé ou du site.Modifiez la requête avant de la renvoyer.
403not_eligibleGénérer par l’API demande un compte payant.Achetez un pack de crédits ou un forfait : l’API ne dépense que des crédits payants.
403email_unverifiedVérifiez l’adresse e-mail du compte pour générer.Modifiez la requête avant de la renvoyer.
402insufficient_creditsPas assez de crédits : l’API ne dépense que des crédits payants.Achetez un pack de crédits ou un forfait : l’API ne dépense que des crédits payants.
403generation_restrictedLa génération est suspendue pour ce compte après des refus de contenu répétés ; ends_at indique jusqu’à quand.Contactez l’assistance du site.
403trial_pausedLes essais du site sont suspendus pour ce compte après plusieurs sorties d’essai qui ont dépassé les limites de l’essai ; ends_at indique jusqu’à quand. Les requêtes sans essai continuent normalement.Modifiez la requête avant de la renvoyer.
429key_daily_limit_exceededLa limite de dépense quotidienne de la clé est atteinte.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : jusqu’au jour UTC suivant.
429account_daily_limit_exceededLa limite de dépense quotidienne du compte pour l’API est atteinte.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : jusqu’au jour UTC suivant.
429rate_limitedTrop de requêtes en peu de temps.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : la fenêtre de la limite.
429too_many_activeTrop de générations du compte sont en cours.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 30 s.
429too_many_under_reviewCertaines générations du compte attendent une vérification manuelle.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 3 600 s.
503busyTrop de générations tournent sur le site en ce moment.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 30 s.
503pausedLa génération est suspendue pour le moment.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 60 s.
503temporarily_unavailableLa requête n’a pas pu aboutir pour le moment.Renvoyez la même requête avec la même Idempotency-Key. Retry-After : 60 s.
503api_unavailableLa génération n’est pas encore disponible sur ce site.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 60 s.
503retryQuelque chose a changé pendant la requête, par exemple les réglages de la clé.Renvoyez la même requête avec la même Idempotency-Key. Retry-After : 60 s.
503unavailableLes fichiers sont temporairement indisponibles.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 60 s.
500internal_errorUn problème est survenu sur le site.Renvoyez la même requête avec la même Idempotency-Key.
400request_failedLa requête a été refusée pour une raison sans code propre.Contactez l’assistance du site.
400captcha_requiredTerminez la vérification de sécurité du site.Modifiez la requête avant de la renvoyer.
403captcha_failedLa vérification de sécurité du site n’a pas réussi.Modifiez la requête avant de la renvoyer.
503captcha_unavailableLa vérification de sécurité du site est indisponible.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 60 s.
400reference_unavailableUn fichier envoyé et cité a disparu, ou n’appartient pas à ce compte.Modifiez la requête avant de la renvoyer.
413reference_too_largeLes fichiers cités peuvent totaliser 10 Mo au plus.Modifiez la requête avant de la renvoyer.
503reference_storage_unavailableLe stockage des fichiers cités est indisponible.Attendez ce que dit Retry-After, puis renvoyez-la. Retry-After : 60 s.
409storage_quota_exceededL’espace de stockage du compte est plein.Contactez l’assistance du site.
Dans une générationcanceledLa génération a été annulée avant son envoi ; ses crédits sont revenus.Modifiez la requête avant de la renvoyer.
Dans une générationsubmission_expiredLa génération n’a pas pu être envoyée à temps ; ses crédits sont revenus.Renvoyez la même requête avec la même Idempotency-Key.
Dans une générationmodel_busyLe modèle était occupé ; les crédits sont revenus.Attendez ce que dit Retry-After, puis renvoyez-la.
Dans une générationcontent_rejectedLes contrôles de sécurité du contenu ont refusé l’entrée ou la sortie.Modifiez la requête avant de la renvoyer.
Dans une générationresult_expiredLe résultat n’a pas pu être enregistré à temps.Contactez l’assistance du site.
Dans une générationgeneration_failedLa génération a échoué.Contactez l’assistance du site.
Dans une générationdelivery_failedLe résultat n’a pas pu être livré ; ses crédits sont revenus.Contactez l’assistance du site.
Dans une générationtrial_limit_exceededLa sortie de l’essai du site a dépassé les limites de l’essai et n’a pas été livrée ; ses crédits sont revenus.Modifiez la requête avant de la renvoyer.

Client TypeScript et hook React

Le client TypeScript, open-api-client.ts, n’a besoin d’aucun autre paquet et tourne sur les serveurs, dans les workers et dans les navigateurs. Sur un serveur, donnez-lui baseUrl et apiKey ; dans un navigateur sur ce site, ne lui donnez ni l’un ni l’autre, et les requêtes utilisent la session du visiteur.

create envoie une Idempotency-Key, la vôtre ou une nouvelle valeur aléatoire, et renvoie la même requête après une connexion coupée, un 5xx, un 429 ou un 408, en attendant ce que dit Retry-After. Quand il abandonne, son erreur porte la clé, pour renvoyer la requête plus tard. Avec un store comme localStorage, une requête garde sa première clé après un rechargement de la page.

wait lit une génération jusqu’à sa fin, toutes les 5 secondes au début puis jusqu’à 10, et s’arrête quand vous l’interrompez. download récupère le fichier d’une sortie et n’envoie la clé qu’aux liens non signés de ce site.

Le hook React, open-api-react.ts, suit une génération avec le wait du client et s’arrête quand le composant est démonté. Téléchargez les deux fichiers, placez-les côte à côte et renommez-les en .ts.

Téléchargements