Privyde

Developers

Privyde is a private executive transport operator in Spain: professional chauffeurs and a premium fleet for airport transfers, corporate travel, events, hourly disposal and intercity trips, with a base in Madrid and long-distance corridors in both directions across the country. This page documents everything a developer or an autonomous agent needs to work with us programmatically: the public API, the hosted MCP server, the markdown views of every page and the machine-readable discovery files.

Everything below is public and unauthenticated. There is no key to request, no onboarding form and no approval step. Bookings created through the API are requests: a person confirms the chauffeur and the final price before anything is charged.

Quickstart

Price a Madrid airport transfer and read the answer. No headers beyond Content-Type are required.

curl -s https://privyde.com/api/v1/quote \
  -H 'Content-Type: application/json' \
  -d '{
    "serviceType": "SRV_TRANSFER",
    "tier": "TIER_STANDARD",
    "origin": "Adolfo Suárez Madrid-Barajas Airport, Madrid",
    "destination": "Puerta del Sol, Madrid",
    "date": "2026-09-15",
    "time": "09:30",
    "passengers": 2
  }'

serviceType is SRV_TRANSFER (point to point around Madrid), SRV_LONG_DISTANCE (intercity, in either direction) or SRV_DISPOSITION (chauffeur at disposal, with durationHours 4-12 or durationDays). tier is TIER_STANDARD or TIER_ATELIER.

The response carries a quoteId, the price per vehicle tier and a validUntil timestamp. Prices come from the published rate card: they are never invented per request. When a route needs human validation (very long distances, repositioning trips), the answer says so instead of guessing a number.

Endpoints

The full description, with request and response schemas, is the OpenAPI document at /.well-known/openapi.json. A machine-readable index of every resource on this page is served as JSON at /api and as an RFC 9727 linkset at /.well-known/api-catalog.

MethodPathPurpose
POST/api/v1/quotePrice a transfer, an hourly disposal or a multi-day service.
POST/api/v1/bookingSubmit a booking request. A human confirms chauffeur and final price.
POST/api/v1/contactSend a message to the concierge team.
POST/api/v1/corporateRequest a corporate or hotel account.
POST/api/v1/chatTalk to the Privyde AI concierge.
POST/api/v1/mcpMCP server, JSON-RPC 2.0 over Streamable HTTP.
GET/api/v1/healthLiveness and status.
GET/api/md/{lang}/{path}Markdown view of any content page.

Authentication

None. Every endpoint documented here is public, so an agent can integrate without a credential exchange. That also sets the boundary of what the API can do: it prices, it submits requests and it reads public information. It never exposes another customer's trip, never charges a card and never confirms a service on its own. Anything that moves money or reveals a passenger stays behind the booking centre link that the customer receives by email.

Versioning and deprecation

The public API is versioned in the URL path. /api/v1/... is the stable address to integrate against; the unversioned /api/... form is kept as an alias of the current version. Every response carries an API-Version header.

How a change is signalled

Rate limits

Public endpoints allow 60 requests per minute per IP address; the write endpoints (quote, booking, contact, corporate) enforce 30 per minute. The quota travels in the response, not only in the error, so a client can pace itself before being refused:

RateLimit-Policy: default;q=60;w=60
RateLimit: limit=30, remaining=27, reset=41
RateLimit-Limit: 30
RateLimit-Remaining: 27
RateLimit-Reset: 41

Over the limit the answer is 429 with Retry-After in seconds and the error body described below. If you need more than this for a legitimate integration, write to us: the limit exists against abuse, not against partners.

Errors

Every error under /api is JSON, with a stable machine code, a human message and a hint saying what to do next. Never an HTML page.

{
  "error": "invalid_request",
  "code": "invalid_request",
  "message": "The booking request failed validation.",
  "hint": "Fix the fields listed in `details` and retry. Required: name, email, phone, origin, destination, date, time.",
  "docs": "https://privyde.com/developers",
  "status": 400,
  "details": [{ "field": "email", "message": "Invalid email" }],
  "type": "https://privyde.com/developers#error-invalid-request",
  "title": "Invalid request",
  "detail": "The booking request failed validation."
}

The flat type, title, status and detail members mirror RFC 9457 problem details for clients that already speak it.

Codes

MCP server

A hosted Model Context Protocol server runs at https://privyde.com/api/mcp over Streamable HTTP, stateless, no authentication. Its discovery card is at /.well-known/mcp/server-card.json (also served at /mcp.json).

curl -s https://privyde.com/api/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Tools are read-only by design: list_services, list_cities, list_fleet, list_popular_routes, get_company_info, contact_concierge and get_booking_link, which returns a pre-filled booking URL rather than submitting anything. The same tools are registered in the browser through navigator.modelContext (WebMCP) when an agent loads a page.

Markdown views

Every content page has a markdown representation, so an agent never has to parse the layout. Two ways to ask for it, both returning text/markdown:

curl -s -H 'Accept: text/markdown' https://privyde.com/en/fleet
curl -s https://privyde.com/en/fleet.md

The response includes an x-markdown-tokens header with a rough token estimate, so a client can budget context before reading. HTML responses declare Vary: Accept so a shared cache never returns the wrong representation.

Agent skills

Step-by-step task guides, in the agent-skills format, are indexed at /.well-known/agent-skills/index.json: booking an executive transfer and requesting a corporate account. The site map for agents lives at /llms.txt, and guidance on when to reach for Privyde at /agent.txt.

Command line

privyde on npm wraps everything on this page. No install, no dependencies, no credential:

npx privyde quote --from "Barajas T4, Madrid" --to "Toledo" --date 2026-09-15 --time 09:30
npx privyde quote --service hourly --from "Puerta del Sol, Madrid" --hours 6 --date 2026-09-15 --time 09:30
npx privyde fleet
npx privyde page en/fleet          # markdown view of any page
npx privyde book --from "Barajas T4" --to "Toledo" --date 2026-09-15 --time 09:30

book prints a pre-filled booking link; it never submits anything. Add --json to any command to get the raw API response. The API is also plain JSON over HTTPS, so curl plus jq works just as well:

curl -s https://privyde.com/api/v1/quote -H 'Content-Type: application/json' \
  -d '{"serviceType":"SRV_LONG_DISTANCE","tier":"TIER_STANDARD","origin":"Madrid","destination":"Toledo","date":"2026-09-15","time":"09:30","passengers":2}' \
  | jq '.quote.total'

Sandbox

POST /api/v1/quote is itself the sandbox: it is read-only, computes real prices and creates nothing. Explore it as much as the rate limit allows. For the endpoints that do create a record (booking, contact, corporate), add "test": true is not supported on purpose: a request that looks real is treated as real, because a chauffeur may be dispatched for it. If you need to exercise the full flow, write to us first and we will walk it with you.

Support

Email info@privyde.com — the concierge desk answers 24/7 and routes technical questions to whoever built the thing you are asking about. Status and liveness: /api/health.