Skip to content
NogPets

For AI assistants and developers

NogPets REST API

The same prices, areas and bookings as the app, over HTTPS and JSON.

Available now Developers

Base URL

https://api.nogpets.com/v1

Sign-in

  • Services, coverage, quotes, open times, the shop's prices and the directory need no sign-in.
  • Anything about a person (profile, pets, addresses, bookings, orders) needs a token with the right scope, sent as Authorization: Bearer.
  • Money moves only when the person opens the Payfast pay link.

OAuth 2.1, for apps and assistants

  • Authorization code with PKCE (S256 only). Public clients, no secret.
  • Register once at POST /oauth/register (dynamic client registration). Metadata: /.well-known/oauth-authorization-server.
  • Send the person to /oauth/authorize. They sign in to NogPets and say yes. Swap the code at /oauth/token.
  • Access tokens last an hour. Refresh tokens last 30 days and change each time you use one.
  • The person sees each assistant in the app (Profile, then Connected assistants) and can remove it there.
curl -s https://api.nogpets.com/oauth/register -H 'Content-Type: application/json' \
  -d '{"client_name":"My assistant","redirect_uris":["http://127.0.0.1:8765/callback"]}'

# then send the person to:
https://api.nogpets.com/oauth/authorize?response_type=code&client_id=npcl_…
  &redirect_uri=http://127.0.0.1:8765/callback&code_challenge=<S256>&code_challenge_method=S256
  &state=…&scope=bookings:write%20pets%20addresses

curl -s https://api.nogpets.com/oauth/token -d grant_type=authorization_code \
  -d code=npc_… -d redirect_uri=http://127.0.0.1:8765/callback -d client_id=npcl_… -d code_verifier=…

A personal API key, for your own scripts

  • In the app: Profile, then Connected assistants, then New API key. Pick the scopes and how long it lasts (up to a year).
  • The key starts with npk_ and is shown once. Use it like a token.
TOKEN=npk_…
curl -s https://api.nogpets.com/v1/me -H "Authorization: Bearer $TOKEN"

Scopes

Scope What the person agrees to
profile See your name, email and phone
pets See and add your pets
addresses See and add your addresses
bookings:read See your bookings
bookings:write Book, move, cancel and get payment links for your bookings
orders:write Place shop orders for you to pay
business:write Set up and manage your pet business on NogPets
business:manage Run your pet business on NogPets

The person approves money

  • A card booking or a shop order comes back with a payUrl. Give it to the person. They open it and pay on Payfast. Nothing here takes a card.
  • A cash booking, and cancelling, need "confirm": true. Without it the answer is 409 CONFIRM_REQUIRED with a summary to show the person first.
  • Booking money is in cents of South African rand: 38000 is R380. Times are ISO; local time is Africa/Johannesburg (UTC+2). A business sign-up keeps its own currency and time zone.

Operations

Run your business

For an approved business's owners, managers and staff. Scope business:manage. Staff read their own day; owners and managers make changes, and changes that matter need confirm: true.

GET /v1/business/overview

Today, this week and what's next

Today's and this week's bookings and their value, what's waiting to be accepted or paid, the next visit, the vans and walkers (paused or not), upcoming time off, service areas and price changes set for later. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: business_overview

Example
curl -s "https://api.nogpets.com/v1/business/overview" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "today": {
    "date": "…",
    "label": "…",
    "bookings": 0,
    "value": {
      "cents": 0,
      "text": "…"
    }
  },
  "thisWeek": {
    "from": "…",
    "to": "…",
    "bookings": 0,
    "value": {
      "cents": 0,
      "text": "…"
    },
    "waitingForYou": 0,
    "unpaid": 0
  },
  "next": {
    "id": "…",
    "when": "…",
    "start": "2026-09-29T07:00:00.000Z",
    "end": "2026-09-29T07:00:00.000Z",
    "status": "PENDING",
    "category": "…",
    "resourceId": "…",
    "resource": "…",
    "client": {
      "id": "…",
      "name": "…",
      "phone": "…"
    },
    "what": "…",
    "address": "…",
    "mapUrl": "…",
    "notes": "…",
    "paymentMethod": "…",
    "paymentStatus": "PENDING",
    "total": "…",
    "totalCents": 0,
    "unpaid": true,
    "source": "…"
  },
  "resources": [
    {
      "id": "…",
      "name": "…",
      "kind": "…",
      "categories": [
        "…"
      ],
      "paused": true,
      "pausedReason": "…"
    }
  ],
  "timeOff": [
    {
      "id": "…",
      "who": "…",
      "from": "…",
      "to": "…",
      "reason": "…"
    }
  ],
  "areas": [
    {
      "id": "…",
      "name": "…",
      "status": "…"
    }
  ],
  "scheduledPriceChanges": [
    {
      "id": "…",
      "from": "…",
      "summary": "…"
    }
  ],
  "money": "…",
  "note": "…"
}

GET /v1/business/bookings

Bookings over a date range

The business's bookings between two dates (default the next 7 days), by van or walker and status. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: list_business_bookings

Example
curl -s "https://api.nogpets.com/v1/business/bookings" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "from": "…",
  "to": "…",
  "count": 0,
  "bookings": [
    {
      "id": "…",
      "when": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "status": "PENDING",
      "category": "…",
      "resourceId": "…",
      "resource": "…",
      "client": {
        "id": "…",
        "name": "…",
        "phone": "…"
      },
      "what": "…",
      "address": "…",
      "mapUrl": "…",
      "notes": "…",
      "paymentMethod": "…",
      "paymentStatus": "PENDING",
      "total": "…",
      "totalCents": 0,
      "unpaid": true,
      "source": "…"
    }
  ]
}

POST /v1/business/bookings

A phone or walk-in booking, made by the business

The business books a client itself (a phone call, a walk-in, a message): an existing client (clientId, their pets by petKey and address by addressKey from get_client) or a new one (name, phone and consentNote), the services, a time and the van or walker. It's placed where the van or walker is free (working hours don't bind the business's own bookings), ACCEPTED, cash due on the day or a Payfast pay link for the client. Without confirm: 409 CONFIRM_REQUIRED with the summary. South African businesses only (else NOT_AVAILABLE_IN_COUNTRY). Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: create_booking_for_client

