API · v1

Ten sam silnik, po stronie serwera.

Zamień dowolny obraz w czystą, edytowalną grafikę wektorową — prawdziwe ścieżki, jedno wypełnienie na region koloru. API działa na tym samym silniku WebAssembly co konwerter w przeglądarce, tyle że na naszej maszynie zamiast Twojej, więc SVG, które dostajesz, jest tym samym SVG, jakie wygenerowałaby aplikacja.

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

Jedno żądanie, jeden plik z powrotem. Bez klucza dla poniższych anonimowych limitów.

Uwierzytelnianie

Żądania anonimowe działają, z niskimi limitami. Klucz je podnosi i jest wysyłany jako token bearer. Klucz, którego nie rozpoznajemy — także taki, który został odwołany — jest odrzucany z kodem 401, a nie po cichu obniżany do poziomu anonimowego, a odmowa liczy się do budżetu Twojego IP: ciche obniżenie zmieniłoby literówkę w błąd limitu żądań godzinę później.

Authorization: Bearer $VECTORTRACE_KEY

Klucze tworzy się na stronie konta i pokazywane są raz; przechowywany jest tylko ich skrót. Są częścią Pro: 500 obrazów miesięcznie jest wliczone, a każdy kolejny obraz kosztuje 0,02 €, rozliczane w ramach subskrypcji. Odwołaj klucz na stronie konta, a przestanie działać przy następnym żądaniu. Zarządzanie kluczami to funkcja przeglądarki, uwierzytelniana ciasteczkiem sesji i sprawdzana pod kątem pochodzenia — jest udokumentowana w pliku OpenAPI, żeby klient mógł zobaczyć kształty danych, ale nie jest przeznaczona do skryptowania.

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 }

Zarządzaj kluczami na koncie

POST/api/v1/vectorize

Wektoryzuje jeden obraz rastrowy. Wyślij go jako część multipart lub jako base64 w treści JSON. Odpowiedzią jest sam plik wektorowy albo dokument w formacie JSON, gdy o to poprosisz.

PNG · JPG · JPEG · WebP · BMP · GIF

Żądanie

CzęśćGdzieWartość
imagemultipart/form-dataPlik rastrowy.
imagetreść JSONTen sam plik, zakodowany w base64, z prefiksem data: lub bez niego. Użyj jednej z dwóch metod.
optionstreść JSON lub pole formularzaDowolny podzbiór poniższych opcji. Pominięte pola przyjmują wartości nazwanego presetu.
formatparametr zapytaniaCo wyeksportować. Parametr zapytania ma pierwszeństwo przed treścią.
Acceptnagłówek żądaniaapplication/json zwraca dokument i jego statystyki zamiast pliku.

Przykłady

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)

Treść JSON

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

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

Opcje

Każde pole jest opcjonalne. Preset uzupełnia resztę; pole, które ustawisz, ma pierwszeństwo przed presetem. To te same ustawienia co w panelu konwertera i ta sama tabela, którą odczytuje silnik w Rust.

PoleWartościDomyślnieUwagi
presetlogo · line-art · photo · embroidery · vinyl · laserlogoNazwane zestawy opcji. Ta sama tabela co w aplikacji i w silniku Rust.
modecolor · binarycolorTryb binarny wektoryzuje jeden kolor; tryb kolorowy najpierw grupuje paletę.
colors2 – 6416Rozmiar palety po grupowaniu. Ignorowane w trybie binarnym.
filterSpecklepikseli powierzchni4Regiony mniejsze niż ta wartość są pomijane.
cornerThreshold0 – 180 stopni60Zakręty ostrzejsze niż ta wartość pozostają twardymi narożnikami zamiast krzywych.
pathPrecision0 – 42Liczba miejsc po przecinku zapisywana w danych ścieżki.
curveFittingpixel · polygon · splinesplinePiksel zachowuje schodki, wielokąt dopasowuje linie proste, splajn dopasowuje krzywe sześcienne.
hierarchicalstacked · cutoutstackedWarstwowe nakłada regiony na siebie; wycinanka sprawia, że każdy region jest rozłączny.
spliceThreshold0 – 180 stopni45Kąt, przy którym dopasowana krzywa jest dzielona na dwie.
lengthThresholdpikseli4Najkrótsza krawędź wielokąta zachowywana przed uproszczeniem.
maxIterations1 – 10010Budżet iteracji dopasowania krzywej na podścieżkę.

