Regulatory Filings quickstart
Use a secret API key from your backend and an account authorized for that key. Publishable keys cannot access these operations. Requests use the key's test or live mode; disclosures are isolated by account and mode. Set the variables below to your own values and keep the secret key out of client-side code.
For retrieval and download, use Paypercut-Account to select the account when your API key can access multiple accounts. X-Paypercut-Account is also accepted.
1. Discover capabilities
export PAYPERCUT_SECRET_KEY='YOUR_SECRET_KEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'
curl --fail-with-body "https://api.paypercut.io/v1/accounts/$ACCOUNT_ID/regulatory_capabilities" \
-H "Authorization: Bearer $PAYPERCUT_SECRET_KEY"
An illustrative response for a Bulgarian account is:
{
"object": "list",
"data": [{
"id": "bg_nra_ecommerce",
"object": "regulatory_capability",
"country": "BG",
"authority": {"id": "bg_nra", "name": "National Revenue Agency"},
"regulation": "ordinance_h18",
"forms": [{"id": "bg_nra_appendix_33", "name": "Electronic Store Declaration"}],
"supported_operations": ["disclosure_generation"]
}]
}
2. Create a disclosure
Choose an available capability and a unique idempotency key for this snapshot. form and form_version are optional; when omitted, the supported selection is used. Save the returned id.
export IDEMPOTENCY_KEY="$(uuidgen)"
curl --fail-with-body 'https://api.paypercut.io/v1/regulatory_disclosures' \
-H "Authorization: Bearer $PAYPERCUT_SECRET_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-d "{\"account\":\"$ACCOUNT_ID\",\"capability\":\"bg_nra_ecommerce\"}"
The initial response is typically 202 Accepted, with a Location header and a disclosure such as:
{
"id": "regdisc_01JEXAMPLE0000000000000000",
"object": "regulatory_disclosure",
"account": "acct_example",
"live_mode": false,
"capability": "bg_nra_ecommerce",
"form": "bg_nra_appendix_33",
"form_version": "2020-07-31",
"status": "pending",
"created_at": "2026-10-28T09:00:00Z",
"updated_at": "2026-10-28T09:00:00Z"
}
3. Wait for completion
Set DISCLOSURE_ID to the returned ID. This example uses jq, polls every two seconds for up to two minutes, and stops on a request error or terminal status:
export DISCLOSURE_ID='YOUR_DISCLOSURE_ID'
for attempt in $(seq 1 60); do
response=$(curl --fail-with-body -sS \
"https://api.paypercut.io/v1/regulatory_disclosures/$DISCLOSURE_ID" \
-H "Authorization: Bearer $PAYPERCUT_SECRET_KEY" \
-H "Paypercut-Account: $ACCOUNT_ID") || break
status=$(printf '%s' "$response" | jq -r '.status')
if [ "$status" = ready ] || [ "$status" = failed ]; then
printf '%s\n' "$response" | jq .
break
fi
sleep 2
done
A ready response can look like this illustrative example. The array contents and coverage depend on the account:
{
"id": "regdisc_01JEXAMPLE0000000000000000",
"object": "regulatory_disclosure",
"account": "acct_example",
"live_mode": false,
"capability": "bg_nra_ecommerce",
"form": "bg_nra_appendix_33",
"form_version": "2020-07-31",
"status": "ready",
"created_at": "2026-10-28T09:00:00Z",
"updated_at": "2026-10-28T09:00:05Z",
"completed_at": "2026-10-28T09:00:05Z",
"coverage": {
"status": "incomplete",
"scope": "paypercut_managed_payment_information",
"issues": [{"code": "receiving_currency_support_unresolved"}]
},
"data": {"payment_arrangements": [{
"merchant_identifier": {"value": "00123456"},
"virtual_pos_identifier": {"value": "00001234"},
"currency": "BGN",
"payment_methods": ["card"],
"receiving_accounts": []
}]}
}
If the loop times out while the disclosure is still pending or generating, retain the ID and check again later. A ready disclosure may have incomplete coverage; inspect coverage.issues and all entries in data.payment_arrangements. See information and coverage. If it is failed, see lifecycle.
4. Download the document
Once the disclosure is ready, follow the document download instructions. To fetch a fresh snapshot after information changes, see fresh disclosures.