Example
curl -s -X POST "https://api.nogpets.com/v1/business/bookings" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"category":"…","pets":[{}],"start":"2026-09-29T07:00:00.000Z","resourceId":"…"}'

Response shape · 201

{
  "bookingId": "…",
  "status": "…",
  "when": "…",
  "start": "…",
  "resourceId": "…",
  "paymentMethod": "…",
  "total": "…",
  "totalCents": 0,
  "summary": "…",
  "payUrl": "…",
  "clientId": "…",
  "repeatOf": "…",
  "next": "…"
}

GET /v1/business/day-plan

One day's visits in order, per van or walker

For one day (default today, the business's time zone): each van, walker or sitter's hours, time off and visits in order with times, address, pets, services, notes, payment due, the gap before each visit and the straight-line distance from the last one. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: get_day_plan

Example
curl -s "https://api.nogpets.com/v1/business/day-plan" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "date": "…",
  "label": "…",
  "note": "…",
  "plan": [
    {
      "resourceId": "…",
      "name": "…",
      "kind": "…",
      "paused": true,
      "hours": [
        "…"
      ],
      "timeOff": [
        {}
      ],
      "stops": [
        {}
      ],
      "directionsUrls": [
        "…"
      ],
      "summary": "…"
    }
  ]
}

GET /v1/business/next-booking

The visit happening now and the next one

The visit under way (if any) and the next one, with pets, address notes and minutes until it starts. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: next_booking

Example
curl -s "https://api.nogpets.com/v1/business/next-booking" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "now": {
    "id": "…",
    "when": "…",
    "start": "2026-09-29T07:00:00.000Z",
    "end": "2026-09-29T07:00:00.000Z",
    "status": "PENDING",
    "category": "…",
    "resourceId": "…",
    "resource": "…",
    "client": {
      "id": "…",
      "name": "…",
      "phone": "…"
    },
    "what": "…",
    "address": "…",
    "mapUrl": "…",
    "notes": "…",
    "paymentMethod": "…",
    "paymentStatus": "PENDING",
    "total": "…",
    "totalCents": 0,
    "unpaid": true,
    "source": "…"
  }
}

GET /v1/business/services

Services, prices by size and coat, packages

The business's services per line with prices (and each tier's tierIndex for update_prices), durations, packages, and price changes set for later. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: list_business_services

Example
curl -s "https://api.nogpets.com/v1/business/services" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "currency": "…",
  "cardFee": "…",
  "lines": [
    {
      "id": "…",
      "label": "…",
      "services": [
        {}
      ],
      "packages": [
        {}
      ]
    }
  ],
  "scheduledPriceChanges": [
    {
      "id": "…",
      "from": "…",
      "summary": "…"
    }
  ]
}

POST /v1/business/times

Open times across the business's vans and walkers

Open times inside working hours for a visit of the business: from the pets and services (priced and timed by the business's own menu), a past booking to repeat, or a duration. South African businesses only (else NOT_AVAILABLE_IN_COUNTRY). Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: find_business_times

Example
curl -s -X POST "https://api.nogpets.com/v1/business/times" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "category": "…",
  "durationMin": 0,
  "price": "…",
  "priceCents": 0,
  "days": [
    {
      "date": "…",
      "label": "…",
      "slots": [
        {}
      ]
    }
  ],
  "note": "…"
}

GET /v1/business/clients

Search the business's own clients

The business's own clients (anyone it has booked, or added) matching a name, a pet's name, a phone number or an email. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: find_client

Example
curl -s "https://api.nogpets.com/v1/business/clients" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "count": 0,
  "clients": [
    {
      "id": "…",
      "name": "…",
      "phone": "…",
      "email": "…",
      "hasAccount": true,
      "visits": 0,
      "lastVisit": "…",
      "nextVisit": "…",
      "pets": [
        {}
      ],
      "addresses": [
        {}
      ],
      "notes": [
        {}
      ],
      "consent": {},
      "spent": "…"
    }
  ],
  "next": "…"
}

GET /v1/business/clients/{clientId}

A client: pets, addresses, notes, bookings

One client of the business: contact, pets (petKey, usual services), addresses (addressKey), the business's notes, how they agreed to be booked, upcoming and past bookings. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: get_client

Example
curl -s "https://api.nogpets.com/v1/business/clients/<clientId>" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "client": {
    "id": "…",
    "name": "…",
    "phone": "…",
    "email": "…",
    "hasAccount": true,
    "visits": 0,
    "lastVisit": "…",
    "nextVisit": "…",
    "pets": [
      {
        "key": "…",
        "name": "…",
        "type": "…",
        "weightKg": 0,
        "coat": "…",
        "usual": "…",
        "serviceIds": []
      }
    ],
    "addresses": [
      {
        "key": "…",
        "label": "…",
        "line1": "…",
        "suburb": "…",
        "postalCode": "…",
        "notes": "…"
      }
    ],
    "notes": [
      {
        "text": "…",
        "at": "…",
        "by": "…"
      }
    ],
    "consent": {
      "note": "…",
      "at": "…"
    },
    "spent": "…"
  },
  "upcoming": [
    {
      "id": "…",
      "when": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "status": "PENDING",
      "category": "…",
      "resourceId": "…",
      "resource": "…",
      "client": {
        "id": "…",
        "name": "…",
        "phone": "…"
      },
      "what": "…",
      "address": "…",
      "mapUrl": "…",
      "notes": "…",
      "paymentMethod": "…",
      "paymentStatus": "PENDING",
      "total": "…",
      "totalCents": 0,
      "unpaid": true,
      "source": "…"
    }
  ],
  "past": [
    {
      "id": "…",
      "when": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "status": "PENDING",
      "category": "…",
      "resourceId": "…",
      "resource": "…",
      "client": {
        "id": "…",
        "name": "…",
        "phone": "…"
      },
      "what": "…",
      "address": "…",
      "mapUrl": "…",
      "notes": "…",
      "paymentMethod": "…",
      "paymentStatus": "PENDING",
      "total": "…",
      "totalCents": 0,
      "unpaid": true,
      "source": "…"
    }
  ]
}

