Plask Motion Capture API
Use the Plask API to process video, follow extraction progress, or stream poses into your own application. Manage API keys and credits in the Developer page.
For artist tools, follow Plask to Blender or Plask to UE5.
1. Create an API key
- Open the Developer page and create a key with the scopes your application needs:
jobs:read,jobs:write,live:write, orusage:read. - Save the key when it is shown. Keep it on your server or in a private local file.
- Send it in the
Authorization: Bearer YOUR_API_KEYheader. Do not put it in a URL, browser bundle, Blender scene, or Unreal project.
The base URL is https://pose-api.plask.ai. See the API reference for request and response fields.
2. Check your credits
Call GET /v1/usage to check available and reserved credits before starting work.
A realtime session reserves the limit you choose. Each committed pose costs one credit; dropped and rejected frames are not charged. Closing the session releases unused credits. Development keys use a separate test allowance with the same metering rules.
Use a new Idempotency-Key for each new job or session. If admission times out, retry with the same key and request body to recover the original operation.
3. Process a video
- Create an upload with
POST /v1/uploads, including its byte count and SHA-256 checksum. - Send the file to the returned signed PUT URL with the required headers. Then call
POST /v1/uploads/{id}/complete. - Create a job with
POST /v1/jobs, using the upload ID,model: "accurate", and the required frame range. - Follow
GET /v1/jobs/{id}/eventsfor server-sent progress events, or poll the job. Reconnect the event stream withLast-Event-ID. - When processing finishes, download from
GET /v1/jobs/{id}/result.
Progress reports a stage and completed/total work in a named unit. Show progress within that stage. While allocating a worker or loading a model, show a waiting state until measured progress is available. Video jobs use Plask's batch GPU workers; realtime sessions use on-demand Modal GPUs.
Browser clients can request the result with ?redirect=false, then fetch the returned signed URL without forwarding the API key. To stop a job, call POST /v1/jobs/{id}/cancel.
4. Stream realtime poses
Create a session with a bounded pose budget:
POST /v1/realtime/sessions
Authorization: Bearer YOUR_API_KEY
Idempotency-Key: A_NEW_UUID
Content-Type: application/json
{"model":"realtime-preview","max_frames":300,"fps":30,"width":640,"height":480}
- Call the returned token endpoint, connect to the returned WebSocket URL, and authenticate within five seconds with
{"type":"authenticate","token":"YOUR_SESSION_TOKEN"}. - Handle
session.warmingwhile the GPU starts. Keep your local preview running and wait forsession.readybefore sending images. - Read the negotiated epoch, batch size, pending-frame limit, and last committed sequence/timestamp from
session.ready. - Send JPEG frames and read pose, dropped, and rejected acknowledgements concurrently.
- Stop capture, drain outstanding responses, then call
POST /v1/realtime/sessions/{id}/close.
Frames have a 24-byte network-byte-order header followed by the JPEG: PLK1 (4 bytes), epoch (uint32), sequence (uint64), and monotonic capture timestamp in microseconds (uint64). Sequence and timestamp must increase and fit within JavaScript's safe integer range. JPEGs must match the negotiated dimensions and be no larger than 1 MiB.
Sample on a steady capture clock and keep outstanding frames within pending_frames. Do not replay a camera backlog after a network delay. The server processes up to eight frames per GPU call without waiting for a full batch. Preview, network capture, and rig display should run independently.
Poses use plask.pose.v1, a smpl24-neutral-v1 skeleton, metres, camera-relative root position, right-handed X-right/Y-forward/Z-up coordinates, and local xyzw quaternions. Handle tracking_reset by starting a new interpolation segment. A reconnect uses a new epoch; resume after the committed values returned by the server.
Respect startup_timeout_seconds. Session expiry is ten minutes from admission, including startup. Cold allocation can take substantially longer than steady streaming. On a connection failure, close the session through REST to release the remaining reservation.
Set up native capture
Blender and Unreal use the same local runtime. For native capture, use macOS 14 or later and Python 3.12.
1. Install the runtime
python3.12 -m venv ~/plask-env
~/plask-env/bin/python -m pip install \
https://pose-api.plask.ai/integrations/downloads/plask_serving-0.4.3-py3-none-any.whl
2. Build the camera helper
Download and extract the macOS camera helper source. From the extracted folder, run:
bash macos/build_camera.sh
Apple's command-line developer tools are required. This builds Plask Camera.app in ~/.local/share/plask. It is a local build, not a notarized installer. Allow camera access when prompted.
3. Save your key
Create ~/.config/plask/development.env with these contents, replacing the placeholder with a key that has live:write access:
PLASK_API_KEY=YOUR_PRIVATE_KEY
PLASK_API_URL=https://pose-api.plask.ai
Make the file private:
chmod 600 ~/.config/plask/development.env
Continue with Blender setup or Unreal setup. Keep the runtime and extension versions matched when upgrading.
Connect Unreal
After the native capture setup, list your cameras and generate a pairing code:
PLASK_CAMERA="$HOME/.local/share/plask/Plask Camera.app/Contents/MacOS/PlaskCamera"
"$PLASK_CAMERA" --list /tmp/plask-cameras.json
cat /tmp/plask-cameras.json
PLASK_PAIRING=$(~/plask-env/bin/python -c 'import secrets; print(secrets.token_urlsafe(24))')
printf '%s\n' "$PLASK_PAIRING"
In Unreal, open Window → Virtual Production → Live Link → Add Source → Plask Live. Enter port 14046 and the pairing code shown in your terminal.
In the same terminal, replace CAMERA_ID with your camera's ID and run:
PLASK_TAKE=$(mktemp -d)
~/plask-env/bin/python -m plask_serving.native_capture \
--target unreal --port 14046 --pairing "$PLASK_PAIRING" \
--directory "$PLASK_TAKE" --parent $$ --budget 300 \
--key-file "$HOME/.config/plask/development.env" \
--camera-binary "$PLASK_CAMERA" --camera CAMERA_ID \
--model realtime-preview
Allow camera access when prompted. Keep the helper running while you capture, then press Ctrl-C to finish. Continue with recording in Unreal.
Earlier SDK integrations
The earlier @plask-ai/client SDK uses a different authentication and job interface. The REST and realtime workflows on this page use API keys and the current API reference; they are not drop-in replacements for existing SDK calls.
Updated October 11, 2026. Runtime 0.4.3.