API · v1

同じエンジンを、サーバーサイドで。

どんな画像も、実際のパスと色領域ごとに1つの塗りを持つ、編集可能できれいなベクターアートに変換します。このAPIはブラウザ内コンバーターと同じWebAssemblyエンジンを、お使いの端末ではなく弊社のマシン上で実行するため、返されるSVGはアプリが生成するものと同じです。

クイックスタート
curl -X POST "https://vectortrace.app/api/v1/vectorize?format=svg" \
  -F image=@logo.png \
  -o logo.svg

リクエスト1回でファイル1つが返ります。以下の匿名利用の上限内であればキーは不要です。

認証

匿名リクエストも動作しますが、上限は厳しめです。キーを使うとその上限が引き上げられ、Bearerトークンとして送信します。認識できないキー(失効済みのキーを含む)は、匿名ティアへ静かに切り替えるのではなく401で拒否され、この拒否はIPの予算に計上されます — 静かな降格は、タイプミスを1時間後のレート制限エラーに変えてしまうためです。

Authorization: Bearer $VECTORTRACE_KEY

キーはアカウントページで作成され、一度だけ表示されます。保存されるのはハッシュのみです。キーはProの機能で、月間500枚の画像が含まれ、それを超える画像1枚ごとに€0.02がサブスクリプション経由で請求されます。アカウントページでキーを失効させると、次のリクエストから使用できなくなります。キー管理はセッションCookieで認証されオリジンチェックされるブラウザ向けの機能です — 形状を確認できるようOpenAPIファイルに文書化されていますが、スクリプトから使う想定のものではありません。

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

ラスター画像を1枚ベクター化します。マルチパートのファイルパートとして、またはJSON本文内のbase64として送信します。レスポンスはベクターファイルそのもの、またはリクエストに応じてJSON形式のドキュメントです。

PNG · JPG · JPEG · WebP · BMP · GIF

リクエスト

パート場所
imagemultipart/form-dataラスターファイル。
imageapplication/json 本文同じファイルをbase64エンコードしたもの。data:プレフィックスの有無は問いません。どちらか一方を使用してください。
optionsJSON本文、またはフォームフィールド以下のオプションの任意の組み合わせ。省略したフィールドには指定したプリセットの値が使われます。
formatクエリ文字列書き出し形式。本文の指定よりクエリが優先されます。
Acceptリクエストヘッダーapplication/jsonを指定すると、ファイルの代わりにドキュメントとその統計情報を返します。

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本文

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

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

オプション

すべてのフィールドは省略可能です。プリセットが残りを補い、設定したフィールドはプリセットより優先されます。これらはコンバーターのインスペクターと同じコントロールで、Rustエンジンが読み込むのと同じテーブルです。

フィールドデフォルト備考
presetlogo · line-art · photo · embroidery · vinyl · laserlogo名前付きのオプションセット。アプリおよびRustエンジンと同じテーブルです。
modecolor · binarycolor二値モードは単色をトレースし、カラーモードは先にパレットをクラスタリングします。
colors2〜6416クラスタリング後のパレットサイズ。二値モードでは無視されます。
filterSpeckle面積(ピクセル)4これより小さい領域は除去されます。
cornerThreshold0〜180度60これより鋭い角は、カーブではなく鋭角のまま保持されます。
pathPrecision0〜42パスデータに書き込む小数点以下の桁数。
curveFittingpixel · polygon · splinesplineピクセルは階段状のエッジを保持し、ポリゴンは直線でフィットし、スプラインは3次曲線でフィットします。
hierarchicalstacked · cutoutstacked重ね順は領域を重ねて塗り、くり抜きはすべての領域を互いに独立させます。
spliceThreshold0〜180度45フィットしたカーブを2つに分割する角度。
lengthThresholdピクセル4単純化前に保持する最短のポリゴン辺の長さ。
maxIterations1〜10010サブパスごとのカーブフィット精緻化の予算回数。

レスポンスとエラー

成功時

ステータスContent-Type本文
200image/svg+xml書き出されたSVGファイルをインラインで返し、ファイル名はサーバー側で決定されます。
200application/pdf書き出されたPDFファイルをインラインで返し、ファイル名はサーバー側で決定されます。
200application/postscript書き出されたEPSファイルをインラインで返し、ファイル名はサーバー側で決定されます。
200image/vnd.dxf書き出されたDXFファイルをインラインで返し、ファイル名はサーバー側で決定されます。
200image/png書き出されたPNGファイルをインラインで返し、ファイル名はサーバー側で決定されます。
200application/jsonAccept: 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 }
}

拒否の有無にかかわらず、すべてのレスポンスにレート制限ヘッダーが含まれます。 X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

エラーエンベロープ

エンベロープは常に1種類です。コードで分岐し、文言では分岐しないでください — コードは安定していますが、メッセージは変わる可能性があります。

{ "error": { "code": "IMAGE_TOO_LARGE", "message": "…" } }
ステータスコード発生条件
400DECODE_FAILED対応形式のバイト列ですが、デコードできませんでした。
400VALIDATION_ERROR本文またはフィールドが契約と一致しませんでした。
401UNAUTHORIZED読み取れないAuthorizationヘッダー、または未知のキーです。
413IMAGE_TOO_LARGE画像がこの呼び出し元クラスのピクセル数上限を超えています。
413PAYLOAD_TOO_LARGE本文がこの呼び出し元クラスのバイト数上限を超えています。
415UNSUPPORTED_FORMAT要求された出力形式には、このビルドでエクスポーターがありません。
415UNSUPPORTED_INPUT_FORMATバイト列が対応するラスター形式のいずれでもありません。
429RATE_LIMITED1時間あたりの予算を使い切りました。Retry-Afterで再試行可能な時刻を確認してください。
500ENGINE_ERRORトレーサーは実行されましたが、この画像で失敗しました。
500INTERNAL_ERRORこちらの問題です。一度再試行のうえ、ご連絡ください。

レート制限

ティア最大本文サイズ最大ピクセル数リクエスト数カウント単位
匿名2 MB1 MP20 / 時間クライアントIP
キー利用20 MB16 MP600 / 時間キーの識別子

ピクセル数上限を超える画像は縮小されるのではなく拒否されます。ブラウザ内のコンバーターがサイズ超過のアートワークを縮小するのは、代わりに4分の1ギガバイト級のメモリ確保がお使いのタブ内で発生してしまうからです。一方このAPIでは上限は予算であり、送信したアートワークに対応しない座標を返すのはエラーより悪い結果になります。

OpenAPI

上記のリファレンスは、サーバーの検証に使うのと同じzodスキーマから生成されているため、手書きの仕様書が実装から乖離することはありません。クライアントジェネレーターの参照先としてお使いください。

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

/api/openapi.json

llms.txt

製品、各ページ、このエンドポイントについての平文の要約で、言語モデルとエージェント向けに書かれています。フルバージョンにはページ索引とプリセットテーブルも含まれます。

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

CLI

第10週

エンジンをコマンドとして。プリセットも出力も同じで、サーバーを介しません。

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

MCP

第10週

stdioまたはstreamable HTTP経由でエンジンをエージェントに公開するMCPサーバーです。3つのツールがあります。

ツール内容
vectorize_image画像をトレースし、ドキュメントハンドルと統計情報を返します。
list_presetsすべてのオプション値を含むプリセットテーブルを返します。
export_documentハンドルをいずれかの書き出し形式にシリアライズします。