---
title: "A phone or walk-in booking, made by the business"
method: POST
path: "/v1/business/bookings"
tags: ["Run"]
---

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

`POST /v1/business/bookings`

## Request

- Base URL: `https://api.nogpets.com`
- URL: `https://api.nogpets.com/v1/business/bookings`
- Auth: one of:
  - OAuth 2 (authorization code, authorization URL `https://api.nogpets.com/oauth/authorize`, token URL `https://api.nogpets.com/oauth/token`, scopes: `business:manage`)
  - HTTP bearer

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).

## Request body

- BizVisitRequest
  - `bizId` string
  - `clientId` string: An existing client (find_client).
  - `client` object
    - `name` string, required
    - `phone` string, required
    - `email` string
  - `consentNote` string: New client: how they agreed to be booked and to their details being kept, in the person's words.
  - `category` string, required: A service line id: grooming, walking or sitting.
  - `pets` object[], required
    - `petKey` string: A known pet of the client (get_client).
    - `name` string: A new pet's name.
    - `type` 'DOG' | 'CAT'
    - `weightKg` number
    - `coat` 'SHORT' | 'MEDIUM' | 'LONG'
    - `serviceIds` string[]: Service ids from list_services; exactly one PRIMARY plus any EXTRAs of the same line. A package id (a line's `packages`) stands for its main service and extras.
  - `addressKey` string: One of the client's addresses (get_client).
  - `address` object
    - `label` string
    - `line1` string, required
    - `suburb` string
    - `postalCode` string
    - `notes` string: Gate code, parking.
    - `lat` number
    - `lng` number
  - `start` string, date-time, required: From find_business_times (ISO).
  - `resourceId` string, required
  - `paymentMethod` 'CASH' | 'CARD': CASH on the day, or CARD: a Payfast link for the client.
  - `notes` string
  - `confirm` boolean: true only after the person saw the summary from the first call and said yes.

## Response `201`

OK

- BizVisitResult
  - `bookingId` string, required
  - `status` string
  - `when` string
  - `start` string
  - `resourceId` string
  - `paymentMethod` string
  - `total` string
  - `totalCents` integer
  - `summary` string
  - `payUrl` string, nullable: CARD: the client's Payfast link (48 hours).
  - `clientId` string
  - `repeatOf` string
  - `next` string

## Other responses

- `400`: The input is wrong (`INVALID_ARGUMENT`, or a pricing code such as `ONE_PRIMARY`, `PET_TYPE`, `UNKNOWN_SERVICE`).
- `401`: No token, or it's expired or revoked. The `WWW-Authenticate` header points at the resource metadata.
- `403`: The token lacks a scope (`INSUFFICIENT_SCOPE`, with `details.scope`).
- `404`: Not found, or not the person's.
- `409`: A rule said no: `NO_COVERAGE`, `NO_AVAILABILITY`, `SLOT_TAKEN`, `TOO_LATE`, `CONFIRM_REQUIRED` (with `details.summary`), `NOTHING_TO_PAY`, `SHOP_OFF`, `STOCK`, `SHIPPING`, `DISCOUNT`, `CASH`, `FAILED_PRECONDITION`; business sign-up: `UNDER_REVIEW`, `APPROVED`, `NOT_READY`, `TOO_MANY`, `LISTING_TAKEN`, `PAYFAST_ZA_ONLY`. `NO_COVERAGE` carries `details.leadId`, `details.message` (tell the person) and `details.next`.

---

[API](https://skmtc.dev/nogpets/apis/nogpets-api.md) · [All operations](https://skmtc.dev/nogpets/apis/nogpets-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nogpets/apis/nogpets-api/revisions/a202c1012173?raw)
