API · v1

Le même moteur, côté serveur.

Transformez n'importe quelle image en tracé vectoriel propre et modifiable — de vrais chemins, un fond par région de couleur. L'API exécute le même moteur WebAssembly que le convertisseur dans le navigateur, sur notre machine plutôt que la vôtre, si bien que le SVG obtenu est celui que l'application aurait produit.

Démarrage rapide
curl -X POST "https://vectortrace.app/api/v1/vectorize?format=svg" \
  -F image=@logo.png \
  -o logo.svg

Une requête, un fichier en retour. Aucune clé nécessaire pour les limites anonymes ci-dessous.

Authentification

Les requêtes anonymes fonctionnent, avec des limites strictes. Une clé les relève et se transmet comme jeton porteur (bearer). Une clé non reconnue — y compris une clé révoquée — est refusée avec un 401 plutôt que rétrogradée silencieusement vers le niveau anonyme, et le refus est décompté du budget de votre IP : une rétrogradation silencieuse transformerait une faute de frappe en erreur de limite de débit une heure plus tard.

Authorization: Bearer $VECTORTRACE_KEY

Les clés se créent sur la page de votre compte et ne s'affichent qu'une fois ; seul un hachage est conservé. Elles font partie de Pro : 500 images par mois sont incluses, et chaque image supplémentaire coûte 0,02 €, facturée via votre abonnement. Révoquez une clé sur la page de votre compte et elle cesse de fonctionner dès la requête suivante. La gestion des clés est une surface navigateur, authentifiée par le cookie de session et vérifiée par origine — elle est documentée dans le fichier OpenAPI pour qu'un client puisse en voir les formes, mais elle n'est pas destinée à être scriptée.

GET    /api/account/keys            → { keys, usage, maxKeys }
POST   /api/account/keys  { name }  → { key, secret }   # secret shown once
DELETE /api/account/keys/{id}       → { revoked: true, id }

Gérer les clés sur votre compte

POST/api/v1/vectorize

Vectorisez une image raster. Envoyez-la comme partie multipart ou en base64 dans un corps JSON. La réponse est le fichier vectoriel lui-même, ou le document en JSON si vous le demandez.

PNG · JPG · JPEG · WebP · BMP · GIF

Requête

PartieValeur
imagemultipart/form-dataLe fichier raster.
imagecorps application/jsonLe même fichier, encodé en base64, avec ou sans préfixe data:. Utilisez l'un ou l'autre.
optionscorps JSON, ou champ de formulaireN'importe quel sous-ensemble des options ci-dessous. Les champs omis prennent les valeurs du preset nommé.
formatchaîne de requêteLe format à exporter. La chaîne de requête l'emporte sur le corps.
Accepten-tête de requêteapplication/json renvoie le document et ses statistiques au lieu du fichier.

Exemples

curl
curl -X POST "https://vectortrace.app/api/v1/vectorize?format=svg" \
  -H "Authorization: Bearer $VECTORTRACE_KEY" \
  -F "image=@logo.png" \
  -F 'options={"preset":"logo","colors":8}' \
  -o logo.svg
node
import { readFile, writeFile } from 'node:fs/promises'

const form = new FormData()
form.append('image', new Blob([await readFile('logo.png')]), 'logo.png')
form.append('options', JSON.stringify({ preset: 'logo', colors: 8 }))

