Kirigami.ai converts images into fully editable PowerPoint files — not screenshots. Text stays editable, layouts are preserved, and shapes, backgrounds, and gradients are faithfully reproduced.
An API that vectorizes and semantically groups images with AI, producing .pptx files whose shapes remain individually editable in PowerPoint. Callable from any application, agent, or script via REST, MCP, or CLI.
Kirigami.ai runs a four-stage pipeline that separates concerns for reliability and scalability:
| Method | Path | Purpose |
|---|---|---|
POST | /api/v1/upload | Upload an image |
POST | /api/v1/convert | Start conversion |
GET | /api/v1/jobs/:jobId | Job status |
GET | /api/v1/marketplace | Gallery list |
GET | /api/v1/marketplace/:itemId | Gallery detail |
POST | /api/v1/publish | Publish to gallery |
POST | /api/v1/auth/start | Start CLI login |
POST | /api/v1/auth/approve | Approve CLI (browser) |
GET | /api/v1/auth/poll/:sessionId | CLI polling |
POST | /api/v2/decompose | Decompose image into layers |
POST | /api/v2/html-to-pptx | Compose PPTX from HTML/CSS |
POST | /api/mcp | Remote MCP (JSON-RPC) |
Convert your first image to PPTX and download it in under 3 minutes.
Create a key at Settings → API Keys. The 64-char key prefixed ip2p_ is shown once only.
curl -X POST https://kirigami.ai/api/v1/upload \
-H "X-Api-Key: ip2p_YOUR_KEY" \
-F "image=@/path/to/slide.png"curl -X POST https://kirigami.ai/api/v1/convert \
-H "X-Api-Key: ip2p_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"images": [{ "url": "<R2_URL>", "id": "img-1" }],
"filename": "deck.pptx"
}'curl https://kirigami.ai/api/v1/jobs/YOUR_JOB_ID \
-H "X-Api-Key: ip2p_YOUR_KEY"When status becomes completed, the response includes a downloadUrl. Poll every 3 seconds.
const KEY = process.env.KIRIGAMI_API_KEY!;
const BASE = "https://kirigami.ai";
// upload → convert → poll
const up = await fetch(BASE + "/api/v1/upload", {
method: "POST",
headers: { "X-Api-Key": KEY },
body: form,
}).then((r) => r.json());
const { jobId } = await fetch(BASE + "/api/v1/convert", {
method: "POST",
headers: { "X-Api-Key": KEY, "Content-Type": "application/json" },
body: JSON.stringify({
images: [{ url: up.imageUrl, id: up.imageId }],
}),
}).then((r) => r.json());
while (true) {
const s = await fetch(BASE + "/api/v1/jobs/" + jobId, {
headers: { "X-Api-Key": KEY },
}).then((r) => r.json());
if (s.status === "completed") console.log(s.downloadUrl);
if (s.status === "failed") throw new Error(s.errorMessage);
await new Promise((r) => setTimeout(r, 3000));
}Kirigami.ai authenticates requests via X-Api-Key. CLI tools can additionally use an OAuth-style device code flow.
ip2p_ + 64 hex charscurl https://kirigami.ai/api/v1/jobs/YOUR_JOB_ID \
-H "X-Api-Key: ip2p_xxxxxxxx..."| HTTP | code | Meaning |
|---|---|---|
| 401 | missing_api_key | Header missing |
| 401 | invalid_api_key | Malformed or revoked |
| 402 | insufficient_credits | Not enough credits |
Conversions run as asynchronous jobs. Submit via /convert, poll /jobs/:jobId.
pending → waiting_images → processing → completed
└→ failed (クレジット返却)| status | Meaning | Next action |
|---|---|---|
pending | Just queued | Keep polling |
waiting_images | Waiting on images | Keep polling |
processing | Building PPTX | Keep polling |
completed | Done | downloadUrl |
failed | Permanent failure | errorMessage |
Conversions are credit-metered. 10 credits per image, auto-refunded on failure.
| Action | Cost |
|---|---|
| Convert 1 image | 10 credits |
| 50 images (bulk) | 500 credits |
| Upload / polling / marketplace | Free |
// HTTP 402
{
"success": false,
"code": "insufficient_credits",
"balance": 40,
"required": 100,
"shortage": 60
}All endpoints are rate-limited. Exceeding returns HTTP 429 with a Retry-After header.
| Endpoint | Limit |
|---|---|
POST /convert | 10 / min |
POST /upload | 20 / min |
GET /jobs/:jobId | 60 / min |
GET /marketplace | 20 / min |
GET /marketplace/:itemId | 30 / min |
POST /publish | 5 / min |
POST /auth/start | 10 / 10min |
GET /auth/poll/:id | 120 / 10min |
X-RateLimit-Limit — ceilingX-RateLimit-Remaining — remainingX-RateLimit-Reset — seconds until resetRetry-After — 429 onlyAll endpoints share a unified shape: { success: false, error, code, ...meta }.
| code | HTTP | Description |
|---|---|---|
missing_api_key | 401 | Header missing |
invalid_api_key | 401 | Malformed or revoked |
session_expired | 410 | CLI session expired |
too_many_keys | 422 | Max 5 keys reached |
invalid_request | 400 | Zod validation failed |
invalid_json | 400 | Invalid JSON |
rate_limited | 429 | Rate limit exceeded |
insufficient_credits | 402 | Not enough credits |
job_not_found | 404 | Job not found |
item_not_found | 404 | Item not found |
ng_word_detected | 400 | Prohibited words |
internal_error | 500 | Unexpected server error |
Request/response shapes, rate limits, and errors for each endpoint.
https://kirigami.ai/api/v1/convertQueues a job that converts 1–50 images into a single PPTX. Returns a jobId to poll.
{
"images": [{ "url": "<R2_URL>", "id": "img-1" }],
"filename": "deck.pptx",
"removeText": true
}{
"success": true,
"jobId": "conv_abc123...",
"estimatedCredits": 10,
"totalImages": 1,
"queuedImages": 1,
"processingMode": "qstash"
}https://kirigami.ai/api/v1/jobs/:jobIdFetches job status.
{
"success": true,
"status": "completed",
"progress": 100,
"downloadUrl": "https://...signed.url...",
"completedAt": 1713000120000
}https://kirigami.ai/api/v1/uploadUploads to R2 and returns a signed URL. Supports JSON(base64) and multipart.
curl -X POST https://kirigami.ai/api/v1/upload \
-H "X-Api-Key: ip2p_..." \
-F "image=@slide.png"image/png, image/jpeg, image/webp, image/gifhttps://kirigami.ai/api/v1/marketplaceList published gallery items.
https://kirigami.ai/api/v1/marketplace/:itemIdItem detail (records a view event).
https://kirigami.ai/api/v1/publishPublish a draft to the gallery. Upload images first via /upload.
{
"title": "My deck",
"description": "...",
"previewImageUrls": ["https://..."],
"tags": ["business"]
}Three-step flow letting CLI tools receive a key without hardcoding:
https://kirigami.ai/api/v1/auth/starthttps://kirigami.ai/api/v1/auth/approvehttps://kirigami.ai/api/v1/auth/poll/:sessionIdStart a session → approve in browser → poll and receive the key exactly once.
All endpoints are served as OpenAPI 3.1. Importable into Postman / Insomnia.
/api/openapi.json serves the raw spec.
Browse and try endpoints interactively: Open Scalar reference
Convert from your terminal. Keys are issued via browser, so the CLI itself is key-free.
npm install -g @kirigami/cli
kirigami login # ブラウザが開いて承認kirigami convert slide.png --output deck.pptx
kirigami convert slides/*.png --output pack.pptx
kirigami status conv_abc123
kirigami publish deck.pptx --title "My pitch" --tags businessexport KIRIGAMI_API_KEY=ip2p_...
kirigami convert slide.png --output deck.pptxConnect MCP-aware clients — Claude Desktop, Claude Code, Cursor — directly to Kirigami's tools. Two transports: local stdio and remote HTTP.
| Tool | Purpose |
|---|---|
kirigami_decompose_image | Split an image into layers and return signed URLs |
kirigami_html_to_pptx | Convert HTML/CSS into an editable PPTX |
kirigami_get_usage | Fetch credit balance |
One-line setup. The first call opens your browser automatically — sign in to kirigami.ai and click Allow. No API key paste.
/api/mcpclaude mcp add --transport http kirigami https://kirigami.ai/api/mcpThe client runs OAuth 2.0 (PKCE) automatically, exchanges the auth code for a kirigami API key, and stores it. The issued key shows up at kirigami.ai/settings/api-keys as "MCP: <client name>".
Clients without OAuth auto-discovery can still pass an API key directly as a Bearer header.
{
"mcpServers": {
"kirigami": {
"type": "http",
"url": "https://kirigami.ai/api/mcp",
"headers": {
"Authorization": "Bearer ip2p_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}Spawn the bundled Node.js script directly. Runs entirely locally, ideal for restricted environments.
{
"mcpServers": {
"kirigami": {
"command": "node",
"args": ["/absolute/path/to/kirigami/mcp/kirigami-mcp-server.mjs"],
"env": {
"KIRIGAMI_API_KEY": "ip2p_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}KIRIGAMI_API_KEY=ip2p_xxx node ./mcp/kirigami-mcp-server.mjs <<< \
'{"jsonrpc":"2.0","id":1,"method":"tools/list"}'`.skill` packages distributed for Claude Code / Claude Desktop. Workflows the agent invokes automatically when the user's intent matches.
| Skill | Use case | Credits |
|---|---|---|
kirigami | Convert an existing image to PPTX | 10 / image |
kirigami-html | Claude designs new slides as HTML, then exports to PPTX | 5 / export, 5 / decompose |
Add the .skill bundle to Claude Code / Desktop. After the initial browser login, the agent runs key-free.
# 1. Skill をインポート (Claude Code)
claude skill add kirigami.skill
claude skill add kirigami-html.skill
# 2. 初回ログイン
python3 skills/kirigami/scripts/convert.py --login
# 3. あとは自然言語で
# "この画像を PPTX にして" -> kirigami
# "東京の桜の名所スライド作って" -> kirigami-htmlAPI version history. Breaking changes always bump the major version.