Paws4Travels partner API
For kennels and catteries that already run their own booking system. Keep Paws4Travels in step with your own diary: push availability, prices and your own bookings, and receive Paws4Travels bookings the moment they're paid.
Authentication
The kennel creates an API key in their partner portal (Connect systems → API). Send it on every request. Keys are per kennel; revoke them in the portal at any time. Limit: 120 requests per minute.
Authorization: Bearer p4p_XXXXXXXX_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxBase URL: https://paws4travels.co.uk/api/v1/ — every path ends with a slash. Dates are YYYY-MM-DD; money is in pence (GBP). A stay from 20 to 27 December is 7 nights; the to date is collection day and is not a night.
Kennel
GET /api/v1/kennel/Bookings
Poll for changes with since (the updatedAt high-water mark), or use webhooks.
GET /api/v1/bookings/?since=2026-10-01T00:00:00Z
GET /api/v1/bookings/PW-7KQ2MD/
{
"ref": "PW-7KQ2MD", "status": "confirmed", "petType": "dog", "units": 1,
"pets": [{ "name": "Bella", "size": "medium", "breed": "Cocker spaniel", "age": "4" }],
"from": "2026-12-20", "to": "2026-12-27", "nights": 7,
"customer": { "name": "Sarah Jones", "email": "…", "phone": "…", "notes": null },
"totalPence": 20300, "kennelPence": 17864, "commissionPence": 2436,
"createdAt": "…", "paidAt": "…", "cancelledAt": null
}Statuses: confirmed, checked in, completed, cancelled. Bookings are paid in full — never charge the customer again.
Availability
Read what we'll sell, per night:
GET /api/v1/availability/?from=2026-12-01&to=2027-01-01
→ { "dogs": [{ "date": "2026-12-01", "capacity": 12, "used": 3, "free": 9, "closed": false }, …], "cats": […] }Set capacity per night (send null to go back to the usual capacity). Up to 400 days per call:
PUT /api/v1/availability/
{ "days": [ { "date": "2026-12-24", "dogs": 8, "cats": 4 }, { "date": "2026-12-25", "closed": true } ] }Your own bookings (outside Paws4Travels)
The simplest integration: push the spaces your own customers occupy and we never oversell. This is a full replace — anything you don't send is removed. units: 0 closes those nights completely.
PUT /api/v1/blocks/
{ "blocks": [ { "id": "your-booking-123", "from": "2026-12-20", "to": "2026-12-27", "petType": "dog", "units": 2 } ] }Prices
PUT /api/v1/rates/
{
"rates": [
{ "petType": "dog", "size": "small", "pencePerNight": 2400 },
{ "petType": "dog", "size": "medium", "pencePerNight": 2800 },
{ "petType": "dog", "size": "large", "pencePerNight": 3200 },
{ "petType": "cat", "pencePerNight": 1600 }
],
"seasons": [ { "name": "Christmas", "from": "2026-12-19", "to": "2027-01-03", "upliftPct": 25 } ],
"minNights": 2
}Webhooks
Set an https URL in the portal. We POST booking.created and booking.cancelled with the booking object above, and retry with back-off for about 8 hours if you don't answer 2xx.
POST https://your-system.example/paws4travels
X-P4P-Event: booking.created
X-P4P-Timestamp: 1791800000
X-P4P-Signature: sha256=<hex HMAC-SHA256 of "<timestamp>.<raw body>" with your signing secret>
{ "id": "a1b2c3d4e5f6a7b8", "event": "booking.created", "createdAt": "…", "data": { …booking… } }Verify every delivery, and reject timestamps more than 5 minutes old:
// Node.js
const expected = crypto.createHmac("sha256", SECRET).update(`${ts}.${rawBody}`).digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature.replace("sha256=", "")));Calendar feeds (no code)
Kennels without booking software can sync any calendar instead: a secret iCal link of their Paws4Travels bookings to subscribe to, and an iCal import whose events block availability. See Connect systems in the portal.
Errors
{ "error": { "code": "bad_range", "message": "from/to must be YYYY-MM-DD…" } } // 400, 401, 404, 429, 500Questions: hello@paws4travels.co.uk