Aller au contenu

Fichiers volumineux

POST https://api.kennmarq.com/v1/uploads

Une requête à l’API transporte au plus 4 Mo. Pour un fichier plus lourd, jusqu’à 25 Mo (jusqu’à 1 Go pour une vidéo à marquer), téléversez-le d’abord, directement dans notre stockage à Zurich, puis désignez l’envoi dans l’appel au lieu d’y joindre le fichier. Les SDK JavaScript et Python le font d’eux-mêmes.

Fonctionnement

  1. Demandez un envoi en indiquant la taille du fichier : {"bytes": 12345678}.
  2. Envoyez le fichier par PUT à l’url reçue, avec ses headers, dans les 15 minutes.
  3. Indiquez l’envoi dans upload au lieu de file sur /v1/mark, /v1/check ou /v1/verify, ou dans input_upload au lieu de input sur /v1/mark.
curl
# 1. The upload, for the file's size
curl https://api.kennmarq.com/v1/uploads \
  -H "Authorization: Bearer $KENNMARQ_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"bytes\": $(wc -c < render.png)}"
# → {"object":"upload","id":"up_…","url":"https://…","method":"PUT","headers":{"Content-Length":"…"},…}

# 2. The file, to the url (no Authorization header: the URL is the permission)
curl -X PUT --upload-file render.png "$UPLOAD_URL"

# 3. The call, naming the upload
curl https://api.kennmarq.com/v1/mark \
  -H "Authorization: Bearer $KENNMARQ_API_KEY" \
  -F upload=up_… -F source=created \
  -o render.marked.png

Requête

application/json avec un seul champ, bytes : la taille du fichier, de 1 octet à 1 Go (1 073 741 824 octets). Chaque appel applique sa propre limite aux fichiers qu’il lit : 25 Mo (26 214 400 octets), et 1 Go pour une vidéo à marquer ; un appel qui indique un envoi plus volumineux répond 413 payload_too_large. Nécessite une clé avec la portée mark ou check. Demander un envoi compte dans les appels par minute de l’organisation, jamais dans ses marquages ; une clé peut avoir 100 envois en attente à la fois.

Réponse

201, application/json :

Champs d’un envoi
ChampValeur
object"upload"
idL’ID de l’envoi (up_…) : indiquez-le dans le champ upload de l’appel.
bytesLa taille que vous avez déclarée ; le fichier doit faire exactement cette taille.
urlOù envoyer le fichier par PUT : notre stockage à Zurich. L’URL elle-même fait office d’autorisation : n’envoyez donc pas d’en-tête Authorization.
method"PUT"
headersLes en-têtes que le PUT doit porter : Content-Length, pour lequel l’URL est signée.
url_expires_atL’URL est valable 15 minutes.
expires_atL’envoi peut être utilisé pendant une heure ; ensuite, il est supprimé sans avoir servi.

Les règles

  • Un envoi ne sert qu’une fois, dans l’heure, avec la clé qui l’a créé. Une autre clé, un deuxième appel ou un appel plus tardif reçoit 404 upload_not_found.
  • Le PUT doit envoyer exactement la taille déclarée ; toute autre taille est refusée. Un appel qui indique un envoi dont le fichier n’est pas encore arrivé reçoit 400 invalid_request.
  • Un appel qui échoue pour une raison qui lui est propre (une faute de frappe dans une option, notre service momentanément indisponible) laisse l’envoi disponible pour la nouvelle tentative. Un appel qui l’a utilisé, ou qui a refusé son contenu (un fichier qu’il n’accepte pas, ou bloqué par le contrôle de sécurité), le consomme. La tâche d’une vidéo garde son envoi jusqu’à ce qu’elle soit terminée ; après un échec de notre côté, il redevient utilisable pendant son heure.
  • Sur /v1/verify, qui ne demande aucune clé pour un fichier envoyé dans la requête, indiquer un envoi nécessite la clé qui l’a créé.
Le fichier d’un envoi est supprimé dès que l’appel l’a utilisé, ou à son expiration s’il n’a pas servi, une heure après sa création. Comme tout fichier que vous nous envoyez, il ne sert qu’à cet appel.

Erreurs

Erreurs de POST /v1/uploads
StatutCodeQuand
400invalid_requestbytes est absent, n’est pas un nombre entier, ou est inférieur à 1.
400unknown_fieldUn champ autre que bytes.
401missing_api_key, invalid_api_key, api_key_revokedVoir Authentification.
403insufficient_scope, ip_not_allowedLa clé n’a ni la portée mark ni la portée check, ou l’adresse ne figure pas sur la liste d’IP autorisées.
413payload_too_largebytes dépasse 1 Go.
415unsupported_media_typeLe corps n’est pas envoyé en application/json.
429rate_limitedTrop d’appels cette minute, ou 100 envois déjà en attente pour cette clé ; réessayez après le nombre de secondes indiqué dans Retry-After.
503storage_unavailableLes envois sont momentanément indisponibles. Réessayez.

Les corps d’erreur suivent le format commun.