Developer Docs

Open API Documentation

Interact with an Inkanva Frame over HTTPS using a simple, token-based JSON API.

https://api.inkanva.com/openapi Bearer Token 20 requests / minute

01 / Overview

Connect directly to the frame.

Use this API to query device information, upload and manage images, and switch the displayed image on an Inkanva Frame remotely.

Base URL
https://api.inkanva.com/openapi
Transport
HTTPS
Authentication
Bearer Token
Format
JSON

02 / Use Cases

Built for lightweight integrations.

Remote Content Publishing

Upload generated or curated images and immediately switch the frame display.

Device Status Dashboard

Monitor heartbeat, battery, charging state, screen geometry, and sync status.

Gallery Management

List existing images, remove outdated assets, and select the active image.

Backend Automation

Connect a mobile app, CMS, image workflow, or internal service to the frame.

AI Agent Integrations

Turn generated artwork, task results, briefings, and context-aware updates into visible output.

03 / AI Agent Control

Give your agent a set of frame tools.

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

  1. 01

    Get the keyCopy it from the Frame settings page.

  2. 02

    Keep it privateStore it in the agent’s server-side secrets.

  3. 03

    Register toolsMap the API operations to callable agent tools.

BASE_URLhttps://api.inkanva.com/openapi API_KEY<DEVICE_API_KEY>

Every request

01Ask 02Inspect 03Display 04Verify
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.

Agent toolAPI operationPurpose
get_frame_statusPOST /device

Check online, battery, sync, and current image.

list_frame_imagesPOST /listImages

Find existing artwork before uploading a duplicate.

upload_frame_imagePOST /upload

Upload raw base64 artwork and make it active.

display_frame_imagePOST /displayImageById

Switch to an existing image by ID.

delete_frame_imagePOST /deleteImage

Remove an image only after user confirmation.

Agent instruction template
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

Authenticate with the device key.

  • Use a Bearer token in the Authorization header.
  • The token is the device API key shown on the Frame settings page.
  • Send JSON requests with the Content-Type: application/json header.
Request headers
Authorization: Bearer <API_KEY>
Content-Type: application/json

05 / Rate Limiting

20 requests per minute.

20requests per minute
per device key

Exceeding the limit returns HTTP 429.

429 response
{ "message": "Too many requests, please try again later." }

06 / Endpoints

Device and image operations.

POST /device

Get Device Information

Request body: {} or omitted.

Response 200

{
  "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
}

Field Notes

firmware
Current firmware version.
nickname
Device nickname.
lastHeartbeat
ISO8601 timestamp of the last heartbeat.
isCharging, batteryLevel
Current power state.
switchType, switchMinute
Image change strategy and interval.
screenWidth, screenHeight, screenRotate
Display geometry.
synced, online
Latest-image sync and connection status.

cURL

curl -X POST https://api.inkanva.com/openapi/device \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{}'
POST /upload

Upload Image

Request Body

{
  "base64": "/9j/4AAQSkZJRgABAQEAAAAAAAD...",
  "name": "photo.jpg"
}

Rules and Behavior

  • base64 is required and must contain raw base64 image data without a data URL prefix.
  • The frame image counter is incremented and the new image becomes active.
  • name is optional and defaults to the original filename.
  • Images are automatically cropped to the display area; match the screen ratio when possible.

Response 200

{ "id": 789, "counter": 10 }

cURL

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"}'
POST /listImages

List Images

Request body: {} or omitted.

Response 200

{
  "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
    }
  ]
}

Field Notes

  • 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

curl -X POST https://api.inkanva.com/openapi/listImages \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{}'
POST /deleteImage

Delete Image

Request Body

{ "imageId": 123 }

Rules and Behavior

  • imageId is required and must belong to the device.
  • The image file and database record are deleted together.
  • The frame image counter is incremented after deletion.
  • If the active image is deleted, the server switches to the next available image.
  • If no images remain, the current image becomes null.

Response 200

{
  "success": true,
  "id": 123,
  "imageId": 122,
  "counter": 11
}

Errors

  • 500 with { "message": "imageId is empty" } when the ID is missing or invalid.
  • 500 with { "message": "image not found" } when the image does not belong to the device.

cURL

curl -X POST https://api.inkanva.com/openapi/deleteImage \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"imageId":123}'
GET /image/:apikey/:imageId

Get Image by API Key and Image ID

Path Parameters

apikey
Device API key shown on the Frame settings page.
imageId
Image ID returned by the upload or list APIs.

The API key is passed in the URL path, so the Authorization header is not required.

Behavior

  • Returns the original stored image file.
  • The image must belong to the device identified by apikey.
  • The response type is derived from the stored file extension, typically image/jpeg.

Response 200

Binary image stream.

Errors

  • 404 with { "message": "image not found" } for an invalid or unrelated image ID.
  • 500 with { "message": "can not find robot <apikey>" } for an unknown device key.

cURL

curl -L "https://api.inkanva.com/openapi/image/<API_KEY>/123" \
  -o image.jpg
POST /displayImageById

Display Image by ID

Request Body

{ "imageId": 123 }

Response 200

{ "success": true }

Returns 500 with { "message": "image not found" } when the image does not belong to the device.

cURL

curl -X POST https://api.inkanva.com/openapi/displayImageById \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"imageId":123}'
POST /displayImageByName

Display Image by Name

Request Body

{ "imageName": "photo.jpg" }

Response 200

{ "success": true }

Returns 500 with { "message": "image not found" } when the image name is not found.

cURL

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

HTTP status and JSON messages.

404

Not Found

Unknown method in URL.

{ "message": "can not find method <method_name>" }
429

Too Many Requests

Rate limit exceeded.

{ "message": "Too many requests, please try again later." }
500

Internal Server Error

The device cannot be found, or another server-side failure occurred.

{ "message": "<error_message>" }

08 / Payload Size

Maximum request: 50 MB.

The server accepts request payloads up to 50 MB. Ensure base64 image uploads fit within this limit.