Pricing tiers
| Tier | Monthly price | Included calls | Overage |
|---|---|---|---|
| Free | 0 euro | 100 | Hard limit |
| Starter | 29 euro | 10,000 | 0.005 euro per call |
| Growth | 149 euro | 100,000 | 0.0025 euro per call |
| Enterprise | Custom | 1M+ | Negotiated |
Endpoints
POST /v1/payslip/extract: OCR and field extraction from a JPEG, PNG, or PDF.POST /v1/payslip/validate: pass structured figures, get a 2026 PAYE, USC, PRSI verdict.POST /v1/payslip/reconcile: cross-check multiple payslips against an annual Statement of Liability.GET /v1/usage: query your current month consumption.
Authentication
Every request carries a bearer token in the Authorization header. Tokens are scoped to a project and can be rotated without downtime via the dashboard. Rate limits are 60 requests per minute on Free, 600 on Starter, 6,000 on Growth.
Code samples
The four samples below show the same call (validate a single payslip) in curl, Node.js, Python, and Go. Production samples with error handling are in our docs at docs.payslipiq.co.uk.
curl
# curl example
curl -X POST https://api.payslipiq.co.uk/v1/payslip/validate \
-H "Authorization: Bearer $PAYSLIPIQ_KEY" \
-H "Content-Type: application/json" \
-d '{"country":"IE","gross":4000,"paye":520,"usc":120,"prsi":164,"period":"monthly"}'Node.js
// Node 20+
const r = await fetch('https://api.payslipiq.co.uk/v1/payslip/validate', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.PAYSLIPIQ_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({ country: 'IE', gross: 4000, paye: 520, usc: 120, prsi: 164, period: 'monthly' }),
});
const data = await r.json();Python
# Python 3.11+
import os, requests
r = requests.post(
'https://api.payslipiq.co.uk/v1/payslip/validate',
headers={'Authorization': f"Bearer {os.environ['PAYSLIPIQ_KEY']}"},
json={'country': 'IE', 'gross': 4000, 'paye': 520, 'usc': 120, 'prsi': 164, 'period': 'monthly'},
)
data = r.json()Go
// Go 1.22+
body := strings.NewReader(`{"country":"IE","gross":4000,"paye":520,"usc":120,"prsi":164,"period":"monthly"}`)
req, _ := http.NewRequest("POST", "https://api.payslipiq.co.uk/v1/payslip/validate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("PAYSLIPIQ_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)Reliability
- 99.9% uptime target on paid tiers, 99.5% on Free.
- Multi-AZ in eu-west-1 (Dublin). Single region by default.
- Status page at status.payslipiq.co.uk with RSS and webhook subscription.
Compliance
Data is processed in memory. We do not log payload bodies. Headers and status codes are retained for 30 days for incident debugging. Full DPA available on request, see our trust page.
Get a key
Sign up at the dashboard, no card needed for the Free tier. Email api@payslipiq.co.uk for Enterprise volumes.
API responses are educational and informational. Customers must not present API output as regulated tax, legal, or financial advice to end users.