Odpowiedzi i błędy

Sukces

StatusContent-TypeTreść
200image/svg+xmlWyeksportowany plik SVG, w treści odpowiedzi, z nazwą pliku nadaną przez serwer.
200application/pdfWyeksportowany plik PDF, w treści odpowiedzi, z nazwą pliku nadaną przez serwer.
200application/postscriptWyeksportowany plik EPS, w treści odpowiedzi, z nazwą pliku nadaną przez serwer.
200image/vnd.dxfWyeksportowany plik DXF, w treści odpowiedzi, z nazwą pliku nadaną przez serwer.
200image/pngWyeksportowany plik PNG, w treści odpowiedzi, z nazwą pliku nadaną przez serwer.
200application/jsonDokument wektorowy i jego statystyki, przy 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 }
}

Każda odpowiedź niesie nagłówki limitu żądań, odrzucona czy nie. X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Koperta błędu

Zawsze jedna koperta. Rozgałęziaj na podstawie kodu, nigdy na podstawie treści — kod jest stabilny, a komunikat nie.

{ "error": { "code": "IMAGE_TOO_LARGE", "message": "…" } }
StatusKodKiedy
400DECODE_FAILEDBajty są w formacie, który akceptujemy, ale nie udało się ich zdekodować.
400VALIDATION_ERRORTreść lub pole nie odpowiadały kontraktowi.
401UNAUTHORIZEDNagłówek Authorization, którego nie dało się odczytać, albo nieznany klucz.
413IMAGE_TOO_LARGEObraz przekracza limit pikseli dla tej klasy klienta.
413PAYLOAD_TOO_LARGETreść przekracza limit bajtów dla tej klasy klienta.
415UNSUPPORTED_FORMATŻądany format wyjściowy nie ma eksportera w tej wersji.
415UNSUPPORTED_INPUT_FORMATBajty nie są w żadnym z akceptowanych formatów rastrowych.
429RATE_LIMITEDBudżet godzinowy wyczerpany. Retry-After mówi, kiedy wrócić.
500ENGINE_ERRORSilnik uruchomił się i zawiódł na tym obrazie.
500INTERNAL_ERRORNasza wina. Spróbuj raz jeszcze, a potem daj nam znać.

Limity żądań

PoziomMaks. treśćMaks. pikseleŻądaniaLiczone wg
Anonimowy2 MB1 MP20 / godzinęIP klienta
Z kluczem20 MB16 MP600 / godzinęUchwyt klucza

Obraz przekraczający limit pikseli jest odrzucany, a nie pomniejszany. Konwerter w Twojej przeglądarce zmniejsza zbyt duże grafiki, bo alternatywą jest alokacja ćwierć gigabajta w Twojej własnej karcie; tutaj limit jest budżetem, a zwrócenie współrzędnych, które nie odpowiadają wysłanej grafice, byłoby gorsze niż błąd.

OpenAPI

Powyższa dokumentacja jest generowana z tych samych schematów zod, którymi waliduje serwer, więc nie ma ręcznie pisanej specyfikacji, która mogłaby się zdezaktualizować. Skieruj na nią generator klienta.

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

/api/openapi.json

llms.txt

Podsumowanie produktu, stron i tego punktu końcowego w czystym tekście, napisane z myślą o modelach językowych i agentach. Pełna wersja dodaje indeks stron i tabelę presetów.

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

CLI

tydzień 10

Silnik jako polecenie. Te same presety, ten sam wynik, bez serwera w pętli.

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

MCP

tydzień 10

Serwer MCP udostępniający silnik agentom przez stdio lub streamable HTTP. Trzy narzędzia:

NarzędzieDziałanie
vectorize_imageWektoryzuje obraz i zwraca uchwyt dokumentu wraz ze statystykami.
list_presetsZwraca tabelę presetów z wartościami wszystkich opcji.
export_documentSerializuje uchwyt do jednego z formatów eksportu.