API · v1

Dezelfde engine, serverside.

Zet elke afbeelding om in schone, bewerkbare vectorkunst — echte paden, één vulling per kleurgebied. De API draait dezelfde WebAssembly-engine als de converter in de browser, op onze machine in plaats van de jouwe, dus de SVG die je terugkrijgt is de SVG die de app zelf zou hebben geproduceerd.

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

Eén verzoek, één bestand terug. Geen sleutel nodig voor de anonieme limieten hieronder.

Authenticatie

Anonieme verzoeken werken, met strakke limieten. Een sleutel tilt deze op en wordt meegestuurd als bearer-token. Een sleutel die we niet herkennen — ook een ingetrokken sleutel — wordt geweigerd met 401 in plaats van stilzwijgend teruggezet naar de anonieme laag, en de weigering telt mee in het budget van je IP-adres: een stille terugval maakt van een typefout een uur later een rate-limit-fout.

Authorization: Bearer $VECTORTRACE_KEY

Sleutels worden aangemaakt op je accountpagina en eenmalig getoond; alleen een hash wordt bewaard. Ze horen bij Pro: 500 afbeeldingen per maand zijn inbegrepen, en elke afbeelding daarna kost € 0,02, gefactureerd via je abonnement. Trek een sleutel in op de accountpagina en hij stopt met werken bij het volgende verzoek. Sleutelbeheer is een browservoorziening, geverifieerd met het sessiecookie en met origin-controle — het is gedocumenteerd in het OpenAPI-bestand zodat een client de vormen kan zien, maar het is niet bedoeld om te scripten.

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 }

Beheer sleutels op je account

POST/api/v1/vectorize

Vectoriseer één rasterafbeelding. Stuur deze als multipart-bestandsdeel of als base64 in een JSON-body. De respons is het vectorbestand zelf, of het document als JSON wanneer je daarom vraagt.

PNG · JPG · JPEG · WebP · BMP · GIF

Verzoek

OnderdeelWaarWaarde
imagemultipart/form-dataHet rasterbestand.
imageJSON-bodyHetzelfde bestand, base64-gecodeerd, met of zonder data:-prefix. Gebruik een van de twee.
optionsJSON-body, of formulierveldElke subset van de onderstaande opties. Velden die je weglaat nemen de waarden van de genoemde preset over.
formatquery stringWat te exporteren. De query wint van de body.
Acceptrequest headerapplication/json geeft het document en de statistieken terug in plaats van het bestand.

Voorbeelden

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)

JSON-body

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

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

Opties

Elk veld is optioneel. Een preset vult de rest aan; een veld dat je zelf instelt wint van de preset. Dit zijn dezelfde besturingselementen als het inspectorpaneel van de converter, en dezelfde tabel die de Rust-engine leest.

VeldWaardenStandaardOpmerkingen
presetlogo · line-art · photo · embroidery · vinyl · laserlogoBenoemde optiesets. Dezelfde tabel als de app en als de Rust-engine.
modecolor · binarycolorBinair traceert één inkt; kleur clustert eerst een palet.
colors2 – 6416Paletgrootte na clustering. Genegeerd in binaire modus.
filterSpecklepixels oppervlakte4Gebieden kleiner dan dit worden verwijderd.
cornerThreshold0 – 180 graden60Bochten scherper dan dit blijven harde hoeken in plaats van curven.
pathPrecision0 – 42Aantal decimalen geschreven in de pathdata.
curveFittingpixel · polygon · splinesplinePixel behoudt de trapvorm, polygon past lijnen, spline past kubische curven.
hierarchicalstacked · cutoutstackedGestapeld legt gebieden over elkaar; cutout maakt elk gebied disjunct.
spliceThreshold0 – 180 graden45Hoek waarbij een gefitte curve in tweeën wordt gesplitst.
lengthThresholdpixels4Kortste polygoonrand die behouden blijft vóór vereenvoudiging.
maxIterations1 – 10010Budget voor curve-fitverfijning per subpad.

Responses en fouten

Succes

StatusContent-TypeBody
200image/svg+xmlHet geëxporteerde SVG-bestand, inline, met een door de server afgeleide bestandsnaam.
200application/pdfHet geëxporteerde PDF-bestand, inline, met een door de server afgeleide bestandsnaam.
200application/postscriptHet geëxporteerde EPS-bestand, inline, met een door de server afgeleide bestandsnaam.
200image/vnd.dxfHet geëxporteerde DXF-bestand, inline, met een door de server afgeleide bestandsnaam.
200image/pngHet geëxporteerde PNG-bestand, inline, met een door de server afgeleide bestandsnaam.
200application/jsonHet vectordocument en de statistieken, met 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 }
}

Elk antwoord bevat de rate-limit-headers, geweigerd of niet. X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Foutenvelop

Eén envelop, altijd. Vertak op de code, nooit op de tekst — de code is stabiel en de boodschap niet.

{ "error": { "code": "IMAGE_TOO_LARGE", "message": "…" } }
StatusCodeWanneer
400DECODE_FAILEDDe bytes zijn een formaat dat we accepteren, maar konden niet worden gedecodeerd.
400VALIDATION_ERRORDe body of een veld kwam niet overeen met het contract.
401UNAUTHORIZEDEen Authorization-header die we niet konden lezen, of een sleutel die we niet kennen.
413IMAGE_TOO_LARGEDe afbeelding overschrijdt de pixellimiet van deze aanroeperklasse.
413PAYLOAD_TOO_LARGEDe body overschrijdt de bytelimiet van deze aanroeperklasse.
415UNSUPPORTED_FORMATHet gevraagde uitvoerformaat heeft geen exporter in deze build.
415UNSUPPORTED_INPUT_FORMATDe bytes zijn geen van de geaccepteerde rasterformaten.
429RATE_LIMITEDUurbudget op. Retry-After geeft aan wanneer je terug kunt komen.
500ENGINE_ERRORDe tracer draaide en faalde op deze afbeelding.
500INTERNAL_ERROROnze fout. Probeer het één keer opnieuw en laat het ons dan weten.

Rate limits

LaagMax. bodyMax. pixelsVerzoekenGeteld per
Anoniem2 MB1 MP20 / uurIP van client
Met sleutel20 MB16 MP600 / uurSleutelhandle

Een afbeelding boven de pixellimiet wordt geweigerd, niet verkleind. De converter in je browser verkleint te grote werkstukken omdat het alternatief een allocatie van een kwart gigabyte in je eigen tabblad is; hier is het plafond een budget, en coördinaten teruggeven die niet op het door jou verzonden werkstuk passen zou erger zijn dan een fout.

OpenAPI

De referentie hierboven wordt gegenereerd uit dezelfde zod-schema's waarmee de server valideert, dus er is geen handgeschreven specificatie die achter kan raken. Richt een clientgenerator erop.

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

/api/openapi.json

llms.txt

Een platte-tekstsamenvatting van het product, de pagina's en dit endpoint, geschreven voor taalmodellen en agents. De volledige versie voegt de pagina-index en de presettabel toe.

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

CLI

week 10

De engine als commando. Dezelfde presets, dezelfde uitvoer, geen server in de keten.

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

MCP

week 10

Een MCP-server die de engine aan agents blootstelt via stdio of streamable HTTP. Drie tools:

ToolDoet
vectorize_imageTraceert een afbeelding en geeft een documenthandle plus statistieken terug.
list_presetsGeeft de presettabel terug met elke optiewaarde.
export_documentSerialiseert een handle naar een van de exportformaten.