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.MechanismPurpose~/.config/leaptic/credentials.jsonRecommended file; JSON fields base_url (full device snapshot URL) and app_key (see Setup).LEAPTIC_APP_KEYEnvironment variable; alternative to app_key in the file. Matches metadata.openclaw.primaryEnv for OpenClaw skills.entries.leaptic.apiKey injection.LEAPTIC_BASE_URLOptional 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.
Regionbase_url (full URL for GET)CNhttps://photon-prod.leaptic.tech/photon-server/api/v1/skill/device/snapshotEU (DE)https://photon-eu.leaptic.tech/photon-server/api/v1/skill/device/snapshotUShttps://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).
json
{
"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:
http
App-Key: <app_key>
Example ( base_url is the full snapshot URL for the user’s region):
bash
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: <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).
FieldTypeDescriptioncodeinteger (int32)Status code: 0 = success, any other value = failuremsgstringSuccess or error messagedataobjectSkillDeviceSnapshotVO; contains devices (see below)traceIdstringDistributed trace id for request correlationsuccessbooleanOverall success flag
data payload ( SkillDeviceSnapshotVO)#FieldTypeDescriptiondevicesarray of DeviceItemOne element per bound device
DeviceItem fields ( data.devices[])#FieldTypeDescriptionsnstringDevice serial numberbatteryLevelinteger (int32) | nullBattery level percentage; null = unavailableisCharginginteger (int32)Charging: 1 = yes, 0 = nototalStoragestringTotal capacity ( GB), string in APIusedStoragestringUsed storage ( GB), string in APIfreeStorageMinutesstringEstimated remaining recordable time ( minutes), string (encoding may include a unit suffix depending on deployment)videoCountinteger (int32)Total video countvideoDurationMinutesstringTotal video duration ( minutes), stringvideoSizeGbstringTotal video size ( GB), stringphotoCountinteger (int32)Total photo countfreePhotoCountinteger (int32)Remaining number of photos that can be takenlatestShootTimestringMost 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.
json
{
"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).