Privyde
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.
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.
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.
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/quote | Price a transfer, an hourly disposal or a multi-day service. |
| POST | /api/v1/booking | Submit a booking request. A human confirms chauffeur and final price. |
| POST | /api/v1/contact | Send a message to the concierge team. |
| POST | /api/v1/corporate | Request a corporate or hotel account. |
| POST | /api/v1/chat | Talk to the Privyde AI concierge. |
| POST | /api/v1/mcp | MCP server, JSON-RPC 2.0 over Streamable HTTP. |
| GET | /api/v1/health | Liveness and status. |
| GET | /api/md/{lang}/{path} | Markdown view of any content page. |
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.
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.
v1 without notice. Clients must ignore unknown fields./api/v2/). The old version keeps working.Deprecation header with the date the decision took effect, a Sunset header with the date it stops answering, and a Link; rel="deprecation" pointing here.Deprecation and Sunset: 180 days.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: 41Over 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.
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.
invalid_json — the body is not JSON (400).invalid_request — the body is JSON but fails validation (400). See details.not_found — no such endpoint (404).rate_limited — quota exhausted (429). Honour Retry-After.delivery_failed — the request was understood but could not be stored or delivered (502). Safe to retry.internal_error — our fault (500). Retry with backoff.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.
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.mdThe 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.
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.
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:30book 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'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.
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.