API Documentation
Automate payment follow-ups from the tools you already use. Connect Google Sheets, Airtable, Stripe, Typeform, and 8,000+ other apps to PayChasers.
Getting Started
1. Generate your API key
Go to Settings in your PayChasers dashboard and scroll to the API Key section. Click Generate API Key. You'll see a key starting with pck_. Copy it immediately. You won't be able to see it again.
2. Authenticate
Every API request needs your key in the Authorization header:
Authorization: Bearer pck_your_key_here3. Test your connection
curl -H "Authorization: Bearer pck_your_key_here" \
https://paychasers.com/api/v1/meResponse:
{
"id": "user_abc123",
"email": "you@example.com",
"name": "Your Name",
"plan": "PRO",
"currency": "ZAR"
}API Endpoints
Base URL: https://paychasers.com/api/v1
Clients
List your clients
/api/v1/clientsCreate a client
/api/v1/clients{
"name": "Acme Corp",
"email": "billing@acme.com",
"notes": "Net 30 terms"
}Chases
List chases (with optional filters)
/api/v1/chasesGET /api/v1/chases
GET /api/v1/chases?status=OVERDUE
GET /api/v1/chases?status=SENT&limit=10Statuses: SENT, PROMISED, OVERDUE, PAID
Create a chase
/api/v1/chases{
"clientEmail": "billing@acme.com",
"clientName": "Acme Corp",
"paymentName": "March retainer",
"amount": 5000,
"currency": "ZAR",
"dueDate": "2026-04-15",
"chaseType": "INVOICE",
"autoChase": true
}Required: paymentName, amount, currency, and one of clientId or clientEmail. Optional: clientName, dueDate, chaseType (defaults to INVOICE), autoChase, and deliveryChannel.
When you pass clientEmail, PayChasers finds the existing client or creates a new one automatically. The legacy field name invoiceName is still accepted as an alias for paymentName.
deliveryChannel accepts EMAIL, WHATSAPP, or BOTH. WhatsApp and Both require a Pro+ or Enterprise plan. On any other plan the request still succeeds but the chase falls back to EMAIL.
Chase types: INVOICE, CLIENT_PAYMENT, CONTRACT_MILESTONE, PERSONAL_DEBT, BUSINESS_PAYMENT, SUBSCRIPTION, CUSTOM
Create chases in bulk (Batch upload)
/api/v1/chases/bulk{
"batchId": "batch_9876",
"accounts": [
{
"clientEmail": "customer1@example.com",
"clientName": "John Doe",
"paymentName": "Loan Repayment #44",
"amount": 250
},
{
"clientEmail": "customer2@example.com",
"clientName": "Jane Smith",
"amount": 1050
}
]
}The bulk endpoint is restricted to the Enterprise plan and is provisioned after a short kickoff call. Requests from Free, Pro, and Pro+ return 403. Push up to 500 accounts per batch, limited to 20 batch requests per hour. The system automatically deduplicates clients based on clientEmail. If you omit batchId, one is generated for you.
Returns 202 Accepted with a per row result:
{
"success": true,
"batchId": "batch_9876",
"processedCount": 2,
"failedCount": 0,
"errors": [],
"warnings": [],
"chases": [ /* created chases */ ]
}warnings surfaces cases such as a requested WhatsApp delivery channel that the plan cannot send, which is delivered via email instead.
Mark a chase as paid
/api/v1/chases/:id/paidFollow-ups
Send a follow-up
/api/v1/chases/:id/follow-up{
"tone": "friendly"
}Tones: friendly, due_today, overdue, firm
Rate limit: 10 follow-ups per hour.
Webhooks (Enterprise)
Connect PayChasers directly to your CRM or custom database. We fire real-time POST requests to your configured Listener URL whenever critical state changes occur within your account. Configure your URL and HMAC Secret in your dashboard Settings.
Available Events
chase.paid: Fired immediately when a chase is marked as PAID via the dashboard or API.chase.followup_sent: Fired when a follow-up message is sent for a chase.chases.bulk_completed: Fired when a bulk batch finishes processing. Payload includesbatchId,processedCount, andfailedCount.
Cryptographic Validation
To prevent spoofing, every webhook contains an X-PayChasers-Signature HTTP header. This is an HMAC SHA-256 signature generated using your private Webhook Secret and the raw stringified JSON body.
// Example: Express.js signature validation
const crypto = require('crypto');
app.post('/paychasers-webhook', express.json(), (req, res) => {
const signature = req.headers['x-paychasers-signature'];
const payload = JSON.stringify(req.body);
const secret = process.env.PAYCHASERS_WEBHOOK_SECRET;
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
if (signature !== expectedSignature) {
return res.status(401).send('Invalid signature');
}
// Handle the event
console.log('Received valid event:', req.body.event);
res.status(200).send('OK');
});Zapier Integration
Connect PayChasers to 8,000+ apps with Zapier. No code required.
Triggers
These fire automatically when something happens in PayChasers:
| Trigger | When it fires | Example use |
|---|---|---|
| New Chase Created | A chase is created (via dashboard or API) | Log new chases to a Google Sheet |
| Chase Marked as Paid | A chase status changes to PAID | Send a Slack message to your team |
| Follow-Up Sent | A follow-up email is sent | Track follow-up activity in Airtable |
| Chase Overdue | A chase passes its due date | Create a task in Todoist to call the client |
Actions
These let other apps create activity in PayChasers:
| Action | What it does | Example use |
|---|---|---|
| Create Chase | Creates a new payment chase | New Google Sheets row creates a chase |
| Create Client | Adds a new client | Typeform submission adds a client |
| Mark Chase as Paid | Marks a chase as paid | Stripe payment marks the chase as paid |
| Send Follow-Up | Sends a follow-up with a chosen tone | Scheduled Zap sends weekly firm reminders |
Real-World Integrations
Stripe: Auto-chase failed payments
When a Stripe payment fails, PayChasers automatically creates a chase for that customer and begins following up.
- 1. Trigger: Failed Payment in Stripe
- 2. Action: Create Chase in PayChasers (Set Auto-Chase: Yes, Type: Subscription)
Google Sheets: Tracker to Automated Chase
When you add a row to your financial spreadsheet, PayChasers reads it and instantly generates a chase.
- 1. Trigger: New Spreadsheet Row in Google Sheets
- 2. Action: Create Chase in PayChasers
Slack: Recovery Notifications
When an overdue client finally pays, your entire operations team gets notified instantly.
- 1. Trigger: Chase Marked as Paid in PayChasers
- 2. Action: Send Channel Message in Slack
Plan Limits
| Feature | Free | Pro | Pro+ | Enterprise |
|---|---|---|---|---|
| API access | Yes | Yes | Yes | Yes |
| Chase creation | Up to 5 | Unlimited | Unlimited | Unlimited |
| Delivery channel | Email only | Email only | Email, WhatsApp, or Both | Email, WhatsApp, or Both |
| Follow-up rate limit | 10/hour | 10/hour | 10/hour | 10/hour |
| Bulk endpoint | No | No | No | Yes |
Free users get full API access. Chase limits follow your plan. The same limits that apply in the dashboard apply via the API.
Security
- •API keys are hashed with SHA-256 before storage. We never store your raw key.
- •Every request is scoped to your account. You can only access your own clients and chases.
- •Keys can be revoked instantly from Settings. Integrations using a revoked key stop immediately.
- •All API key creation and revocation is logged in the audit trail.
- •Follow-up sending is rate limited to prevent abuse.
Error Handling
All errors return JSON with an error field:
{ "error": "Chase not found" }| Status Code | Meaning |
|---|---|
| 400 | Bad request (invalid data, chase already paid) |
| 401 | Invalid or missing API key |
| 403 | Plan limit reached, or feature not available on your plan (e.g. bulk endpoint) |
| 404 | Resource not found |
| 409 | Recipient has opted out of the delivery channel |
| 429 | Rate limit exceeded |
| 503 | Database temporarily unavailable |