Before you start
Four things to have on hand. None are blockers — you can grab any you're missing as you go.
- Admin access to dealer.chekt.com
- A secret manager — 1Password, Doppler, AWS Secrets, or just a .env file
- Decided which permissions you need (or starting small)
- Public HTTPS endpoint ready (if your app needs webhooks)
The full flow at a glance
Six steps from the admin's first click to your app making its first call.
- 01Dealer adminCHeKTOpen Settings → CHeKT Apps
- 02Dealer adminCHeKTClick New app, set name & description
- 03Dealer adminCHeKTPick permission scopesStart small: devices:read, events:read
- 04Dealer adminCHeKTSet webhook URL & event subscriptionsOptional — skip if API-only
- 05CHeKTYour appIssue API key + signing secretShown once — copy to secret manager
- 06Your appCHeKTVerify with first authenticated callGET /v1/devices
1 Open the apps page
Sign into dealer.chekt.com with an admin account. Open Settings → CHeKT Apps from the left sidebar, then click New app in the top-right.
CHeKT Apps
3 installed2 Name your app
The name shows up in audit logs, webhook delivery history, and the dealer's installed-apps list. Pick something specific so operators reading the log six months from now still know what the app does.
ai-verifier-prodnightly-reportspanel-bridge-stagingacme-dispatch-v2
test— which test?my-app— whose?integration— with what?app-1— what does it do?
3 Pick permissions
Grant only what the app needs. You can expand permissions later — the dealer admin re-approves the new set — and you can tighten permissions silently any time. The principle of least privilege keeps your blast radius small if the key ever leaks.
The picker
The dealer portal lays out scopes by resource family. Click each one to toggle it on.
Permissions
Devices
devices:readreaddevices:writewriteEvents & Alarms
events:readreadsnapshots:readreadevents:writewritealarms:writewriteSites
sites:readreadQuick recipes
Common app shapes and the scopes they typically need. Pick the closest match and trim.
Read-only dashboard
Reports, monitoring, analytics.
devices:readevents:readsites:read
AI verification app
Reads alarms + snapshots, writes verdicts back.
events:readsnapshots:readevents:write
Auto-dispatcher
Sends responders for high-confidence alarms.
events:readalarms:write
Schedule automation
Arms / disarms partitions on a calendar.
sites:readsites:write
4 Subscribe to webhook events
If your app needs real-time push from CHeKT, register a webhook URL and pick events to subscribe to. Skip this step if your app only reads via the REST API — you can add webhooks later from the same settings page.
Webhook URL
A public HTTPS endpoint you control. CHeKT POSTs each event here with a signed header. For local development, use a tunnel like ngrok or cloudflared.
ngrok http 3000
# → forwarding https://abc123.ngrok.app → http://localhost:3000
# Paste the https://… URL into the webhook field in the portal.Selecting events
The fewer events you subscribe to, the cleaner your delivery log. Start with the two or three event types driving your core workflow.
Webhook subscriptions
3 selectedAlarms
alarm.createdalarm.resolvedalarm.dispatchedSnapshots
snapshot.createdSee the event catalog for every event type with its payload shape and required permission scope.
5 Save the API key & signing secret
When you click Create, CHeKT shows your API key and webhook signing secret on screen. Copy them now.
App created
NewYour app is ready. The values below are shown only once — copy them into your secret manager before continuing.
Where to store them
- Local dev
- A .env file in .gitignore. Never commit. Use a library like dotenv to load.
- Production servers
- Your platform's secrets manager — AWS Secrets Manager, GCP Secret Manager, Vault, Doppler.
- CI/CD pipelines
- Encrypted secrets store — GitHub Actions secrets, GitLab variables, Vercel env vars.
- Anywhere else
- A dedicated secrets manager that audit-logs reads. 1Password Teams, Bitwarden Business, Doppler.
6 Verify with your first API call
List the devices on your dealer. A successful response confirms auth, permissions, and connectivity all work end-to-end. Pick your language:
export CHEKT_API_KEY='chekt_live_8h2j3kfm…'
curl https://api.chekt.com/v1/devices \
-H "Authorization: Bearer ${CHEKT_API_KEY}" \
-H "Accept: application/json"A successful response looks like this:
{
"data": [
{
"id": "dev_8h2j3kfm",
"type": "camera",
"name": "Main Entrance",
"site_id": "site_29snd",
"status": "online",
"firmware": "2.14.1"
}
],
"has_more": false,
"next_cursor": null
}If you see an error
Most first-call errors fall into one of four buckets:
invalid_api_keyDouble-check the key is set in CHEKT_API_KEY and you're sending it as a Bearer token. Re-run echo $CHEKT_API_KEY in the same shell.
permission_deniedThe app is missing the required scope. Go back to Settings → CHeKT Apps → [your app] → Permissions and grant the scope your call needs.
Wrong base URLAll endpoints live under https://api.chekt.com/v1. Don't forget /v1 in the path.
Rate limitedFree-tier limit is 60 req/min. If you're testing in a tight loop, slow down or upgrade.
Bonus — set up the webhook handler
If you subscribed to webhooks in step 4, here's the minimal receiver. Always verify the HMAC signature against the raw bytes (not the parsed JSON) and respond with 200 within 30 seconds.
import express from "express";
import crypto from "crypto";
const app = express();
app.post(
"/webhooks/chekt",
express.raw({ type: "application/json" }),
(req, res) => {
const sig = req.headers["x-chekt-signature"] as string;
const ts = req.headers["x-chekt-timestamp"] as string;
const signed = `${ts}.${req.body.toString("utf8")}`;
const expected = crypto
.createHmac("sha256", process.env.CHEKT_WEBHOOK_SECRET!)
.update(signed)
.digest("hex");
if (!crypto.timingSafeEqual(
Buffer.from(sig, "hex"),
Buffer.from(expected, "hex"),
)) return res.status(401).end();
const event = JSON.parse(req.body.toString("utf8"));
console.log(`Got ${event.type}`);
res.sendStatus(200);
},
);
app.listen(3000);You're done.
You have a working CHeKT App with an API key, scoped permissions, and (optionally) webhook delivery. From here: