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.
The key is shown once, when you create it. Palert stores only a fingerprint of it, so it cannot be shown again. If you lose it, revoke it and create another. If one ever leaks, revoke it immediately: revocation takes effect on the very next request.

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.

A Palert alert reflects payment information originating from your bank. It is a fast, reliable signal, but it is not a bank statement and not a legal record of settled funds. See our Terms & Conditions.

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"
  }
}
StatusCodeMeaning
400invalid_requestA parameter is missing or malformed.
401unauthorizedThe key is missing, invalid, revoked or expired.
402payment_requiredThis business has no active Palert subscription.
403forbidden_scopeThe key lacks the permission this call needs.
404not_foundNo such transaction for this business.
429rate_limitedToo many requests. Check the Retry-After header.
500internal_errorSomething 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.