Remote Content Publishing
Upload generated or curated images and immediately switch the frame display.
Developer Docs
Interact with an Inkanva Frame over HTTPS using a simple, token-based JSON API.
01 / Overview
Use this API to query device information, upload and manage images, and switch the displayed image on an Inkanva Frame remotely.
https://api.inkanva.com/openapi02 / Use Cases
Upload generated or curated images and immediately switch the frame display.
Monitor heartbeat, battery, charging state, screen geometry, and sync status.
List existing images, remove outdated assets, and select the active image.
Connect a mobile app, CMS, image workflow, or internal service to the frame.
Turn generated artwork, task results, briefings, and context-aware updates into visible output.
03 / AI Agent Control
OpenClaw, Claude Code, ChatGPT, or any tool-calling agent can control Inkanva through a small server-side integration. Keep the device key in the agent runtime, map the API operations to tools, then let the agent inspect, select, upload, and display artwork.
Set up once
Get the keyCopy it from the Frame settings page.
Keep it privateStore it in the agent’s server-side secrets.
Register toolsMap the API operations to callable agent tools.
BASE_URLhttps://api.inkanva.com/openapi
API_KEY<DEVICE_API_KEY>
Every request
User “Display a quiet blue landscape in the studio.”
The agent checks the frame, reuses or creates artwork, displays it, then confirms the active image.
get_frame_statusPOST /deviceCheck online, battery, sync, and current image.
list_frame_imagesPOST /listImagesFind existing artwork before uploading a duplicate.
upload_frame_imagePOST /uploadUpload raw base64 artwork and make it active.
display_frame_imagePOST /displayImageByIdSwitch to an existing image by ID.
delete_frame_imagePOST /deleteImageRemove an image only after user confirmation.
You control an Inkanva Frame with the provided tools.
1. Inspect the frame before changing it when its state is unknown.
2. Reuse a suitable image from the library when possible.
3. For new artwork: generate image → encode raw base64 → upload.
4. Remember that upload makes the new image active immediately.
5. Ask for confirmation before deleting any image.
6. After a write action, check device status and report the result.
04 / Authentication
Authorization header.Content-Type: application/json header.Authorization: Bearer <API_KEY>
Content-Type: application/json
05 / Rate Limiting
Exceeding the limit returns HTTP 429.
{ "message": "Too many requests, please try again later." }
06 / Endpoints
/device
Request body: {} or omitted.
{
"firmware": "B100V050610",
"nickname": "Inkanva",
"lastHeartbeat": "2026-06-16T06:56:25.782Z",
"isCharging": false,
"batteryLevel": 100,
"sdUsedSize": 0,
"switchType": "queue",
"switchMinute": 60,
"imageId": 423,
"coverId": null,
"timezone": "America/Adak",
"point": 30,
"screenWidth": 800,
"screenHeight": 480,
"screenRotate": 270,
"synced": false,
"online": false
}
curl -X POST https://api.inkanva.com/openapi/device \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{}'/upload
{
"base64": "/9j/4AAQSkZJRgABAQEAAAAAAAD...",
"name": "photo.jpg"
}base64 is required and must contain raw base64 image data without a data URL prefix.name is optional and defaults to the original filename.{ "id": 789, "counter": 10 }curl -X POST https://api.inkanva.com/openapi/upload \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"base64":"<BASE64_DATA>","name":"photo.jpg"}'/listImages
Request body: {} or omitted.
{
"total": 2,
"list": [
{
"id": 789,
"name": "photo.jpg",
"fileId": "abc123.jpg",
"size": 182736,
"type": "image/jpeg",
"width": 800,
"height": 480,
"createdAt": "2026-05-14T08:00:00.000Z",
"updatedAt": "2026-05-14T08:00:00.000Z",
"current": true
}
]
}total is the number of images belonging to the device.list contains images ordered by ID descending.current is true when the image is currently active.curl -X POST https://api.inkanva.com/openapi/listImages \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{}'/deleteImage
{ "imageId": 123 }imageId is required and must belong to the device.null.{
"success": true,
"id": 123,
"imageId": 122,
"counter": 11
}{ "message": "imageId is empty" } when the ID is missing or invalid.{ "message": "image not found" } when the image does not belong to the device.curl -X POST https://api.inkanva.com/openapi/deleteImage \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"imageId":123}'/image/:apikey/:imageId
The API key is passed in the URL path, so the Authorization header is not required.
apikey.image/jpeg.Binary image stream.
{ "message": "image not found" } for an invalid or unrelated image ID.{ "message": "can not find robot <apikey>" } for an unknown device key.curl -L "https://api.inkanva.com/openapi/image/<API_KEY>/123" \
-o image.jpg/displayImageById
{ "imageId": 123 }{ "success": true }Returns 500 with { "message": "image not found" } when the image does not belong to the device.
curl -X POST https://api.inkanva.com/openapi/displayImageById \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"imageId":123}'/displayImageByName
{ "imageName": "photo.jpg" }{ "success": true }Returns 500 with { "message": "image not found" } when the image name is not found.
curl -X POST https://api.inkanva.com/openapi/displayImageByName \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
-d '{"imageName":"photo.jpg"}'07 / Error Handling
Unknown method in URL.
{ "message": "can not find method <method_name>" }Rate limit exceeded.
{ "message": "Too many requests, please try again later." }The device cannot be found, or another server-side failure occurred.
{ "message": "<error_message>" }08 / Payload Size
The server accepts request payloads up to 50 MB. Ensure base64 image uploads fit within this limit.