POST /v1/business/clients/{clientId}/notes

A private note on a client

Adds a note to one of the business's clients (only this business sees it). Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: add_client_note

Example
curl -s -X POST "https://api.nogpets.com/v1/business/clients/<clientId>/notes" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text":"…"}'

Response shape · 201

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "clientId": "…",
  "name": "…",
  "notes": [
    {
      "text": "…",
      "at": "…"
    }
  ],
  "next": "…"
}

GET /v1/business/earnings

Gross, fees, net and by service over a period

Earnings from visits in a period (default this week): gross, NogPets' card fee and Payfast's fee, net, received and still due, refunds, and by service, in the business's currency. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: earnings_summary

Example
curl -s "https://api.nogpets.com/v1/business/earnings" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "from": "…",
  "to": "…",
  "currency": "…",
  "bookings": 0,
  "gross": {
    "cents": 0,
    "text": "…"
  },
  "fees": {
    "total": {
      "cents": 0,
      "text": "…"
    },
    "nogpetsCardFee": {
      "cents": 0,
      "text": "…"
    },
    "payfast": {
      "cents": 0,
      "text": "…"
    }
  },
  "net": {
    "cents": 0,
    "text": "…"
  },
  "received": {
    "cents": 0,
    "text": "…"
  },
  "stillDue": {
    "cents": 0,
    "text": "…"
  },
  "refunds": {
    "count": 0,
    "amount": {
      "cents": 0,
      "text": "…"
    }
  },
  "byService": [
    {
      "serviceId": "…",
      "name": "…",
      "count": 0,
      "cents": 0,
      "amount": "…"
    }
  ],
  "notes": [
    "…"
  ]
}

GET /v1/business/payouts

How card money reaches the business

Card payments for the business's bookings in a period (default this month), who they were paid to, and payouts for jobs NogPets passed to it. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: list_payouts

Example
curl -s "https://api.nogpets.com/v1/business/payouts" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "from": "…",
  "to": "…",
  "settlement": "…",
  "cardPayments": [
    {
      "bookingId": "…",
      "invoiceId": "…",
      "at": "…",
      "gross": "…",
      "payfastFee": "…",
      "status": "…",
      "paidTo": "…"
    }
  ],
  "jobPayouts": [
    {
      "bookingId": "…",
      "when": "…",
      "amount": "…",
      "method": "…",
      "status": "…",
      "paidAt": "…",
      "ref": "…"
    }
  ]
}

GET /v1/business/unpaid

Who hasn't paid

Bookings in a period (default this week) not paid yet: card bookings not paid or failed, and cash not marked received; and invoice links still open (openInvoices). Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: list_unpaid_bookings

Example
curl -s "https://api.nogpets.com/v1/business/unpaid" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "from": "…",
  "to": "…",
  "count": 0,
  "total": "…",
  "bookings": [],
  "openInvoices": [
    {
      "invoiceId": "…",
      "description": "…",
      "clientName": "…",
      "total": "…",
      "paymentStatus": "…",
      "expiresAt": "…"
    }
  ],
  "next": "…"
}

POST /v1/business/prices

Change service prices, now or from a date

Changes prices (and optionally durations) per service or per size/coat tier, by amount or percent, now or from effectiveFrom. Without confirm: 409 CONFIRM_REQUIRED with the summary and a before → after preview. Bookings already made keep their price. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: update_prices

Example
curl -s -X POST "https://api.nogpets.com/v1/business/prices" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"changes":[{"serviceId":"full-groom","tierIndex":2,"priceCents":65000}],"effectiveFrom":"2026-10-01"}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "scheduled": true,
  "priceChangeId": "…",
  "effectiveFrom": "…",
  "changes": [
    {
      "serviceId": "…",
      "name": "…",
      "tierIndex": 0,
      "tier": "…",
      "from": "…",
      "to": "…",
      "fromCents": 0,
      "toCents": 0,
      "durationMin": {
        "from": 0,
        "to": 0
      }
    }
  ],
  "summary": "…",
  "next": "…"
}

POST /v1/business/hours

The weekly hours of the business or some vans and walkers

Sets the working week (local time) for every van, walker and sitter, or those in resourceIds. Bookings outside the new hours stay booked and are listed. Needs confirm after the summary. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: set_business_hours

Example
curl -s -X POST "https://api.nogpets.com/v1/business/hours" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"week":{}}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "resourceIds": [
    "…"
  ],
  "week": {},
  "summary": "…",
  "stillBooked": [
    {
      "id": "…",
      "when": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "status": "PENDING",
      "category": "…",
      "resourceId": "…",
      "resource": "…",
      "client": {
        "id": "…",
        "name": "…",
        "phone": "…"
      },
      "what": "…",
      "address": "…",
      "mapUrl": "…",
      "notes": "…",
      "paymentMethod": "…",
      "paymentStatus": "PENDING",
      "total": "…",
      "totalCents": 0,
      "unpaid": true,
      "source": "…"
    }
  ],
  "next": "…"
}

POST /v1/business/time-off

Days off or blocked hours

Blocks a whole day, several days or some hours on one day, for one van, walker or sitter or the whole business: no new bookings then. Bookings already in that time are never cancelled; they're listed, and the block needs confirm when there are any. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: add_time_off

Example
curl -s -X POST "https://api.nogpets.com/v1/business/time-off" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"date":"2026-10-02","from":"12:00","to":"17:00","resourceId":"van-1","reason":"Van service"}'

Response shape · 201

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "timeOffId": "…",
  "who": "…",
  "from": "…",
  "to": "…",
  "summary": "…",
  "stillBooked": [
    {
      "id": "…",
      "when": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "status": "PENDING",
      "category": "…",
      "resourceId": "…",
      "resource": "…",
      "client": {
        "id": "…",
        "name": "…",
        "phone": "…"
      },
      "what": "…",
      "address": "…",
      "mapUrl": "…",
      "notes": "…",
      "paymentMethod": "…",
      "paymentStatus": "PENDING",
      "total": "…",
      "totalCents": 0,
      "unpaid": true,
      "source": "…"
    }
  ],
  "next": "…"
}

