Paws4Travels

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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Base 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, 500

Questions: hello@paws4travels.co.uk