Developers
API documentation
Read your business's payments and verify them from your own software: a point of sale, an online store, an ordering bot, or your accounting system. Everything is plain REST over HTTPS, and every response is JSON.
Getting a key
Open your Palert dashboard, go to Businesses, pick the business you want to connect, and open the API tab. Only the owner of a business can create keys.
Choose what the key is allowed to do when you create it. Give each key the smallest set of permissions its job needs:
- transactions:read
- List and look up this business's transactions.
- transactions:write
- Mark received payments as verified or unverified.
Authentication
Send your key as a bearer token on every request. A key belongs to one business, so you never pass a business id anywhere: Palert works out which business you mean from the key itself.
curl https://palert.app/api/v1/me \
-H "Authorization: Bearer plk_live_YOUR_KEY_HERE"Keep keys on your server. The API deliberately sends no CORS headers, so a browser cannot call it directly, and a key in your website's JavaScript would be readable by every visitor. Store keys in environment variables, not in your code or your repository.
GET /v1/me confirms which business and permissions a key carries. It is the quickest way to check a new key works:
{
"data": {
"business": { "id": "A1B2C3", "name": "Avas Store" },
"key": {
"name": "Website checkout",
"prefix": "plk_live_a1b2c3d4",
"scopes": ["transactions:read", "transactions:write"],
"rate_limit": 120
}
}
}Endpoints
All paths are relative to https://palert.app/api/v1.
GET/transactions
List this business's transactions, newest first.
Requires: transactions:read
Filter with any combination of these query parameters:
- from
- Start date, yyyy-mm-dd, Maldives time. Inclusive.
- to
- End date, yyyy-mm-dd, Maldives time. Inclusive.
- type
- received or sent.
- verified
- true or false.
- limit
- 1 to 200. Defaults to 50.
- cursor
- Fetch the next page. See Pagination.
curl "https://palert.app/api/v1/transactions?from=2026-09-01&type=received&verified=false" \
-H "Authorization: Bearer $PALERT_API_KEY"{
"data": [
{
"id": 48219,
"type": "received",
"amount": 250,
"from": "AHMED ALI",
"to": "7730000012345",
"datetime": "2026-09-10T06:41:22Z",
"verified": false
}
],
"next_cursor": null
}GET/transactions/{id}
Look up a single transaction.
Requires: transactions:read
A transaction belonging to any other business returns 404 not_found, the same as one that does not exist.
curl https://palert.app/api/v1/transactions/48219 \
-H "Authorization: Bearer $PALERT_API_KEY"POST/transactions/{id}/verify
Mark a received payment as verified.
Requires: transactions:write
Only received payments can be verified. Outgoing transfers are verified automatically when they arrive, so verifying one returns 400 invalid_request. Verifying a payment that is already verified succeeds and changes nothing, so retrying a failed request is safe.
curl -X POST https://palert.app/api/v1/transactions/48219/verify \
-H "Authorization: Bearer $PALERT_API_KEY"{
"data": {
"id": 48219,
"type": "received",
"amount": 250,
"from": "AHMED ALI",
"to": "7730000012345",
"datetime": "2026-09-10T06:41:22Z",
"verified": true
}
}POST/transactions/{id}/unverify
Undo a verification.
Requires: transactions:write
curl -X POST https://palert.app/api/v1/transactions/48219/unverify \
-H "Authorization: Bearer $PALERT_API_KEY"GET/me
The business and permissions behind this key.
Requires: any
The transaction object
- id
- Number. Unique within Palert.
- type
- Either "received" (money in) or "sent" (money out).
- amount
- Number, in Maldivian rufiyaa.
- from
- The sending account or name, as your bank reported it.
- to
- The receiving account, as your bank reported it.
- datetime
- When Palert recorded the payment, in UTC (ISO 8601, ending in Z).
- verified
- Boolean. Whether the payment has been confirmed.
Times are returned in UTC. The from and to date filters, by contrast, are calendar dates in Maldives time (UTC+5), because that is the day you mean when you ask for today's payments.
Pagination
List responses include next_cursor. When it is not null, pass it back as the cursor parameter to fetch the next page. When it is null, you have reached the end.
curl "https://palert.app/api/v1/transactions?limit=100&cursor=WyIyMDI2LTA5LTEwVDA2OjQxOjIyIiw0ODIxOV0" \
-H "Authorization: Bearer $PALERT_API_KEY"Treat the cursor as opaque: it is a position in your result set, not a value to build or parse yourself. Because it points at a position rather than counting pages, new payments arriving while you page through history will not shuffle or duplicate rows.
Errors
Any status other than 200 returns a body of this shape:
{
"error": {
"code": "forbidden_scope",
"message": "This key does not have the transactions:write scope"
}
}| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A parameter is missing or malformed. |
| 401 | unauthorized | The key is missing, invalid, revoked or expired. |
| 402 | payment_required | This business has no active Palert subscription. |
| 403 | forbidden_scope | The key lacks the permission this call needs. |
| 404 | not_found | No such transaction for this business. |
| 429 | rate_limited | Too many requests. Check the Retry-After header. |
| 500 | internal_error | Something went wrong on our end. Retry shortly. |
Rate limits
Each key may make 120 requests per minute. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining; exceeding the limit returns 429 with a Retry-After header giving the seconds until the window resets.
If your integration polls for new payments, one request every few seconds is plenty. If you need a higher limit for a legitimate workload, get in touch.
Questions
How do I get a Palert API key?
Open your Palert dashboard, go to Businesses, choose the business you want to connect, and open the API tab. Only the business owner can create keys. The key is shown once when you create it, so copy it straight into your server's configuration.
Is the Palert API free?
The API is included with an active Palert subscription at no extra cost. Keys belonging to a business whose subscription has lapsed return HTTP 402 until the subscription is renewed.
Can I call the Palert API from my website's JavaScript?
No. An API key is a server-side credential and the API sends no CORS headers, so browsers cannot call it directly. Anyone who can read your page can read a key you put in it, and that key could then read every payment your business receives. Always call the API from your own server.
What happens if I verify the same payment twice?
Nothing harmful. Verifying an already-verified payment returns success and the same transaction, so it is safe to retry a request that timed out or failed midway.
How many API requests can I make?
120 requests per minute per key by default. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining headers, and going over the limit returns HTTP 429 with a Retry-After header telling you how many seconds to wait.
Need a hand?
Message us on Telegram at t.me/simplygeek and a real person will get back to you. New to Palert? See how it works.