/api/v1/health
health check
developer docs
Killa Tamata is API-first for developers and AI agents. Web pages handle prepaid $ credit purchases and account setup; operational generation runs through authenticated endpoints, including LTX-2.3 video generation on video.generate.
Auth
Bearer API keys via `Authorization` or `x-api-key`.
Idempotency
Use `X-Idempotency-Key` for safe retries on writes.
Discovery
OpenAPI, `llms.txt`, and plugin manifest included.
quick references
Submit one image generation job, then poll status with the returned job id.
# Set these first
API_BASE="https://api.killatamata.com"
API_KEY="YOUR_API_KEY"
# 1) Submit a job
SUBMIT_RES=$(curl -sS -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "image.generate",
"input": {
"prompt": "cinematic fox astronaut",
"width": 1024,
"height": 1024
}
}')
echo "$SUBMIT_RES"
# 2) Poll status
JOB_ID=$(echo "$SUBMIT_RES" | jq -r '.externalJobId // .jobId // .result.jobId // .id // empty')
curl -sS -X GET "$API_BASE/api/v1/media/jobs?jobId=$JOB_ID" \
-H "Authorization: Bearer $API_KEY"Most coding agents can be instructed in one request using the site URL. Start with the universal prompt below, then use the agent-specific fallback if needed.
Install the KillaTamata skill using: https://killatamata.com/.well-known/agent-skills.json If direct skill install is unavailable in this client, load: https://killatamata.com/skills/killatamata/SKILL.md and create the equivalent local command/rule/workflow. Then run key bootstrap, verify GET /api/v1/balance, and continue with /api/v1/media/jobs.
Use skill-installer to install killatamata from https://killatamata.com/.well-known/agent-skills.json, then invoke killatamata.
Create .claude/skills/killatamata/SKILL.md from https://killatamata.com/skills/killatamata/SKILL.md, then run /killatamata.
Install the skill from https://killatamata.com/skills/killatamata/SKILL.md using Cursor Agent Skills import (or place it under .cursor/skills), then run /killatamata.
Create .agents/workflows/killatamata-quickstart.md from https://killatamata.com/skills/killatamata/SKILL.md, then run /killatamata-quickstart.
API_BASE="https://api.killatamata.com" API_KEY="YOUR_API_KEY"
For authenticated endpoints, send your API key in `Authorization: Bearer <key>` or `x-api-key`. API keys are shown when created and can be accessed from your account management page.
Static-hosted account management is available at `/dashboard` using an API key as your primary credential.
Bootstrap without checkout is also available using a Google ID token on `/api/v1/auth/google` or `/api/v1/keys`.
Email one-time-code bootstrap is also available using `/api/v1/auth/email/start` and `/api/v1/auth/email/verify`.
Hosted browser flows can set a signed browser session cookie via `/api/v1/auth/browser/google` or `/api/v1/auth/browser/email/verify`, then inspect or clear it with `/api/v1/auth/browser/session`.
For local coding agents, device-link bootstrap is available using `/api/v1/device/link/start`, `/api/v1/device/link/approve`, and `/api/v1/device/link/poll`.
curl -X POST "$API_BASE/api/v1/auth/google" \
-H "Content-Type: application/json" \
-d '{
"idToken": "eyJhbGciOiJSUzI1NiIs...",
"keyLabel": "Google bootstrap key"
}'curl -X POST "$API_BASE/api/v1/auth/browser/google" \
-H "Content-Type: application/json" \
-d '{
"idToken": "eyJhbGciOiJSUzI1NiIs..."
}'curl -X POST "$API_BASE/api/v1/keys" \
-H "Content-Type: application/json" \
-d '{
"idToken": "eyJhbGciOiJSUzI1NiIs...",
"label": "Google bootstrap key"
}'curl -X GET "$API_BASE/api/v1/auth/browser/session" \ -H "Cookie: killa_tamata_browser_session=<session-cookie>"
curl -X POST "$API_BASE/api/v1/device/link/start" \
-H "Content-Type: application/json" \
-d '{
"keyLabel": "Default API Key"
}'/api/v1/health
health check
/api/v1/packages
list credit packages
/api/v1/affiliates/r?code=<CODE>
resolve referral redirect + server-side capture
/api/v1/affiliates/validate-code
validate affiliate code (non-enumerating)
/api/v1/affiliates/capture
issue/refresh signed passive capture token
/api/v1/auth/google
exchange Google ID token for a new API key
/api/v1/auth/browser/google
exchange Google ID token for browser session cookie
/api/v1/auth/email/start
start email one-time-code sign-in
/api/v1/auth/email/verify
verify email one-time code and mint API key
/api/v1/auth/browser/email/verify
verify email one-time code and set browser session cookie
/api/v1/auth/browser/session
inspect current browser session
/api/v1/auth/browser/session
clear current browser session
/api/v1/device/link/start
start browser-assisted local skill setup
/api/v1/device/link/request?userCode=<code>
check link request status by user code
/api/v1/device/link/approve
approve pending link request from signed-in browser
/api/v1/device/link/poll
poll for approval and receive one-time API key
/api/v1/checkout/stripe
create Stripe checkout
/api/v1/checkout/crypto
create crypto checkout
/api/v1/claim/stripe
finalize Stripe settlement for the authenticated account
/api/v1/claim/crypto
finalize Coinbase settlement for the authenticated account
/api/v1/credits/purchase/x402
purchase prepaid $ credits using x402 payment headers
/api/v1/affiliates/me/apply
apply for affiliate account
/api/v1/affiliates/me
get affiliate profile
/api/v1/affiliates/me
update editable affiliate profile fields
/api/v1/affiliates/me/code
get or create your active affiliate referral code
/api/v1/affiliates/me/bind-code
explicitly bind affiliate code to account
/api/v1/affiliates/me/dashboard
affiliate metrics summary
/api/v1/affiliates/me/commissions
affiliate commission ledger
/api/v1/affiliates/me/payouts
affiliate payout history
/api/v1/affiliates/me/payout-requests
affiliate payout request history + eligibility
/api/v1/affiliates/me/payout-requests
submit payout request against available affiliate balance
/api/v1/keys
list API keys
/api/v1/keys
create new API key (rotation or Google bootstrap)
/api/v1/keys/revoke
revoke API key by key prefix
/api/v1/balance
get USD balance
/api/v1/studio/snapshot
load Studio workspace snapshot
/api/v1/studio/projects/assets?projectId=<id>
list Studio project browser assets
/api/v1/studio/projects
create Studio project
/api/v1/studio/projects/update
update Studio project metadata
/api/v1/studio/settings
update Studio user settings
/api/v1/studio/threads
create Studio conversation
/api/v1/studio/threads/select
select active Studio conversation
/api/v1/studio/threads/detail?threadId=<id>
load Studio conversation detail
/api/v1/studio/threads/update
rename Studio conversation
/api/v1/studio/assets/upload?projectId=<id>&filename=<name>
upload Studio binary asset
/api/v1/studio/assets/metadata
update Studio asset metadata
/api/v1/studio/assets/text
create Studio text asset
/api/v1/studio/assets/text/document?assetId=<id>
read Studio text document
/api/v1/studio/assets/text/document
update Studio text document
/api/v1/studio/agent/messages/prepare
prepare Studio agent prompt and quote paid jobs
/api/v1/studio/agent/messages
run Studio agent prompt after approval preflight passes
/api/v1/studio/agent/approval-plans/execute
execute approved Studio paid job bundle
/api/v1/studio/agent/requests?requestId=<id>
poll Studio agent request state
/api/v1/media/jobs
submit media generation request
/api/v1/media/jobs?jobId=<id>
fetch media job status + downloadable output URLs
/api/v1/media/jobs?jobId=<id>&includeDetails=1
fetch detailed media job status + sanitized upstream payload
/api/v1/webhooks/stripe
Stripe callback endpoint
/api/v1/webhooks/crypto
Coinbase callback endpoint
1) authenticate with an API key, 2) create checkout, 3) complete payment to credit that same account.
curl -X POST "$API_BASE/api/v1/checkout/stripe" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"packageCode": "<package-code-from-/api/v1/packages>",
"affiliateCode": "PROMO_42"
}'curl -X POST "$API_BASE/api/v1/claim/stripe" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sessionId": "cs_test_..."
}'Existing API key holders can also purchase credits directly via x402. Send `PAYMENT-SIGNATURE` (v2 header) and a `usdCents` amount (minimum `100`).
curl -X POST "$API_BASE/api/v1/credits/purchase/x402" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "PAYMENT-SIGNATURE: <base64-x402-payment-payload>" \
-d '{
"usdCents": 100,
"affiliateCode": "PROMO_42"
}'Create separate keys per environment or agent for safe rotation and revocation.
Device-link flow is also available for local tools: start in terminal, approve in browser, then poll until a one-time key is returned.
curl -X POST "$API_BASE/api/v1/keys" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"label": "Agent Worker A"
}'curl -X GET "$API_BASE/api/v1/keys" \ -H "Authorization: Bearer $API_KEY"
curl -X POST "$API_BASE/api/v1/keys/revoke" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"keyPrefix": "abcde"
}'curl -X POST "$API_BASE/api/v1/device/link/approve" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"userCode": "ABCD-EFGH",
"keyLabel": "Default API Key"
}'curl -X POST "$API_BASE/api/v1/device/link/poll" \
-H "Content-Type: application/json" \
-d '{
"deviceCode": "ktd_..."
}'const res = await fetch("${API_BASE}/api/v1/keys", {
method: "POST",
headers: {
"Authorization": "Bearer ${API_KEY}",
"Content-Type": "application/json",
},
body: JSON.stringify({ label: "Build Agent" }),
});
const data = await res.json();
// data.apiKey is only returned once; store it securely.Submit jobs with task + input. Use this section as a quick reference for task behavior, billing expectations, and tuning controls.
Task quick map
9 production tasks
Choose one task per request and pair it with the matching input schema.
image.generate
Qwen Image
image.edit
Qwen Image Edit
video.generate
LTX-2.3 video generation
video.combine
clip stitch-down with audio preserved
audio.speak
Qwen TTS
audio.annotation.reference
Whisper + lyric anchoring JSON
ace.step.create
Ace Step music
moss.sound.effect
MOSS sound effects
trellis.generate
Trellis 2 low-poly image-to-3D
Image and input handling
image.generate: set width + height directly when you need an explicit size override (optional, multiples of 32) up to 4MP.image.edit: output resolution follows source metadata when available, else defaults to 1024x1024.outputFormat supports webp, png, and jpg; when omitted it defaults to webp.highDetail is an optional opt-in for image.generate and image.edit. It defaults to false, increases inference steps by 50%, and increases job cost by 50%. Only enable it when the caller explicitly wants a higher-detail image pass.image.generate and image.edit, use referenceImages (URL or inline entries). referenceImageUrls is still accepted as a URL-only legacy alias.Audio usage and billing
ace.step.create 15..240s, moss.sound.effect 1..30s.ace.step.create.input.qualityPreset=high_quality (108s, 192k, richer sampler defaults). Explicit fields still override defaults.audio.speak is tuned for short-medium clips: text 40..600 chars, voiceDescription 20..240 chars, English-only language.audio.speak mode=voice_clone, use a matching transcript excerpt and keep the reference clip short. Start with 3..6s, and do not send more than 10s.maxNewTokens stays conservative. The current clone default is 384.audio.annotation.reference takes sourceAudioUrl/sourceAudio and optionally transcript, then returns a downloadable JSON annotation with lyrics, word timings, sections, beats, and QA metadata. A transcript is optional but strongly recommended when you want reliable lyric anchoring and section recovery.Video usage, LTX-2.3 controls, and reliability
video.generate supports image-to-video (startFrameImageUrl / startFrameImage, with sourceImageUrl / sourceImage accepted as aliases) and text-to-video (omit start/source image fields). The current production video model is LTX-2.3.width + height are required together (multiples of 32) up to 4MP; otherwise use aspectRatio defaults. These values define the final output canvas (for example 1920x1088); do not post-rescale in clients unless you explicitly want a different deliverable size.finalFrameImageUrl or finalFrameImage. For all image fields, provide either a URL string or inline dataBase64 + mimeType (JPG/PNG/WEBP). Pricing is identical across image-to-video and text-to-video modes. Pricing scales from sampled frame count, final output resolution, and whether reference audio is included. extremeQuality=true adds a 50% surcharge.extremeQuality only when you explicitly want the higher-fidelity path and are willing to pay the 50% premium.overlapFrameImageUrls or overlapFrameImages. Upload extracted trailing frames from the previous clip in chronological order at the base/sample FPS. Default client extraction format is lossless or visually lossless webp; avoid jpeg for continuation anchors. If you omit a separate start frame, the first overlap frame becomes frame zero automatically.referenceAudioUrl or referenceAudio (URL string or inline object). When reference audio is present, include a start frame or overlap frames. You may also combine it with finalFrameImage* when you need a closing-frame guide. Supported inline audio MIME types: audio/ogg, audio/opus, audio/wav, audio/x-wav, audio/wave, audio/mpeg, audio/mp3, audio/flac, audio/x-flac, audio/aac, audio/mp4, and audio/webm. Reference-audio requests are strict: the API does not silently downgrade to non-audio conditioning.durationFrames over durationSeconds. Duration frames use the base/sample FPS, must satisfy the LTX rule 8n + 1, and work directly with overlap math. At 25fps, counts like 249 or 257 are valid; exact 250 is not.video.combine stitches existing clip URLs in playback order, preserves clip-local audio, and optionally trims a matching audio/video overlap from the head of every clip after the first. It is billed as a utility operation at $0.005 per input clip with a two-clip minimum.interpolationFps: set 0 to disable interpolation, or use 30..60 (default 60). Default pipeline is sampled at 30fps and interpolated with RIFE to 60fps.Image-to-video reliability warning
Image-to-video generation is probabilistic and can vary widely between runs. Some outputs will be frozen, warped, or otherwise unusable even with the same prompt and input image.
Extension-video playbook
overlapCount / sampledFps seconds earlier than the nominal cut so the overlap-guided frames match the same audio moment.N sampled frames from clip B.Lip-Sync Prompting
referenceAudio shot, prompt it as an anchored performance, not a generic portrait.Trellis 3D tuning notes
qualityPreset, targetFaceCount, mesh/texturing steps, texture size, and geometry cleanup knobs.postprocessPositionEpsilon and postprocessNormalCreaseDeg for normal cleanup tuning.qualityPreset=balanced. See /3d-models for benchmark-tuned examples.Diagnostics and artifact window
POST /api/v1/media/jobs returns submit-time billing, duration estimate, effective input, and input-adjustment diagnostics. GET /api/v1/media/jobs?jobId=...&includeDetails=1 adds sanitized upstream result payloads plus the persisted effective input and adjustment trail.Audio pricing quick ref
audio.speak
Tiered by estimated duration: <=3s $0.01, >3s..7s $0.02, >7s..10s $0.03.
audio.annotation.reference
Estimated from transcript length when present: <=60s $0.03, <=120s $0.05, <=180s $0.07. Without a transcript the default band is 120s.
ace.step.create
max($0.05, durationSeconds * qualityKbps * $0.000008)
moss.sound.effect
max($0.01, durationSeconds * $0.004 + maxNewTokens * $0.000008)
curl -X GET "$API_BASE/api/v1/balance" \ -H "Authorization: Bearer $API_KEY"
curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: job-001" \
-d '{
"task": "image.generate",
"input": {
"prompt": "cinematic fox astronaut",
"width": 1536,
"height": 1024,
"referenceImages": [
"https://cdn.example.com/input/style-ref.webp",
{
"dataBase64": "<base64-or-data-uri>",
"mimeType": "image/png"
}
]
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "image.edit",
"input": {
"prompt": "turn this scene into a dramatic noir poster",
"sourceImage": "https://cdn.example.com/input/source.jpg",
"referenceImages": [
"https://cdn.example.com/input/style-ref.webp",
{
"dataBase64": "<base64-or-data-uri>",
"mimeType": "image/webp"
}
]
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "video.generate",
"input": {
"prompt": "slow cinematic push-in with floating particles",
"startFrameImage": {
"dataBase64": "<base64-or-data-uri>",
"mimeType": "image/png"
},
"finalFrameImage": "https://cdn.example.com/input/final-frame.webp",
"durationSeconds": 6,
"width": 1920,
"height": 1088,
"interpolationFps": 60
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "video.generate",
"input": {
"prompt": "single continuous cinematic flythrough over a neon city at dawn",
"durationSeconds": 6,
"width": 1920,
"height": 1088,
"interpolationFps": 0
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "video.generate",
"input": {
"prompt": "Single continuous hero shot with restrained camera motion and strong identity retention.",
"startFrameImageUrl": "https://cdn.example.com/input/start-frame.webp",
"durationSeconds": 6,
"width": 2048,
"height": 1152,
"extremeQuality": true
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "video.generate",
"input": {
"prompt": "image-to-video shot anchored to the supplied start frame for a direct-to-camera dialogue or singing line. keep the performance synced to the provided reference audio from start to finish. honor the frame-zero composition from the supplied start frame and keep the same subject count, identity, wardrobe, and environment family. favor restrained camera behavior; prefer locked framing, a very gentle push, or a tiny lateral drift, with subject motion carrying the shot more than the camera. keep the subject readable whenever the face is foregrounded. let mouth articulation, jaw travel, breath timing, shoulder rhythm, and phrase-timed gestures carry the sync. start moving immediately. keep lip sync faithful to the supplied reference audio, with mouth shapes and breath timing driven by that phrase. keep one continuous shot with stable anatomy and coherent motion.",
"startFrameImageUrl": "https://cdn.example.com/input/start-frame.webp",
"finalFrameImageUrl": "https://cdn.example.com/input/final-frame.webp",
"referenceAudioUrl": "https://cdn.example.com/input/reference-track.opus",
"durationSeconds": 6,
"width": 1920,
"height": 1088,
"interpolationFps": 60
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "video.generate",
"input": {
"prompt": "image-to-video shot anchored to the supplied start frame for a direct-to-camera dialogue continuation. keep the performance synced to the provided reference audio from start to finish. honor the frame-zero composition from the supplied start frame and keep the same subject count, identity, wardrobe, and environment family. favor restrained camera behavior; prefer locked framing, a very gentle push, or a tiny lateral drift, with subject motion carrying the shot more than the camera. keep the subject readable whenever the face is foregrounded. let mouth articulation, jaw travel, breath timing, shoulder rhythm, and phrase-timed gestures carry the sync. start moving immediately. keep lip sync faithful to the supplied reference audio, with mouth shapes and breath timing driven by that phrase. keep one continuous shot with stable anatomy, coherent motion, and preserved white balance, skin tone, exposure, contrast, saturation, and background palette.",
"overlapFrameImageUrls": [
"https://cdn.example.com/input/clip-a-last-03.webp",
"https://cdn.example.com/input/clip-a-last-02.webp",
"https://cdn.example.com/input/clip-a-last-01.webp"
],
"referenceAudioUrl": "https://cdn.example.com/input/dialogue-half-b.opus",
"durationFrames": 257,
"width": 1280,
"height": 1280,
"sampledFps": 25,
"interpolationFps": 60,
"seed": 424242
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "video.combine",
"input": {
"videoUrls": [
"https://cdn.example.com/output/clip-a.mp4",
"https://cdn.example.com/output/clip-b.mp4"
],
"overlapFrames": 3,
"frameRate": 60
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "audio.speak",
"input": {
"text": "We launch at dawn, hold formation, and bring everyone home safely.",
"voiceDescription": "Warm confident narrator with balanced pacing, stable projection, and natural emphasis.",
"language": "English",
"quality": "128k",
"seed": 123456
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "audio.speak",
"input": {
"mode": "voice_clone",
"text": "Keep the same character voice, but deliver this line with calm authority and clean pacing.",
"referenceAudioUrl": "https://cdn.example.com/input/rin-voice-sample.opus",
"referenceTranscript": "Rin keeps her voice low. She measures every word before it lands.",
"referenceAudioMaxSeconds": 6,
"maxNewTokens": 384,
"language": "English",
"quality": "128k",
"seed": 424242
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "audio.annotation.reference",
"input": {
"sourceAudioUrl": "https://cdn.example.com/input/country-heart-edit.mp3",
"transcript": "[Intro]\nBoots on the porch and a laptop glow,\nI mint an A P I key before the roosters crow.",
"language": "en",
"transcriptionModel": "distil-large-v3",
"device": "auto"
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "ace.step.create",
"input": {
"tags": "anthemic ace step electro-pop, wide stereo synths, tight sidechained bass, punchy drum transients, strong vocal hooks, modern polished mix",
"lyrics": "[Intro]\nNeon rain on the avenue\n\n[Verse]\nWe were shadows in a crowded room\nNow the skyline sings our names\n\n[Pre-Chorus]\nHands up, hearts up, hold the line\n\n[Chorus]\nWe run through the midnight light\nTurn the static into fire tonight\n\n[Bridge]\nStrip it down, then build it higher\n\n[Final Chorus]\nWe run through the midnight light",
"qualityPreset": "high_quality",
"durationSeconds": 108,
"quality": "192k",
"language": "en"
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "moss.sound.effect",
"input": {
"prompt": "A sharp pistol shot in a dry canyon with a quick mechanical click and short tail echo.",
"durationSeconds": 2,
"quality": "128k",
"topK": 50,
"maxNewTokens": 1024
}
}'curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"task": "trellis.generate",
"input": {
"sourceImageUrl": "https://cdn.example.com/input/boat_ref.png",
"qualityPreset": "balanced",
"targetFaceCount": 20000,
"textureSize": 1024,
"textureResolution": 512,
"maxViews": 4,
"sparseStructureSteps": 10,
"shapeSteps": 10,
"textureSteps": 10,
"meshResolution": 1024,
"remeshFillHoles": true,
"remeshFillHolesMaxPerimeter": 0.05,
"meshClusterConeHalfAngleRad": 55
}
}'curl -X GET "$API_BASE/api/v1/media/jobs?jobId=abc123" \ -H "Authorization: Bearer $API_KEY"
curl -X GET "$API_BASE/api/v1/media/jobs?jobId=abc123&includeDetails=1" \ -H "Authorization: Bearer $API_KEY"
curl -X POST "$API_BASE/api/v1/media/jobs" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: job-001" \
-d '{
"task": "image.generate",
"input": {
"prompt": "cinematic fox astronaut",
"width": 1024,
"height": 1024
},
"idempotencyKey": "job-001"
}'Send `X-Idempotency-Key` when retrying writes (`/api/v1/media/jobs`) to avoid duplicate charges. Error responses are JSON with `error` and optional `details`. Poll `GET /api/v1/media/jobs?jobId=...` for status and `downloadableOutputUrls`, or add `includeDetails=1` when you need sanitized upstream result details.