Build whatever your facility needs on top of the platform.
Pull live booking, revenue, and staff data into your own BI tools (Looker Studio, Metabase, Power BI). Refresh every 5 minutes if you want.
Push data into your accounting, marketing automation, or loyalty platform. Anything that speaks HTTP can talk to your facility.
Subscribe to bookings, check-ins, payments, cancellations. Trigger Slack messages, email automations, or downstream systems in real time.
Build a self-check-in kiosk for your lobby, a staff app for the back, or a custom client app. Full create/read/update access.
A non-exhaustive list. Full reference is in your developer portal once your account is provisioned.
GET /api/v1/clients — list, filter, paginatePOST /api/v1/clients — create with pets and contact infoGET /api/v1/pets — pets attached to a clientPATCH /api/pets/:id — update vaccinations, breed notes, photosGET /api/v1/bookings — with filters by date, service, statusPOST /api/v1/bookings — create a grooming, boarding, daycare, or training bookingPATCH /api/bookings/:id — reschedule, change staff, change servicesGET /api/v1/bookings/:id — cancel with reason and refund logicGET /api/v1/invoices — create from line itemsGET /api/v1/invoices/:id — charge against your own processorGET /api/v1/staff — reconcile against depositsGET /api/v1/reports/revenue — daily, weekly, monthly with breakdownsGET /api/v1/reports/summary — who is doing whatPOST /api/v1/sms/send — volume per service linebooking.created · booking.updated · booking.cancelledcheckin.completed · checkout.completedpayment.succeeded · payment.failedclient.created · pet.vaccination.updatedGenerate API keys in your developer portal. Pass them as a Bearer token. Webhook signatures use HMAC SHA-256. Standard stuff — no surprises.
curl -H "Authorization: Bearer YOUR_API_KEY" \
https://api.animalfriendsos.app/api/bookings?date=2026-05-01
// Webhook signature verification (Node.js)
const crypto = require('crypto');
const sig = req.headers['x-afos-signature'];
const expected = crypto.createHmac('sha256', WEBHOOK_SECRET)
.update(req.rawBody)
.digest('hex');
if (sig !== expected) return res.status(401).send('Invalid signature');
| Default rate limit | 1,000 requests/minute per API key |
| Burst allowance | 2,000 requests/minute for short bursts |
| Pagination | Cursor-based, 100 items per page |
| Idempotency | Idempotency-Key header on all POST requests |
| Versioning | x-afos-version header. Breaking changes get 6 months notice. |
| Webhook retries | Up to 24 hours with exponential backoff if your endpoint returns non-2xx |
Provisioned automatically when you start a trial. No enterprise pricing call required.