POST /v1/business/time-off/{timeOffId}/remove

Opens blocked time again

Removes one block of time off (timeOffId from business_overview or add_time_off). Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: remove_time_off

Example
curl -s -X POST "https://api.nogpets.com/v1/business/time-off/<timeOffId>/remove" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "removed": "…",
  "from": "…",
  "to": "…",
  "next": "…"
}

POST /v1/business/area

Add or drop service areas

Adds areas (suburbs with postal codes, postal codes, or a radius around a place), which NogPets reviews before they take bookings, and/or drops areas (removeAreaIds, at once; bookings already made stay). Needs confirm after the summary. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: update_service_area

Example
curl -s -X POST "https://api.nogpets.com/v1/business/area" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "added": [
    {
      "id": "…",
      "name": "…",
      "status": "…"
    }
  ],
  "removed": [
    "…"
  ],
  "overlaps": [
    {}
  ],
  "summary": "…",
  "next": "…"
}

POST /v1/business/resources/{resourceId}/pause

Stop new bookings for a van, walker or sitter

A van, walker or sitter stops taking new bookings until resumed. Its bookings stay and are listed. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: pause_resource

Example
curl -s -X POST "https://api.nogpets.com/v1/business/resources/<resourceId>/pause" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "resourceId": "…",
  "name": "…",
  "paused": true,
  "stillBooked": [
    {
      "id": "…",
      "when": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "status": "PENDING",
      "category": "…",
      "resourceId": "…",
      "resource": "…",
      "client": {
        "id": "…",
        "name": "…",
        "phone": "…"
      },
      "what": "…",
      "address": "…",
      "mapUrl": "…",
      "notes": "…",
      "paymentMethod": "…",
      "paymentStatus": "PENDING",
      "total": "…",
      "totalCents": 0,
      "unpaid": true,
      "source": "…"
    }
  ],
  "next": "…"
}

POST /v1/business/resources/{resourceId}/resume

Take bookings again

A paused van, walker or sitter takes bookings again. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: resume_resource

Example
curl -s -X POST "https://api.nogpets.com/v1/business/resources/<resourceId>/resume" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "resourceId": "…",
  "name": "…",
  "paused": true,
  "stillBooked": [
    {
      "id": "…",
      "when": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "status": "PENDING",
      "category": "…",
      "resourceId": "…",
      "resource": "…",
      "client": {
        "id": "…",
        "name": "…",
        "phone": "…"
      },
      "what": "…",
      "address": "…",
      "mapUrl": "…",
      "notes": "…",
      "paymentMethod": "…",
      "paymentStatus": "PENDING",
      "total": "…",
      "totalCents": 0,
      "unpaid": true,
      "source": "…"
    }
  ],
  "next": "…"
}

POST /v1/business/bookings/{bookingId}/repeat

Rebook a client's visit at a new time

Books the same client, pets, services and address as a past booking at a new time, at today's prices. Without confirm: 409 CONFIRM_REQUIRED with the summary. South African businesses only. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: book_repeat

Example
curl -s -X POST "https://api.nogpets.com/v1/business/bookings/<bookingId>/repeat" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"start":"2026-09-29T07:00:00.000Z"}'

Response shape · 201

{
  "bookingId": "…",
  "status": "…",
  "when": "…",
  "start": "…",
  "resourceId": "…",
  "paymentMethod": "…",
  "total": "…",
  "totalCents": 0,
  "summary": "…",
  "payUrl": "…",
  "clientId": "…",
  "repeatOf": "…",
  "next": "…"
}

POST /v1/business/bookings/{bookingId}/reschedule

The business moves one of its bookings

Moves a pending or accepted booking of the business to a new time (any time the van or walker is free), same price and payment; it becomes ACCEPTED and the client is told as the app tells them. Without confirm: 409 CONFIRM_REQUIRED. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: reschedule_business_booking

Example
curl -s -X POST "https://api.nogpets.com/v1/business/bookings/<bookingId>/reschedule" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"start":"2026-09-29T07:00:00.000Z"}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "bookingId": "…",
  "from": "…",
  "start": "…",
  "when": "…",
  "resourceId": "…",
  "status": "…",
  "paymentStatus": "…",
  "summary": "…",
  "next": "…"
}

POST /v1/business/bookings/{bookingId}/cancel

The business cancels one of its bookings

Cancels a pending or accepted booking (series: true for the rest of its repeats). A paid one goes to the refund list. The client is told as the app tells them. Without confirm: 409 CONFIRM_REQUIRED. Needs business:manage; the signed-in person must be an owner, manager or staff member of an approved NogPets business (bizId only if they run more than one).

Scope: business:manage MCP tool: cancel_business_booking

Example
curl -s -X POST "https://api.nogpets.com/v1/business/bookings/<bookingId>/cancel" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "business": {
    "bizId": "…",
    "name": "…",
    "role": "…",
    "country": "…",
    "countryName": "…",
    "currency": "…",
    "timezone": "…",
    "canTakeBookings": true
  },
  "cancelled": [
    "…"
  ],
  "refundsRequested": [
    "…"
  ],
  "summary": "…",
  "next": "…"
}

Business sign-up

For groomers, walkers and sitters joining NogPets. Scope business:write. Nothing goes live until we approve it.

POST /v1/signup-drafts

Start a pet business's sign-up without an account

