API · v1

O mesmo mecanismo, no servidor.

Transforme qualquer imagem em arte vetorial limpa e editável — caminhos reais, um preenchimento por região de cor. A API roda o mesmo mecanismo WebAssembly do conversor no navegador, na nossa máquina em vez da sua, então o SVG que você recebe é o mesmo que o aplicativo produziria.

Início rápido
curl -X POST "https://vectortrace.app/api/v1/vectorize?format=svg" \
  -F image=@logo.png \
  -o logo.svg

Uma requisição, um arquivo de volta. Nenhuma chave é necessária para os limites anônimos abaixo.

Autenticação

Requisições anônimas funcionam, com limites reduzidos. Uma chave eleva esses limites e é enviada como bearer token. Uma chave que não reconhecemos — incluindo uma que foi revogada — é recusada com 401 em vez de ser silenciosamente rebaixada ao nível anônimo, e a recusa conta contra o orçamento do seu IP: um rebaixamento silencioso transformaria um erro de digitação em um erro de limite de taxa uma hora depois.

Authorization: Bearer $VECTORTRACE_KEY

As chaves são criadas na página da sua conta e exibidas uma única vez; apenas um hash é armazenado. Elas fazem parte do Pro: 500 imagens por mês estão incluídas, e cada imagem além disso custa € 0,02, cobrada através da sua assinatura. Revogue uma chave na página da conta e ela para de funcionar na próxima requisição. O gerenciamento de chaves é uma superfície de navegador, autenticada pelo cookie de sessão e verificada por origem — está documentado no arquivo OpenAPI para que um cliente veja os formatos, mas não é pensado para ser automatizado por script.

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 }

Gerenciar chaves na sua conta

POST/api/v1/vectorize

Vetorize uma imagem raster. Envie-a como parte multipart ou em base64 dentro de um corpo JSON. A resposta é o próprio arquivo vetorial, ou o documento em JSON quando solicitado.

PNG · JPG · JPEG · WebP · BMP · GIF

Requisição

ParteOndeValor
imagemultipart/form-dataO arquivo raster.
imagecorpo application/jsonO mesmo arquivo, codificado em base64, com ou sem prefixo data:. Use apenas um dos dois.
optionscorpo JSON, ou campo de formulárioQualquer subconjunto das opções abaixo. Os campos omitidos assumem os valores do preset indicado.
formatquery stringO formato de exportação. A query prevalece sobre o corpo.
Acceptcabeçalho da requisiçãoapplication/json retorna o documento e suas estatísticas em vez do arquivo.

Exemplos

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)

Corpo JSON

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

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

Opções

Todo campo é opcional. Um preset preenche o restante; um campo que você define prevalece sobre o preset. São os mesmos controles do inspetor do conversor, e a mesma tabela que o mecanismo em Rust lê.

CampoValoresPadrãoNotas
presetlogo · line-art · photo · embroidery · vinyl · laserlogoConjuntos de opções nomeados. Mesma tabela do aplicativo e do mecanismo em Rust.
modecolor · binarycolorBinário vetoriza uma única tinta; cor agrupa uma paleta primeiro.
colors2 – 6416Tamanho da paleta após o agrupamento. Ignorado no modo binário.
filterSpecklepixels de área4Regiões menores que este valor são descartadas.
cornerThreshold0 – 180 graus60Curvas mais acentuadas que este valor permanecem quinas duras em vez de curvas suaves.
pathPrecision0 – 42Casas decimais gravadas nos dados do caminho.
curveFittingpixel · polygon · splinesplinePixel mantém o efeito serrilhado, polígono ajusta retas, spline ajusta curvas cúbicas.
hierarchicalstacked · cutoutstackedEmpilhado sobrepõe regiões umas às outras; recorte torna cada região disjunta.
spliceThreshold0 – 180 graus45Ângulo no qual uma curva ajustada é dividida em duas.
lengthThresholdpixels4Menor aresta de polígono mantida antes da simplificação.
maxIterations1 – 10010Orçamento de refinamento do ajuste de curva por subcaminho.

Respostas e erros

Sucesso

StatusContent-TypeCorpo
200image/svg+xmlO arquivo SVG exportado, inline, com um nome de arquivo definido pelo servidor.
200application/pdfO arquivo PDF exportado, inline, com um nome de arquivo definido pelo servidor.
200application/postscriptO arquivo EPS exportado, inline, com um nome de arquivo definido pelo servidor.
200image/vnd.dxfO arquivo DXF exportado, inline, com um nome de arquivo definido pelo servidor.
200image/pngO arquivo PNG exportado, inline, com um nome de arquivo definido pelo servidor.
200application/jsonO documento vetorial e suas estatísticas, com 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 }
}

Toda resposta carrega os cabeçalhos de limite de taxa, recusada ou não. X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Envelope de erro

Um único envelope, sempre. Baseie a lógica no código, nunca no texto — o código é estável e a mensagem não é.

{ "error": { "code": "IMAGE_TOO_LARGE", "message": "…" } }
StatusCódigoQuando
400DECODE_FAILEDOs bytes são de um formato aceito, mas não puderam ser decodificados.
400VALIDATION_ERRORO corpo ou um campo não correspondeu ao contrato.
401UNAUTHORIZEDUm cabeçalho Authorization ilegível, ou uma chave desconhecida.
413IMAGE_TOO_LARGEA imagem excede o limite de pixels desta categoria de cliente.
413PAYLOAD_TOO_LARGEO corpo excede o limite de bytes desta categoria de cliente.
415UNSUPPORTED_FORMATO formato de saída solicitado não tem exportador nesta versão.
415UNSUPPORTED_INPUT_FORMATOs bytes não correspondem a nenhum dos rasters aceitos.
429RATE_LIMITEDOrçamento horário esgotado. Retry-After indica quando tentar de novo.
500ENGINE_ERRORO mecanismo de vetorização rodou e falhou nesta imagem.
500INTERNAL_ERRORErro nosso. Tente novamente uma vez e depois nos avise.

Limites de requisição

NívelCorpo máx.Pixels máx.RequisiçõesContado por
Anônimo2 MB1 MP20 / horaIP do cliente
Com chave20 MB16 MP600 / horaIdentificador da chave

Uma imagem acima do limite de pixels é recusada, não reduzida. O conversor no seu navegador reduz artes grandes demais porque a alternativa seria alocar um quarto de gigabyte na sua própria aba; aqui o limite é um orçamento, e devolver coordenadas que não correspondem à arte enviada seria pior do que um erro.

OpenAPI

A referência acima é gerada a partir dos mesmos esquemas zod que o servidor usa para validar, então não existe uma especificação escrita à mão para ficar desatualizada. Aponte um gerador de cliente para ela.

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

/api/openapi.json

llms.txt

Um resumo em texto simples do produto, das páginas e deste endpoint, escrito para modelos de linguagem e agentes. A versão completa acrescenta o índice de páginas e a tabela de presets.

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

CLI

semana 10

O mecanismo como um comando. Mesmos presets, mesma saída, sem servidor no meio do caminho.

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

MCP

semana 10

Um servidor MCP que expõe o mecanismo a agentes via stdio ou HTTP streamable. Três ferramentas:

FerramentaO que faz
vectorize_imageVetoriza uma imagem e retorna um identificador de documento mais estatísticas.
list_presetsRetorna a tabela de presets com todos os valores de opção.
export_documentSerializa um identificador para um dos formatos de exportação.