API
Alerts your bot can create
The same REST surface the web app uses, with an API key. Create levels from your own strategy code and receive the crossings on a signed webhook.
Pro plan v1
Authentication
Send your key as a bearer token. Keys are created in Settings and shown once.
curl https://levelping.com/api/v1/alerts \
-H "Authorization: Bearer lp_live_xxx"
Create an alert
POST /api/v1/alerts
{
"market": "hyperliquid:BTC",
"direction": "above",
"price": 72000,
"mode": "oneshot",
"note": "breakout entry"
}
The level is snapped to the exchange tick size. mode accepts oneshot or recurring; recurring alerts take an optional cooldownS and hysteresisPct.
Endpoints
| Method | Path | Does |
|---|---|---|
| GET | /markets | Search available markets |
| GET | /alerts | List your alerts |
| POST | /alerts | Create an alert |
| PATCH | /alerts/:id | Move the level, pause or re-arm |
| DELETE | /alerts/:id | Delete an alert |
| GET | /events | History of triggers and deliveries |
Webhook payload
When a level is crossed we POST this to your endpoint:
{
"type": "alert.triggered",
"alert": { "id": "...", "direction": "above", "price": 72000 },
"market": { "venue": "hyperliquid", "symbol": "BTC", "base": "BTC", "quote": "USD" },
"trigger": { "price": 72014.5, "at": "2026-08-18T09:41:12.004Z" }
}
Verifying the signature
Every request carries x-levelping-timestamp and x-levelping-signature. The signature is an HMAC-SHA256 of timestamp + "." + rawBody using your webhook secret.
const expected = crypto
.createHmac('sha256', secret)
.update(`${req.get('x-levelping-timestamp')}.${rawBody}`)
.digest('hex')
// compare with the value after "sha256=" using timingSafeEqual
Reject requests whose timestamp is more than a few minutes old, and always compare in constant time.
Limits
Two requests per second per key. Failed webhook deliveries are retried three times with backoff; an endpoint that keeps failing is disabled and you get an email about it.