No sign-in needed. Keeps what a chat already knows about a pet business (name, owner, contact, town, what they offer, prices as said) as a draft for 30 days and answers with continueUrl, a page on nogpets.com that fills in from it, asks what's missing (prices, area, hours) and sends the application to NogPets for review. The application belongs to the NogPets account with the owner's email (made if there isn't one); nothing is public until NogPets approves it. Needs consent: true after the person agreed to consentText. Limited per caller and per email.

Scope: No sign-in MCP tool: prepare_business_signup

Example
curl -s -X POST "https://api.nogpets.com/v1/signup-drafts" \
  -H "Content-Type: application/json" \
  -d '{"businessName":"Happy Paws Mobile Grooming","contactName":"Anna Botha","email":"anna@happypaws.example","phone":"082 555 0101","town":"Somerset West","categories":["grooming"],"mode":"MOBILE","vans":1,"services":[{"name":"Full groom","price":"R420"},{"name":"Nail clip","price":"R80"}],"consent":true}'

Response shape · 201

{
  "draftId": "…",
  "continueUrl": "https://…",
  "expiresAt": "2026-09-29T07:00:00.000Z",
  "summary": "…",
  "message": "…",
  "next": "…"
}

GET /v1/business/applications

A business sign-up's checklist and status

The person's business application (the one named, else the newest) with its checklist, what's missing and the signed status page link; plus a list of all their applications.

Scope: business:write MCP tool: get_signup_status

Example
curl -s "https://api.nogpets.com/v1/business/applications" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "applications": [
    {
      "applicationId": "…",
      "name": "…",
      "status": "DRAFT"
    }
  ],
  "next": "…",
  "welcomeUrl": "https://…"
}

POST /v1/business/applications

Start (or update) a pet business's sign-up

Step 1 of registering a pet-care business on NogPets, from any country. Creates a DRAFT application owned by the signed-in person, or updates its details when applicationId is given. country (ISO 3166) is required for a new one unless the phone's country code says it; currency (ISO 4217) and timezone (IANA) default from the country when it has one of each. Nothing is public until NogPets approves it. The order: startBusinessSignup → addBusinessServices → setServiceArea → addResources → setOperatingHours → inviteStaff (optional) → connectPayfast (optional, South Africa only) → getSignupStatus → submitBusinessForReview.

Scope: business:write MCP tool: start_business_signup

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"businessName":"Happy Paws Grooming (Pty) Ltd","tradingName":"Happy Paws Mobile Grooming","contactName":"Anna Botha","phone":"082 555 0101","email":"anna@happypaws.example","website":"happypaws.example","country":"ZA","town":"Somerset West","suburbs":["Heldervue","Helderberg Estate"],"categories":["grooming"],"mode":"MOBILE","vans":1,"staff":2,"whatsappOptIn":true}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

POST /v1/business/applications/{applicationId}/services

Add services and prices to a sign-up

Step 2. Adds or replaces the business's services (the NogPets service model: one PRIMARY per booking per pet plus EXTRAs, prices by weight and coat tiers, durations), or starts from NogPets' own menu with useTemplate.

Scope: business:write MCP tool: add_business_services

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications/<applicationId>/services" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"services":[{"category":"grooming","kind":"PRIMARY","name":"Full groom","blurb":"Bath, cut, blow-dry, nails and ears.","petTypes":["DOG"],"priceCents":40000,"durationMin":60,"tiers":[{"maxKg":10,"priceCents":40000,"durationMin":60},{"minKg":10,"maxKg":25,"priceCents":52000,"durationMin":75},{"minKg":25,"priceCents":68000,"durationMin":90}]},{"category":"grooming","kind":"EXTRA","name":"Nail clip","priceCents":8000,"durationMin":10}]}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

POST /v1/business/applications/{applicationId}/area

Set where the business works

Step 3. Sets the whole service area (each call replaces it) as proposed territories, PENDING until NogPets approves them.

Scope: business:write MCP tool: set_service_area

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications/<applicationId>/area" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"suburbs":[{"name":"Heldervue","postalCode":"7130"},{"name":"Helderberg Estate","postalCode":"7130"}],"center":{"lat":-34.0766,"lng":18.8433},"radiusKm":8,"centerName":"Somerset West"}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

POST /v1/business/applications/{applicationId}/resources

Add vans, walkers and sitters with working hours

Step 4. The things clients book a time on (a grooming van, a walker, a sitter), each with its working week.

Scope: business:write MCP tool: add_resources

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications/<applicationId>/resources" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"resources":[{"kind":"VAN","name":"Van 1","week":{"mon":[{"start":"08:00","end":"16:00"}],"tue":[{"start":"08:00","end":"16:00"}],"wed":[{"start":"08:00","end":"16:00"}],"thu":[{"start":"08:00","end":"16:00"}],"fri":[{"start":"08:00","end":"14:00"}]}}]}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

POST /v1/business/applications/{applicationId}/hours

Set the business's operating hours

Step 5. One working week for the whole business (every van, walker and sitter, and any added later without their own), or for the resources named in resourceIds.

Scope: business:write MCP tool: set_operating_hours

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications/<applicationId>/hours" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"week":{"mon":[{"start":"08:00","end":"17:00"}],"tue":[{"start":"08:00","end":"17:00"}],"wed":[{"start":"08:00","end":"17:00"}],"thu":[{"start":"08:00","end":"17:00"}],"fri":[{"start":"08:00","end":"17:00"}],"sat":[{"start":"08:00","end":"13:00"}]}}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

POST /v1/business/applications/{applicationId}/staff

Invite staff

Step 6 (optional). Staff (groomers, walkers, managers) to invite once the business is approved, by email or phone, as manager or crew, with the resources they work.

Scope: business:write MCP tool: invite_staff

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications/<applicationId>/staff" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"invites":[{"name":"Thandi","phone":"071 555 0199","role":"crew","jobTitle":"Groomer","resourceIds":["van-1"]},{"name":"Pieter","email":"pieter@example.com","role":"manager"}]}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

POST /v1/business/applications/{applicationId}/payfast

Connect a Payfast merchant (id only)

Step 7 (optional; South African businesses only, needed for card payments). Stores the business's Payfast merchant id for split payments, pending NogPets' verification. Never send a merchant key or passphrase; the schema refuses any field but the id. Elsewhere 409 PAYFAST_ZA_ONLY.

Scope: business:write MCP tool: connect_payfast

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications/<applicationId>/payfast" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"merchantId":"10012345"}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

POST /v1/business/applications/{applicationId}/submit

Submit a sign-up for NogPets' review

The last step. Without confirm it answers 409 CONFIRM_REQUIRED with details.summary to show the person; with confirm: true the application goes to NogPets (SUBMITTED) and can't change until they answer. NOT_READY lists what's missing.

