Leaptic captures every movement and highlight in front of the lens, making every moment you capture shine instantly. Official website: https://www.leaptic.tech/
This skill documents the current Leaptic device snapshot HTTP API: a single device snapshot call using an App-Key. Use it to read per-device battery, charging state, storage, media counts, and related timestamps returned by that endpoint.
Important
app_key is missing, ask the user before calling the API.base_url — the full snapshot URL (see Setup). Use only that host for requests that include the App-Key. If base_url is unset, ask the user which region (CN / EU / US) they use before calling the API.Security
photon-prod.leaptic.tech, photon-eu.leaptic.tech, photon-us.leaptic.tech, or another base_url the user explicitly configured).app_key like a password: rotate it if it may have leaked.| Mechanism | Purpose |
|---|---|
| --------- | ------- |
~/.config/leaptic/credentials.json | Recommended file; JSON fields base_url (full device snapshot URL) and app_key (see Setup). |
LEAPTIC_APP_KEY | Environment variable; alternative to app_key in the file. Matches metadata.openclaw.primaryEnv for OpenClaw skills.entries.leaptic.apiKey injection. |
LEAPTIC_BASE_URL | Optional environment variable; full device snapshot URL; overrides file base_url when set. |
Storage: If you create credentials.json, restrict permissions (e.g. chmod 600). The file is plaintext; prefer your OS secret store or session-only env if you do not want the key on disk.
Photon API entry points are per region. Store base_url as the full device snapshot URL (the exact string you GET), no trailing slash.
| Region | base_url (full URL for GET) |
|---|---|
| ------ | ------------------------------- |
| CN | https://photon-prod.leaptic.tech/photon-server/api/v1/skill/device/snapshot |
| EU (DE) | https://photon-eu.leaptic.tech/photon-server/api/v1/skill/device/snapshot |
| US | https://photon-us.leaptic.tech/photon-server/api/v1/skill/device/snapshot |
Recommended: ~/.config/leaptic/credentials.json with both base_url (copy the row for the user’s region) and app_key. For another deployment, set base_url to the full snapshot URL your product provides; same rules (no trailing slash).
{
"base_url": "https://photon-prod.leaptic.tech/photon-server/api/v1/skill/device/snapshot",
"app_key": "lsk-your-secret-here"
}
Where to get app_key: In the official Leaptic app, open Settings and use the OpenClaw Skill entry there to obtain or copy the key.
Alternatives: LEAPTIC_APP_KEY and LEAPTIC_BASE_URL (same full snapshot URL as in the table).
Resolve credentials in this order unless the user specifies otherwise:
LEAPTIC_BASE_URL (if set) else base_url from ~/.config/leaptic/credentials.json. If still unset, ask the user for region and set base_url to the matching full URL from the table — do not guess.LEAPTIC_APP_KEY else app_key from ~/.config/leaptic/credentials.jsonSend the App-Key on every request:
App-Key: <app_key>
Example (base_url is the full snapshot URL for the user’s region):
curl -sS -X GET "${base_url}" \
-H "App-Key: ${app_key}"
Method / path: GET {base_url} — base_url is the full URL from Setup (includes /skill/device/snapshot).
Headers: App-Key:
Response: JSON object aligned with backend SkillDeviceSnapshotVO + envelope fields. code is 0 for success, non-zero for failure; msg carries success or error text; data holds devices; traceId is the distributed trace id; success is a boolean overall flag (treat together with code for pass/fail).
| Field | Type | Description |
|---|---|---|
| --------- | ------- | ----------- |
| code | integer (int32) | Status code: 0 = success, any other value = failure |
| msg | string | Success or error message |
| data | object | SkillDeviceSnapshotVO; contains devices (see below) |
| traceId | string | Distributed trace id for request correlation |
| success | boolean | Overall success flag |
data payload (SkillDeviceSnapshotVO)| Field | Type | Description |
|---|---|---|
| -------- | ---- | ----------- |
| devices | array of DeviceItem | One element per bound device |
DeviceItem fields (data.devices[])| Field | Type | Description | |
|---|---|---|---|
| --------------------- | --------------- | ----------- | |
| sn | string | Device serial number | |
| batteryLevel | integer (int32) \ | null | Battery level percentage; null = unavailable |
| isCharging | integer (int32) | Charging: 1 = yes, 0 = no | |
| totalStorage | string | Total capacity (GB), string in API | |
| usedStorage | string | Used storage (GB), string in API | |
| freeStorageMinutes | string | Estimated remaining recordable time (minutes), string (encoding may include a unit suffix depending on deployment) | |
| videoCount | integer (int32) | Total video count | |
| videoDurationMinutes | string | Total video duration (minutes), string | |
| videoSizeGb | string | Total video size (GB), string | |
| photoCount | integer (int32) | Total photo count | |
| freePhotoCount | integer (int32) | Remaining number of photos that can be taken | |
| latestShootTime | string | Most recent capture time; format yyyy-MM-dd HH:mm:ss |
Numeric counters use int32 in the API contract; several capacity/time fields are strings (GB / minutes) as returned by the service.
{
"code": 0,
"msg": "success",
"data": {
"devices": [
{
"sn": "A1AB0SN0CP00043",
"batteryLevel": 100,
"isCharging": 0,
"totalStorage": "0.00GB",
"usedStorage": "0.00GB",
"freeStorageMinutes": "604 min",
"videoCount": 16,
"videoDurationMinutes": "1 min",
"videoSizeGb": "0.69GB",
"photoCount": 1,
"freePhotoCount": 0,
"latestShootTime": "2026-04-07 16:56:58"
}
]
},
"traceId": "c83d6079-4b83-49ac-b256-0ac7e82140d0",
"success": true
}
If code is not 0 or success is not true, treat as failure and surface msg (and traceId if useful) to the user.
app_key and rotation in the Leaptic console (wording per your product).共 1 个版本