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.
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 }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
| Onderdeel | Waar | Waarde |
|---|---|---|
| image | multipart/form-data | Het rasterbestand. |
| image | JSON-body | Hetzelfde bestand, base64-gecodeerd, met of zonder data:-prefix. Gebruik een van de twee. |
| options | JSON-body, of formulierveld | Elke subset van de onderstaande opties. Velden die je weglaat nemen de waarden van de genoemde preset over. |
| format | query string | Wat te exporteren. De query wint van de body. |
| Accept | request header | application/json geeft het document en de statistieken terug in plaats van het bestand. |
Voorbeelden
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.svgimport { 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()))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.
| Veld | Waarden | Standaard | Opmerkingen |
|---|---|---|---|
| preset | logo · line-art · photo · embroidery · vinyl · laser | logo | Benoemde optiesets. Dezelfde tabel als de app en als de Rust-engine. |
| mode | color · binary | color | Binair traceert één inkt; kleur clustert eerst een palet. |
| colors | 2 – 64 | 16 | Paletgrootte na clustering. Genegeerd in binaire modus. |
| filterSpeckle | pixels oppervlakte | 4 | Gebieden kleiner dan dit worden verwijderd. |
| cornerThreshold | 0 – 180 graden | 60 | Bochten scherper dan dit blijven harde hoeken in plaats van curven. |
| pathPrecision | 0 – 4 | 2 | Aantal decimalen geschreven in de pathdata. |
| curveFitting | pixel · polygon · spline | spline | Pixel behoudt de trapvorm, polygon past lijnen, spline past kubische curven. |
| hierarchical | stacked · cutout | stacked | Gestapeld legt gebieden over elkaar; cutout maakt elk gebied disjunct. |
| spliceThreshold | 0 – 180 graden | 45 | Hoek waarbij een gefitte curve in tweeën wordt gesplitst. |
| lengthThreshold | pixels | 4 | Kortste polygoonrand die behouden blijft vóór vereenvoudiging. |
| maxIterations | 1 – 100 | 10 | Budget voor curve-fitverfijning per subpad. |
Responses en fouten
Succes
| Status | Content-Type | Body |
|---|---|---|
| 200 | image/svg+xml | Het geëxporteerde SVG-bestand, inline, met een door de server afgeleide bestandsnaam. |
| 200 | application/pdf | Het geëxporteerde PDF-bestand, inline, met een door de server afgeleide bestandsnaam. |
| 200 | application/postscript | Het geëxporteerde EPS-bestand, inline, met een door de server afgeleide bestandsnaam. |
| 200 | image/vnd.dxf | Het geëxporteerde DXF-bestand, inline, met een door de server afgeleide bestandsnaam. |
| 200 | image/png | Het geëxporteerde PNG-bestand, inline, met een door de server afgeleide bestandsnaam. |
| 200 | application/json | Het 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": "…" } }| Status | Code | Wanneer |
|---|---|---|
| 400 | DECODE_FAILED | De bytes zijn een formaat dat we accepteren, maar konden niet worden gedecodeerd. |
| 400 | VALIDATION_ERROR | De body of een veld kwam niet overeen met het contract. |
| 401 | UNAUTHORIZED | Een Authorization-header die we niet konden lezen, of een sleutel die we niet kennen. |
| 413 | IMAGE_TOO_LARGE | De afbeelding overschrijdt de pixellimiet van deze aanroeperklasse. |
| 413 | PAYLOAD_TOO_LARGE | De body overschrijdt de bytelimiet van deze aanroeperklasse. |
| 415 | UNSUPPORTED_FORMAT | Het gevraagde uitvoerformaat heeft geen exporter in deze build. |
| 415 | UNSUPPORTED_INPUT_FORMAT | De bytes zijn geen van de geaccepteerde rasterformaten. |
| 429 | RATE_LIMITED | Uurbudget op. Retry-After geeft aan wanneer je terug kunt komen. |
| 500 | ENGINE_ERROR | De tracer draaide en faalde op deze afbeelding. |
| 500 | INTERNAL_ERROR | Onze fout. Probeer het één keer opnieuw en laat het ons dan weten. |
Rate limits
| Laag | Max. body | Max. pixels | Verzoeken | Geteld per |
|---|---|---|---|---|
| Anoniem | 2 MB | 1 MP | 20 / uur | IP van client |
| Met sleutel | 20 MB | 16 MP | 600 / uur | Sleutelhandle |
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
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 10De engine als commando. Dezelfde presets, dezelfde uitvoer, geen server in de keten.
npx @vectortrace/cli in.png -o out.svg --preset laser
MCP
week 10Een MCP-server die de engine aan agents blootstelt via stdio of streamable HTTP. Drie tools:
| Tool | Doet |
|---|---|
| vectorize_image | Traceert een afbeelding en geeft een documenthandle plus statistieken terug. |
| list_presets | Geeft de presettabel terug met elke optiewaarde. |
| export_document | Serialiseert een handle naar een van de exportformaten. |