Skip to main content
Documentation

Booking

booking.shop_info

Read the opening hours and contact details for a booking caller
Read-onlyRead budget

REST

Shipping
POST /api/v1/booking/shop_info

MCP tool

Live
booking.shop_info

Exposed on: REST API · Shop MCP server · Claude connector · Dash (in-app copilot) · Zapier. Part of the Booking domain.

Operating contract

What a customer needs in order to turn up: which days and hours the shop actually works, and how to reach it.

THE HOURS ARE THE WORKING WEEK, NOT THE BOOKABLE SLOTS. A day inside these hours can still be full, and the shop's lead time can rule out a time sitting comfortably within them. booking.availability is the only honest answer to 'when can you fit me in'; these hours answer 'when are you open'.

closed: true on a weekday means the shop does not work that day at all. hours_configured: false means this shop has never set its hours and everything downstream is running on the product's default week — say the shop has not published its hours rather than reading the defaults out as the shop's own decision.

Hours are local wall clock in the shop's own timezone, open inclusive and close exclusive: 8 to 17 means the last work starts before five.

shop.profile carries the same address and currency and is the read to prefer where both are reachable; this exists because it also carries the WEEK, which shop.profile does not.

One shop's own detail, entirely returned, so nothing is truncated.

Who may call it

Permission
NoneEvery field here is printed in the header and footer of the public storefront at /book/<slug>, which has no login behind it. Gating the shop's own opening hours would protect nothing a visitor cannot already read off the front door.
Plan
Every planNo plan gate. Available on every Service VIN plan.
Retries
naturalNaturally idempotent — running it twice leaves the same world as running it once. A retrying integration needs no key.
Rate class
readCounted against the read budget — the widest of the four.

Input

This capability takes no arguments.

Output

FieldTypeDescription
namestring

phonestring | null

emailstring | null

addressstring | null

citystring | null

regionstring | null

postal_codestring | null

timezonestring

currencystring

hours_configuredboolean

hoursobject[]

hours[].weekdaystring

hours[].opennumber | null

hours[].closenumber | null

hours[].closedboolean

Examples

Built from this capability's own schema — required fields and the ones carrying a default, and nothing invented. Paste one and it validates.

curl
export SERVICEVIN_API_KEY=svk_live_…

curl -X POST https://www.servicevin.com/api/v1/booking/shop_info \
  -H "Authorization: Bearer $SERVICEVIN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

TypeScript (fetch)
const res = await fetch("https://www.servicevin.com/api/v1/booking/shop_info", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.SERVICEVIN_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({}),
});

// Success and failure are both envelopes. Switch on error.code, never
// on error.message — the codes are stable, the messages are for people.
const payload = await res.json();
if (!res.ok) throw new Error(payload.error.code);
const data = payload.data;

Python (requests)
import os, requests

res = requests.post(
    "https://www.servicevin.com/api/v1/booking/shop_info",
    headers={"Authorization": f"Bearer {os.environ['SERVICEVIN_API_KEY']}"},
    json={},
    timeout=30,
)
payload = res.json()
if not res.ok:
    raise RuntimeError(payload["error"]["code"])
data = payload["data"]

MCP tools/call — https://www.servicevin.com/api/mcp
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "booking.shop_info",
    "arguments": {}
  }
}

Refusals

The four gates run in this order on every surface, and the order is not arbitrary — see Authentication.

StatusCodeWhen
404not_foundThe id is unknown, or the feature is not enabled for this account. Deliberately the same answer for both.
422validation_errorAn argument was wrong. The message names the field.
429rate_limitedToo many read calls. Back off and retry.
500internal_errorSomething failed on our side. Nothing was changed.