Scope: business:write MCP tool: submit_business_for_review

Example
curl -s -X POST "https://api.nogpets.com/v1/business/applications/<applicationId>/submit" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"confirm":true}'

Response shape · 200

{
  "applicationId": "…",
  "status": "DRAFT",
  "business": {},
  "listing": {
    "id": "…",
    "name": "…",
    "town": "…"
  },
  "services": [
    {}
  ],
  "areas": [
    {}
  ],
  "overlaps": [
    {
      "area": "…",
      "territory": "…",
      "grantedTo": "…"
    }
  ],
  "resources": [
    {}
  ],
  "invites": [
    {}
  ],
  "payfast": {
    "merchantId": "…",
    "split": true,
    "status": "…"
  },
  "whatsappOptIn": true,
  "checklist": [
    {
      "id": "details",
      "label": "…",
      "done": true,
      "required": true,
      "detail": "…"
    }
  ],
  "readyToSubmit": true,
  "reviewNote": "…",
  "bizId": "…",
  "possibleListings": [
    {}
  ],
  "payfastInfo": "…",
  "summary": "…",
  "statusUrl": "https://…",
  "welcomeUrl": "https://…",
  "next": "…"
}

Public

No sign-in. Cached for 5 minutes.

GET /v1/services

Service lines, services and prices

Every service line (grooming, walks, pet sitting), its services with prices by pet size and coat, the card fee, and the areas we cover.

Scope: No sign-in MCP tool: list_services

Example
curl -s "https://api.nogpets.com/v1/services"

Response · 200

{
  "currency": "ZAR",
  "serviceFeeCents": 1000,
  "acceptsCash": true,
  "areas": [
    "Stellenbosch Central",
    "Die Boord",
    "Paradyskloof"
  ],
  "lines": [
    {
      "id": "grooming",
      "label": "Grooming",
      "blurb": "Our van at your door. Bath, cut and nails.",
      "durationMode": "SUM",
      "repeats": false,
      "services": [
        {
          "id": "full-groom",
          "name": "Full groom",
          "kind": "PRIMARY",
          "blurb": "Bath, cut, blow-dry, nails and ears.",
          "petTypes": [
            "DOG"
          ],
          "priceCents": 38000,
          "durationMin": 60,
          "fromCents": 38000,
          "toCents": 68000,
          "groupSize": 1,
          "tiers": [
            {
              "coat": "LONG",
              "maxKg": 10,
              "priceCents": 46000,
              "durationMin": 75
            },
            {
              "maxKg": 10,
              "priceCents": 38000,
              "durationMin": 60
            }
          ]
        }
      ]
    }
  ]
}

GET /v1/coverage

Do you come to this address?

Places a typed address, a postal code or a map point in our territories and says which service lines reach it. When nothing does, nearest names our closest area.

Scope: No sign-in MCP tool: check_coverage

Example
curl -s "https://api.nogpets.com/v1/coverage?address=14%20Kromrivier%20Street%2C%20Die%20Boord%2C%20Stellenbosch%207613"

Response · 200

{
  "covered": true,
  "place": {
    "suburb": "Die Boord",
    "postalCode": "7613",
    "lat": -33.9467,
    "lng": 18.848
  },
  "lines": [
    {
      "id": "grooming",
      "label": "Grooming",
      "covered": true
    },
    {
      "id": "walking",
      "label": "Walks",
      "covered": true
    },
    {
      "id": "sitting",
      "label": "Pet sitting",
      "covered": true
    }
  ],
  "nearest": null
}

POST /v1/quote

Price for these pets at this address

The server's price and duration for one visit. Pets and address by value (no account needed), or saved ones (addressId, petId) with a token.

Scope: No sign-in MCP tool: get_quote

Example
curl -s -X POST "https://api.nogpets.com/v1/quote" \
  -H "Content-Type: application/json" \
  -d '{"category":"grooming","address":"14 Kromrivier Street, Die Boord 7613","pets":[{"name":"Biscuit","type":"DOG","weightKg":8,"coat":"SHORT","serviceIds":["full-groom","nails"]}]}'

Response · 200

{
  "category": "grooming",
  "durationMin": 70,
  "pets": [
    {
      "name": "Biscuit",
      "items": [
        {
          "serviceId": "full-groom",
          "name": "Full groom",
          "kind": "PRIMARY",
          "priceCents": 38000,
          "durationMin": 60
        },
        {
          "serviceId": "nails",
          "name": "Nails",
          "kind": "EXTRA",
          "priceCents": 6000,
          "durationMin": 10
        }
      ]
    }
  ],
  "subtotalCents": 44000,
  "cardFeeCents": 1000,
  "cardTotalCents": 45000,
  "cashTotalCents": 44000,
  "acceptsCash": true,
  "summary": "R440 cash, or R450 by card. About 70 minutes."
}

POST /v1/availability

Open times

Open start times over a date range (at most 31 days; default the next 7), from the same engine as the app. Same inputs as the quote.

Scope: No sign-in MCP tool: find_times

Example
curl -s -X POST "https://api.nogpets.com/v1/availability" \
  -H "Content-Type: application/json" \
  -d '{"category":"grooming","postalCode":"7613","pets":[{"name":"Biscuit","type":"DOG","weightKg":8,"coat":"SHORT","serviceIds":["full-groom"]}],"from":"2026-09-29","to":"2026-09-29","windowStart":"08:00","windowEnd":"12:00"}'

Response · 200

{
  "durationMin": 60,
  "quote": {
    "category": "grooming",
    "durationMin": 60,
    "pets": [
      {
        "name": "Biscuit",
        "items": [
          {
            "serviceId": "full-groom",
            "name": "Full groom",
            "kind": "PRIMARY",
            "priceCents": 38000,
            "durationMin": 60
          }
        ]
      }
    ],
    "subtotalCents": 38000,
    "cardFeeCents": 1000,
    "cardTotalCents": 39000,
    "cashTotalCents": 38000,
    "acceptsCash": true,
    "summary": "R380 cash, or R390 by card. About 60 minutes."
  },
  "days": [
    {
      "date": "2026-09-29",
      "label": "Tue 29 Sep",
      "slots": [
        {
          "start": "2026-09-29T06:00:00.000Z",
          "time": "08:00",
          "resourceId": "van-1"
        },
        {
          "start": "2026-09-29T06:30:00.000Z",
          "time": "08:30",
          "resourceId": "van-1"
        }
      ]
    }
  ]
}