const response = await fetch('https://vectortrace.app/api/v1/vectorize?format=svg', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.VECTORTRACE_KEY}` },
  body: form,
})
if (!response.ok) throw new Error(await response.text())
await writeFile('logo.svg', Buffer.from(await response.arrayBuffer()))
python
import json, os, requests

with open("logo.png", "rb") as image:
    response = requests.post(
        "https://vectortrace.app/api/v1/vectorize",
        params={"format": "svg"},
        headers={"Authorization": f"Bearer {os.environ['VECTORTRACE_KEY']}"},
        files={"image": image},
        data={"options": json.dumps({"preset": "logo", "colors": 8})},
    )
response.raise_for_status()
open("logo.svg", "wb").write(response.content)

Corps JSON

POST /api/v1/vectorize?format=svg
Content-Type: application/json
Accept: application/json

{
  "image": "iVBORw0KGgoAAAANSUhEUgAA…",
  "options": { "preset": "logo", "colors": 8 }
}

Options

Chaque champ est optionnel. Un preset renseigne le reste ; un champ défini l'emporte sur le preset. Ce sont les mêmes réglages que l'inspecteur du convertisseur, et la même table que celle lue par le moteur Rust.

ChampValeursPar défautRemarques
presetlogo · line-art · photo · embroidery · vinyl · laserlogoEnsembles d'options nommés. Même table que l'application et que le moteur Rust.
modecolor · binarycolorLe mode binaire trace une seule encre ; le mode couleur groupe d'abord une palette.
colors2 – 6416Taille de la palette après regroupement. Ignoré en mode binaire.
filterSpecklepixels de surface4Les régions plus petites que ce seuil sont supprimées.
cornerThreshold0 – 180 degrés60Les angles plus vifs que ce seuil restent des coins durs plutôt que des courbes.
pathPrecision0 – 42Nombre de décimales écrites dans les données de chemin.
curveFittingpixel · polygon · splinesplinePixel conserve l'effet d'escalier, polygone ajuste des droites, spline ajuste des courbes cubiques.
hierarchicalstacked · cutoutstackedEmpilé superpose les régions ; découpe rend chaque région disjointe.
spliceThreshold0 – 180 degrés45Angle auquel une courbe ajustée est scindée en deux.
lengthThresholdpixels4Longueur minimale d'arête de polygone conservée avant simplification.
maxIterations1 – 10010Budget d'affinage de l'ajustement de courbe par sous-chemin.

Réponses et erreurs

Succès

StatutContent-TypeCorps
200image/svg+xmlLe fichier SVG exporté, en ligne, avec un nom de fichier dérivé côté serveur.
200application/pdfLe fichier PDF exporté, en ligne, avec un nom de fichier dérivé côté serveur.
200application/postscriptLe fichier EPS exporté, en ligne, avec un nom de fichier dérivé côté serveur.
200image/vnd.dxfLe fichier DXF exporté, en ligne, avec un nom de fichier dérivé côté serveur.
200image/pngLe fichier PNG exporté, en ligne, avec un nom de fichier dérivé côté serveur.
200application/jsonLe document vectoriel et ses statistiques, avec Accept: application/json.
{
  "document": {
    "version": 1, "width": 512, "height": 512, "unit": "px",
    "palette": ["#101114", "#e8491d"],
    "elements": [{ "kind": "path", "fill": 0, "stroke": null, "subpaths": [ … ] }]
  },
  "stats": { "paths": 12, "nodes": 184, "colors": 2, "ms": 41, "estimatedSvgBytes": 3210 }
}

Chaque réponse porte les en-têtes de limite de débit, refusée ou non. X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Enveloppe d'erreur

Une seule enveloppe, toujours. Décidez sur le code, jamais sur le texte — le code est stable et le message ne l'est pas.

{ "error": { "code": "IMAGE_TOO_LARGE", "message": "…" } }
StatutCodeQuand
400DECODE_FAILEDLes octets sont dans un format accepté mais n'ont pas pu être décodés.
400VALIDATION_ERRORLe corps ou un champ ne correspond pas au contrat.
401UNAUTHORIZEDUn en-tête Authorization illisible, ou une clé inconnue.
413IMAGE_TOO_LARGEL'image dépasse la limite de pixels de cette classe d'appelant.
413PAYLOAD_TOO_LARGELe corps dépasse la limite d'octets de cette classe d'appelant.
415UNSUPPORTED_FORMATLe format de sortie demandé n'a pas d'exportateur dans cette version.
415UNSUPPORTED_INPUT_FORMATLes octets ne correspondent à aucun raster accepté.
429RATE_LIMITEDBudget horaire épuisé. Retry-After indique quand revenir.
500ENGINE_ERRORLe traceur s'est exécuté et a échoué sur cette image.
500INTERNAL_ERRORNotre faute. Réessayez une fois, puis dites-le-nous.

Limites de débit

NiveauCorps max.Pixels max.RequêtesDécompté par
Anonyme2 MB1 MP20 / heureIP client
Avec clé20 MB16 MP600 / heureIdentifiant de clé

Une image dépassant la limite de pixels est refusée, non réduite. Le convertisseur de votre navigateur réduit les visuels trop grands parce que l'alternative est une allocation d'un quart de gigaoctet dans votre propre onglet ; ici le plafond est un budget, et renvoyer des coordonnées qui ne correspondent pas au visuel envoyé serait pire qu'une erreur.

OpenAPI

La référence ci-dessus est générée à partir des mêmes schémas zod que ceux utilisés pour la validation côté serveur, donc il n'existe aucune spécification écrite à la main susceptible de se désynchroniser. Pointez un générateur de client dessus.

GET https://vectortrace.app/api/openapi.json

/api/openapi.json

llms.txt

Un résumé en texte brut du produit, des pages et de cet endpoint, rédigé pour les modèles de langage et les agents. La version complète ajoute l'index des pages et la table des presets.

GET https://vectortrace.app/llms.txt
GET https://vectortrace.app/llms-full.txt

CLI

semaine 10

Le moteur sous forme de commande. Mêmes presets, même sortie, aucun serveur dans la boucle.

npx @vectortrace/cli in.png -o out.svg --preset laser

MCP

semaine 10

Un serveur MCP exposant le moteur aux agents via stdio ou HTTP en flux continu. Trois outils :

OutilFait
vectorize_imageTrace une image et renvoie un identifiant de document ainsi que des statistiques.
list_presetsRenvoie la table des presets avec chaque valeur d'option.
export_documentSérialise un identifiant vers l'un des formats d'export.