mono-webhook-ebbb8b — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mono-webhook-ebbb8b (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Sets a webhook URL via POST /personal/webhook so Monobank pushes transaction events to your server in real time.
curl -s -X POST https://api.monobank.ua/personal/webhook \
-H "X-Token: YOUR_TOKEN_HERE" \
-H "Content-Type: application/json" \
-d '{"webHookUrl": "https://your-server.com/monobank-webhook"}'Fetch client info and check the webHookUrl field:
curl -s https://api.monobank.ua/personal/client-info \
-H "X-Token: YOUR_TOKEN_HERE" | jq '.webHookUrl'Send an empty string:
curl -s -X POST https://api.monobank.ua/personal/webhook \
-H "X-Token: YOUR_TOKEN_HERE" \
-H "Content-Type: application/json" \
-d '{"webHookUrl": ""}'When a transaction occurs, Monobank sends a POST request to your URL with the following JSON body:
{
"type": "StatementItem",
"data": {
"account": "account_id_string",
"statementItem": {
"id": "unique_transaction_id",
"time": 1713000000,
"description": "АТБ-Маркет",
"mcc": 5411,
"originalMcc": 5411,
"hold": true,
"amount": -15230,
"operationAmount": -15230,
"currencyCode": 980,
"commissionRate": 0,
"cashbackAmount": 152,
"balance": 4200120,
"comment": "",
"receiptId": "ABCD-1234-EFGH-5678",
"invoiceId": "",
"counterEdrpou": "",
"counterIban": "",
"counterName": ""
}
}
}The statementItem object has the exact same structure as transactions returned by the statement endpoint (see mono-statements skill for field descriptions).
| Field | Meaning |
|---|---|
type | Always "StatementItem" for transaction events |
data.account | Which account the transaction belongs to |
hold | true = authorization hold, false = settled transaction |
amount | Negative = expense, positive = income (in minor units, divide by 100) |
data.account to filter.hold changes from true to false. The id may differ between hold and settlement.id to deduplicate.Set webhook URL to a serverless function (AWS Lambda, Cloudflare Workers, Vercel) that formats the transaction and sends it to a Telegram chat via Bot API.
Use a Google Apps Script web app URL as the webhook endpoint. The script appends each transaction as a new row.
Forward the webhook to a middleware that transforms the transaction into the target budgeting app's API format. See smaugfm/monobudget on GitHub for an existing implementation.
Process webhooks through an AI categorization layer (e.g., map MCC codes to custom categories, use Claude API to categorize by description) and store in a database.
https://your-server.com/webhook/a1b2c3d4e5f6) since the personal API doesn't provide ECDSA signature verification like the acquiring API does.type is "StatementItem" and required fields exist.webHookUrl field)There is no test mode for personal API webhooks. To test:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.