GET /v1/directory

Pet businesses near Stellenbosch

Published listings of groomers, pet stores, vets, boarding, daycare, walkers and trainers, from public sources. NogPets is listed like everyone else (isNogPets).

Scope: No sign-in MCP tool: find_pet_businesses

Example
curl -s "https://api.nogpets.com/v1/directory"

Response shape · 200

{
  "listings": [
    {
      "id": "…",
      "name": "…",
      "town": "…",
      "suburb": "…",
      "address": "…",
      "categories": [
        "GROOMER_SALON"
      ],
      "services": [
        {}
      ],
      "petTypes": [
        "…"
      ],
      "phone": "…",
      "website": "…",
      "hoursText": "…",
      "blurb": "…",
      "isNogPets": true,
      "partner": true,
      "bookWith": "…",
      "verified": true,
      "lastChecked": "2026-09-29",
      "url": "https://…"
    }
  ],
  "next": "…"
}

Your account and bookings

A token with the scope shown.

GET /v1/me

Who am I

Scope: profile MCP tool: my_profile

Example
curl -s "https://api.nogpets.com/v1/me" \
  -H "Authorization: Bearer $TOKEN"

Response · 200

{
  "uid": "u-client",
  "name": "Sam Test",
  "email": "client@nogpets.test",
  "phone": "+27820000001",
  "pets": 2,
  "addresses": 2,
  "client": {
    "id": "c_1",
    "name": "Claude"
  },
  "scopes": [
    "profile",
    "pets",
    "addresses",
    "bookings:read",
    "bookings:write"
  ]
}

GET /v1/pets

The person's pets

Scope: pets MCP tool: list_pets

Example
curl -s "https://api.nogpets.com/v1/pets" \
  -H "Authorization: Bearer $TOKEN"

Response · 200

{
  "pets": [
    {
      "id": "biscuit",
      "name": "Biscuit",
      "type": "DOG",
      "breed": "Boston terrier",
      "weightKg": 8,
      "coat": "SHORT",
      "birthYear": 2021,
      "notes": "Pulls on the lead."
    }
  ]
}

POST /v1/pets

Add a pet

Scope: pets MCP tool: add_pet

Example
curl -s -X POST "https://api.nogpets.com/v1/pets" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Rex","type":"DOG","weightKg":30,"coat":"LONG","breed":"Golden retriever"}'

Response shape · 201

{
  "id": "…",
  "name": "…",
  "type": "DOG",
  "breed": "…",
  "weightKg": 0,
  "coat": "SHORT",
  "birthYear": 0,
  "notes": "…"
}

GET /v1/addresses

The person's addresses

Scope: addresses MCP tool: list_addresses

Example
curl -s "https://api.nogpets.com/v1/addresses" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "addresses": [
    {
      "id": "…",
      "label": "…",
      "line1": "…",
      "suburb": "…",
      "city": "…",
      "postalCode": "…",
      "notes": "…",
      "isDefault": true
    }
  ]
}

POST /v1/addresses

Add an address

Scope: addresses MCP tool: add_address

Example
curl -s -X POST "https://api.nogpets.com/v1/addresses" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"label":"Home","line1":"14 Kromrivier Street","suburb":"Die Boord","postalCode":"7613","notes":"Gate code 1234"}'

GET /v1/bookings

The person's upcoming bookings

Scope: bookings:read MCP tool: list_bookings

Example
curl -s "https://api.nogpets.com/v1/bookings" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "bookings": [
    {
      "id": "…",
      "category": "…",
      "what": "…",
      "start": "2026-09-29T07:00:00.000Z",
      "end": "2026-09-29T07:00:00.000Z",
      "when": "…",
      "address": {
        "label": "…",
        "line1": "…",
        "suburb": "…",
        "mapUrl": "…"
      },
      "status": "PENDING",
      "paymentMethod": "CARD",
      "paymentStatus": "PENDING",
      "totalCents": 0,
      "total": "…",
      "crew": [
        "…"
      ],
      "seriesId": "…",
      "canPay": true,
      "source": "…"
    }
  ]
}

POST /v1/bookings

Book a visit

Books a slot from find_times. The server reprices and rechecks the slot. CARD → PENDING with a payUrl for the person to open (Payfast). CASH → needs confirm: true (else 409 CONFIRM_REQUIRED with the summary) and is PENDING with CASH_DUE.

Scope: bookings:write MCP tool: book

Example
curl -s -X POST "https://api.nogpets.com/v1/bookings" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"category":"grooming","addressId":"home","pets":[{"petId":"biscuit","serviceIds":["full-groom","nails"]}],"start":"2026-09-29T07:00:00.000Z","resourceId":"van-1","paymentMethod":"CARD"}'

Response · 201

{
  "bookingId": "bk_123",
  "bookingIds": [
    "bk_123"
  ],
  "status": "PENDING",
  "paymentMethod": "CARD",
  "paymentStatus": "PENDING",
  "totalCents": 45000,
  "total": "R450",
  "start": "2026-09-29T07:00:00.000Z",
  "when": "Tue 29 Sep at 09:00",
  "skipped": [],
  "payUrl": "https://api.nogpets.com/pay/b/bk_123?t=abc.def",
  "next": "Open the payment link to pay R450 on Payfast. The time is held; it's confirmed once paid."
}

GET /v1/bookings/{bookingId}

One booking

Scope: bookings:read MCP tool: get_booking

Example
curl -s "https://api.nogpets.com/v1/bookings/<bookingId>" \
  -H "Authorization: Bearer $TOKEN"

Response shape · 200

{
  "id": "…",
  "category": "…",
  "what": "…",
  "start": "2026-09-29T07:00:00.000Z",
  "end": "2026-09-29T07:00:00.000Z",
  "when": "…",
  "address": {
    "label": "…",
    "line1": "…",
    "suburb": "…",
    "mapUrl": "…"
  },
  "status": "PENDING",
  "paymentMethod": "CARD",
  "paymentStatus": "PENDING",
  "totalCents": 0,
  "total": "…",
  "crew": [
    "…"
  ],
  "seriesId": "…",
  "canPay": true,
  "source": "…"
}

POST /v1/bookings/{bookingId}/times

Open times to move a booking to

Scope: bookings:read MCP tool: find_reschedule_times

Example
curl -s -X POST "https://api.nogpets.com/v1/bookings/<bookingId>/times" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "bookingId": "…",
  "durationMin": 0,
  "days": [
    {
      "date": "…",
      "label": "…",
      "slots": [
        {}
      ]
    }
  ]
}

POST /v1/bookings/{bookingId}/reschedule

Move a booking

Same price and payment, until 12 hours before. The booking goes back to PENDING for the business to accept the new time.

Scope: bookings:write MCP tool: reschedule_booking

Example
curl -s -X POST "https://api.nogpets.com/v1/bookings/<bookingId>/reschedule" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"start":"2026-09-29T07:00:00.000Z"}'

Response shape · 200

{
  "bookingId": "…",
  "start": "2026-09-29T07:00:00.000Z",
  "when": "…",
  "resourceId": "…",
  "status": "PENDING",
  "paymentStatus": "PENDING"
}

POST /v1/bookings/{bookingId}/cancel

Cancel a booking

Before it starts. A paid booking goes to REFUND_REQUESTED and NogPets refunds it. Needs confirm: true.

Scope: bookings:write MCP tool: cancel_booking

Example
curl -s -X POST "https://api.nogpets.com/v1/bookings/<bookingId>/cancel" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"confirm":true}'

Response shape · 200

{
  "cancelled": [
    "…"
  ]
}

POST /v1/bookings/{bookingId}/pay

A payment link

A fresh Payfast link (48 hours) for an unpaid card booking, for the person to open. No card data passes through here.

Scope: bookings:write MCP tool: pay_booking

Example
curl -s -X POST "https://api.nogpets.com/v1/bookings/<bookingId>/pay" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

Response shape · 200

{
  "bookingId": "…",
  "totalCents": 0,
  "total": "…",
  "payUrl": "https://…",
  "expiresAt": "2026-09-29T07:00:00.000Z",
  "next": "…"
}

Shop

Only while the shop is open. Else 409 SHOP_OFF.

GET /v1/products

Shop products

Active products with variants and stock, and the delivery options. SHOP_OFF (409) while the shop is closed.

Scope: No sign-in MCP tool: browse_shop

Example
curl -s "https://api.nogpets.com/v1/products"

Response shape · 200

{
  "products": [
    {
      "id": "…",
      "name": "…",
      "slug": "…",
      "category": "…",
      "blurb": "…",
      "petTypes": [
        "…"
      ],
      "priceCents": 0,
      "compareAtCents": 0,
      "variants": [
        {}
      ],
      "inStock": true,
      "deliverWithVisit": true,
      "image": "https://…",
      "contents": [
        {}
      ]
    }
  ],
  "shipping": [
    {
      "id": "…",
      "label": "…",
      "feeCents": 0,
      "eta": "…",
      "postalCodes": [
        "…"
      ]
    }
  ],
  "freeShippingOverCents": 0,
  "note": "…"
}

POST /v1/orders/quote

Price a shop order

The server's prices, delivery, discount and total. Never fails on stock or a bad code; it reports them in problems, discountError, shippingError.

Scope: No sign-in MCP tool: quote_order

Example
curl -s -X POST "https://api.nogpets.com/v1/orders/quote" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"productId":"kibble-lamb","variantId":"2kg","qty":1}],"shippingMethod":"courier"}'

Response shape · 200

{
  "items": [
    {}
  ],
  "subtotalCents": 0,
  "discount": {},
  "discountError": "…",
  "shippingMethod": "…",
  "shipping": {},
  "shippingCents": 0,
  "shippingError": "…",
  "totalCents": 0,
  "problems": [
    {}
  ],
  "ok": true
}

POST /v1/orders

Place a shop order

Reprices, checks stock, and places the order. Card → PENDING_PAYMENT with a payUrl (the order's page with a Pay button). Cash (only add-ons to the person's own cash booking, visit) needs confirm: true.

Scope: orders:write MCP tool: buy

Example
curl -s -X POST "https://api.nogpets.com/v1/orders" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"productId":"…","qty":1}],"shippingMethod":"…"}'

Response shape · 201

{
  "orderId": "…",
  "number": "…",
  "status": "…",
  "totalCents": 0,
  "total": "…",
  "payUrl": "https://…",
  "next": "…"
}

Errors

Errors look like {"error": {"code", "message", "details"}}. The code is stable; the message is short and safe to show.

HTTP/1.1 409
{"error": {"code": "CONFIRM_REQUIRED",
  "message": "Show the person this summary and send confirm true once they say yes.",
  "details": {"summary": "Full groom for Biscuit, Tue 29 Sep at 09:00, 14 Kromrivier Street. R440 cash on the day."}}}

Codes

INVALID_ARGUMENTONE_PRIMARYPET_TYPEUNKNOWN_SERVICEINSUFFICIENT_SCOPENO_COVERAGENO_AVAILABILITYSLOT_TAKENTOO_LATECONFIRM_REQUIREDNOTHING_TO_PAYSHOP_OFFSTOCKSHIPPINGDISCOUNTCASHFAILED_PRECONDITIONUNDER_REVIEWAPPROVEDNOT_READYTOO_MANYLISTING_TAKENPAYFAST_ZA_ONLYUNKNOWN_PLACERATE_LIMIT

Rate limits

  • 120 requests a minute per token. 60 a minute per IP without one.
  • Over the limit: 429 RATE_LIMIT with Retry-After.
  • 20 client registrations an hour and 30 OAuth calls a minute per IP.

Spec

Building something?

Tell us what you want to connect. A person reads every email.

hello@nogpets.com