Zarvo MCP
An MCP server providing AI agents with live, structured access to UK padel venues, court availability, open games, and booking handoffs. It allows agents to search clubs, courts, and public games, and retrieve provider booking links without handling payments or inventory reservation directly.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://zarvo.uk/mcpWhat you can do with it
- Search for available padel courts in a specific location
- Find public padel games for players to join
- Retrieve booking handoff links for club providers
Source and maintenance
Protocol and capabilities
- Server
- zarvo 2.0.1
- MCP protocol
- 2025-06-18
- Tools
- 9 advertised
- Resources
- 2 advertised
- Resource templates
- 0 advertised
- Prompts
- 1 advertised
{
"tools": {
"listChanged": true
},
"prompts": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
9 advertised
search_courts — Search available padel courts
Use this when a group wants bookable court options near a UK location on one date or across a bounded date range. Searches configured providers, normalizes known whole-court and per-player prices, adds catalogue venue IDs and coordinates, and returns at most the requested limit across all dates. Providers such as MATCHi may return a null anonymous price; those slots remain visible under a price ceiling with price_details.basis unknown and must not be presented as budget matches. Travel time is a straight-line heuristic with a 15% soft-filter tolerance near max_travel_minutes, not live routing. number_of_players affects per-player price only; use singles_court to require explicit singles support. Do not use for venue-only discovery or public games.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"limit": {
"type": "integer",
"default": 3,
"maximum": 20,
"minimum": 1
},
"location": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"radius_km": {
"type": "number",
"default": 10,
"maximum": 200,
"exclusiveMinimum": 0
},
"court_type": {
"enum": [
"indoor",
"outdoor",
"covered",
"unspecified"
],
"type": "string"
},
"date_range": {
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"end": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"start": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"max_days": {
"type": "integer",
"default": 7,
"maximum": 14,
"minimum": 1
}
}
},
"travel_mode": {
"enum": [
"drive"
],
"type": "string",
"default": "drive"
},
"earliest_time": {
"type": "string",
"default": "00:00",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"singles_court": {
"type": "boolean",
"default": false,
"description": "When true, restrict results to courts or venues explicitly identified as supporting singles play."
},
"latest_end_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"duration_minutes": {
"type": "integer",
"maximum": 180,
"minimum": 30,
"multipleOf": 30,
"description": "Omit to return every duration offered by the provider."
},
"number_of_players": {
"type": "integer",
"default": 4,
"maximum": 4,
"minimum": 1,
"description": "Used to compute per-player price only. Does not filter court capacity; use singles_court for that."
},
"max_travel_minutes": {
"type": "integer",
"maximum": 180,
"exclusiveMinimum": 0
},
"max_price_per_player": {
"type": "number",
"maximum": 1000,
"exclusiveMinimum": 0
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"slot_id",
"provider",
"venue",
"court",
"starts_at",
"duration",
"price",
"currency",
"club_id",
"date",
"source",
"checked_at",
"availability",
"price_details",
"travel",
"travel_estimate_uncertain",
"revalidation"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"court": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"venue": {
"type": "object",
"required": [
"id",
"name",
"location"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"source": {
"type": "object",
"required": [
"provider",
"provider_url",
"method"
],
"properties": {
"method": {
"enum": [
"provider_live_api",
"provider_public_page",
"catalog_snapshot"
],
"type": "string"
},
"provider": {
"type": "string",
"minLength": 1
},
"provider_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"travel": {
"type": "object",
"required": [
"coordinates",
"straight_line_distance_km",
"estimated_duration_minutes",
"mode",
"confidence",
"method"
],
"properties": {
"mode": {
"enum": [
"drive"
],
"type": "string"
},
"method": {
"enum": [
"straight_line_heuristic",
"not_calculated"
],
"type": "string"
},
"confidence": {
"enum": [
"estimated",
"unavailable"
],
"type": "string"
},
"coordinates": {
"anyOf": [
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"straight_line_distance_km": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"estimated_duration_minutes": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"club_id": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
},
{
"type": "null"
}
]
},
"slot_id": {
"type": "string",
"minLength": 1
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"duration": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"starts_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"availability": {
"type": "object",
"required": [
"status",
"confidence"
],
"properties": {
"status": {
"enum": [
"available",
"unavailable",
"unknown"
],
"type": "string"
},
"confidence": {
"enum": [
"confirmed_live",
"provider_reported",
"derived",
"unknown"
],
"type": "string"
}
},
"additionalProperties": false
},
"revalidation": {
"type": "object",
"required": [
"required",
"recheck_after",
"expires_at",
"semantics"
],
"properties": {
"required": {
"type": "boolean"
},
"semantics": {
"enum": [
"recheck_before_handoff",
"rechecked_for_handoff"
],
"type": "string"
},
"expires_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"recheck_after": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"price_details": {
"type": "object",
"required": [
"amount",
"currency",
"basis",
"number_of_players",
"calculated_per_player"
],
"properties": {
"basis": {
"enum": [
"whole_court",
"per_player",
"session",
"unknown"
],
"type": "string"
},
"amount": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"number_of_players": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"calculated_per_player": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"travel_estimate_uncertain": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"meta": {
"type": "object",
"required": [
"count",
"providers",
"checked_at",
"partial",
"result_limit",
"travel_time_is_estimated"
],
"properties": {
"count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"partial": {
"type": "boolean"
},
"providers": {
"type": "object",
"required": [
"requested",
"succeeded",
"failed"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"provider",
"code"
],
"properties": {
"code": {
"type": "string",
"minLength": 1
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"requested": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"succeeded": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
}
},
"additionalProperties": false
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"result_limit": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"travel_time_is_estimated": {
"type": "boolean",
"const": true
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}search_clubs — Search padel clubs
Use this lightweight directory lookup to find clubs by location and facilities or resolve a club description, nearby landmark, or partial club name into candidate club_id, club_name, and provider values. Put only club-name wording in query; add location when an area was supplied. Use court_type for indoor/outdoor/covered courts, racket_rental for racket hire, and facility for a requested amenity. Preserve these filters when refining a search. Do not infer or pass provider from a club or brand-like name: provider is only an explicit booking-platform hint. If that hint conflicts with the directory, name resolution may return the canonical provider instead. It returns Zarvo club metadata, not live court availability. Follow with get_club for full metadata or get_availability for live slots at a selected provider club.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"facility": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"location": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string",
"description": "Only filter by provider when the user explicitly names a booking platform. Never infer this from the club name."
},
"radius_km": {
"type": "number",
"default": 10,
"maximum": 200,
"exclusiveMinimum": 0
},
"court_type": {
"enum": [
"indoor",
"outdoor",
"covered",
"unspecified"
],
"type": "string"
},
"racket_rental": {
"type": "boolean"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"club_id",
"club_name",
"provider",
"address",
"distance_km"
],
"properties": {
"address": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"club_id": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"club_name": {
"type": "string",
"minLength": 1
},
"distance_km": {
"type": "number",
"minimum": 0
}
},
"additionalProperties": false
}
},
"meta": {
"type": "object",
"required": [
"count",
"result_limit",
"radius_km",
"snapshot_at"
],
"properties": {
"count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"radius_km": {
"type": "number",
"exclusiveMinimum": 0
},
"snapshot_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"result_limit": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}search_public_games — Search public padel games
Use this when a player wants an existing public padel game with an open spot. Omit date, time, level, and limit filters unless the user requested them; by default it returns every matching game around the location across the next 14 UK days. Returns anonymous match metadata and the provider join page; it never reveals player identities or joins on the user’s behalf. Do not use for empty-court bookings.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1
},
"location": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"radius_km": {
"type": "number",
"default": 10,
"maximum": 200,
"exclusiveMinimum": 0
},
"date_range": {
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"end": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"start": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"max_days": {
"type": "integer",
"default": 14,
"maximum": 14,
"minimum": 1
}
}
},
"player_level": {
"type": "number",
"maximum": 7,
"minimum": 1
},
"earliest_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"game_id",
"provider",
"venue",
"court",
"starts_at",
"sport",
"gender",
"level",
"players",
"counts_for_ranking",
"join_url",
"source",
"checked_at",
"availability",
"price_details",
"travel",
"revalidation"
],
"properties": {
"court": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"level": {
"type": "object",
"required": [
"minimum",
"maximum"
],
"properties": {
"maximum": {
"anyOf": [
{
"type": "number",
"maximum": 7,
"minimum": 1
},
{
"type": "null"
}
]
},
"minimum": {
"anyOf": [
{
"type": "number",
"maximum": 7,
"minimum": 1
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"sport": {
"type": "string",
"minLength": 1
},
"venue": {
"type": "object",
"required": [
"id",
"name",
"location"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"gender": {
"enum": [
"mixed",
"male",
"female",
"unknown"
],
"type": "string"
},
"source": {
"type": "object",
"required": [
"provider",
"provider_url",
"method"
],
"properties": {
"method": {
"enum": [
"provider_live_api",
"provider_public_page",
"catalog_snapshot"
],
"type": "string"
},
"provider": {
"type": "string",
"minLength": 1
},
"provider_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"travel": {
"type": "object",
"required": [
"coordinates",
"straight_line_distance_km",
"estimated_duration_minutes",
"mode",
"confidence",
"method"
],
"properties": {
"mode": {
"enum": [
"drive"
],
"type": "string"
},
"method": {
"enum": [
"straight_line_heuristic",
"not_calculated"
],
"type": "string"
},
"confidence": {
"enum": [
"estimated",
"unavailable"
],
"type": "string"
},
"coordinates": {
"anyOf": [
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"straight_line_distance_km": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"estimated_duration_minutes": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"game_id": {
"type": "string",
"minLength": 1
},
"players": {
"type": "object",
"required": [
"joined",
"capacity",
"open_spots"
],
"properties": {
"joined": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"capacity": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"open_spots": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"join_url": {
"type": "string",
"format": "uri"
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"starts_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"availability": {
"type": "object",
"required": [
"status",
"confidence"
],
"properties": {
"status": {
"enum": [
"available",
"unavailable",
"unknown"
],
"type": "string"
},
"confidence": {
"enum": [
"confirmed_live",
"provider_reported",
"derived",
"unknown"
],
"type": "string"
}
},
"additionalProperties": false
},
"revalidation": {
"type": "object",
"required": [
"required",
"semantics"
],
"properties": {
"required": {
"type": "boolean",
"const": true
},
"semantics": {
"type": "string",
"const": "provider_controls_join_availability"
}
},
"additionalProperties": false
},
"price_details": {
"type": "null"
},
"counts_for_ranking": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"meta": {
"type": "object",
"required": [
"count",
"providers",
"checked_at",
"partial",
"result_limit",
"travel_time_is_estimated",
"search"
],
"properties": {
"count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"search": {
"type": "object",
"required": [
"start_date",
"end_date",
"days_checked"
],
"properties": {
"end_date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"start_date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"days_checked": {
"type": "integer",
"maximum": 14,
"minimum": 1
}
},
"additionalProperties": false
},
"partial": {
"type": "boolean"
},
"providers": {
"type": "object",
"required": [
"requested",
"succeeded",
"failed"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"provider",
"code"
],
"properties": {
"code": {
"type": "string",
"minLength": 1
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"requested": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"succeeded": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
}
},
"additionalProperties": false
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"result_limit": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "null"
}
]
},
"travel_time_is_estimated": {
"type": "boolean",
"const": true
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}search_activities — Search padel activities and coaching
Use this when a player wants scheduled PadelStars activities such as coaching, training, intro sessions, socials, junior sessions, or competitions. Returns live session times, levels, vacancies, prices when published, and the provider booking page. It never joins, books, or pays on the user’s behalf.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location",
"start_date"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"minimum": 1
},
"category": {
"enum": [
"social",
"coaching",
"training",
"intro",
"junior",
"competition",
"league",
"tournament",
"other"
],
"type": "string"
},
"location": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"provider": {
"type": "string",
"const": "padelstars",
"default": "padelstars"
},
"radius_km": {
"type": "number",
"default": 10,
"maximum": 200,
"exclusiveMinimum": 0
},
"start_date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"search_days": {
"type": "integer",
"default": 7,
"maximum": 21,
"minimum": 1
},
"availability": {
"enum": [
"available",
"all"
],
"type": "string",
"default": "available"
},
"player_level": {
"type": "number",
"maximum": 7,
"minimum": 1
},
"earliest_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"session_id",
"provider",
"category",
"name",
"venue",
"space",
"starts_at",
"duration",
"level",
"availability",
"price",
"currency",
"booking_url",
"source",
"checked_at"
],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"level": {
"type": "object",
"required": [
"minimum",
"maximum"
],
"properties": {
"maximum": {
"anyOf": [
{
"type": "number",
"maximum": 7,
"minimum": 1
},
{
"type": "null"
}
]
},
"minimum": {
"anyOf": [
{
"type": "number",
"maximum": 7,
"minimum": 1
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"space": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"venue": {
"type": "object",
"required": [
"id",
"name",
"location"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"source": {
"type": "object",
"required": [
"provider",
"provider_url",
"method"
],
"properties": {
"method": {
"enum": [
"provider_live_api",
"provider_public_page",
"catalog_snapshot"
],
"type": "string"
},
"provider": {
"type": "string",
"minLength": 1
},
"provider_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"category": {
"enum": [
"social",
"coaching",
"training",
"intro",
"junior",
"competition",
"league",
"tournament",
"other"
],
"type": "string"
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"duration": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"starts_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"session_id": {
"type": "string",
"minLength": 1
},
"booking_url": {
"type": "string",
"format": "uri"
},
"availability": {
"type": "object",
"required": [
"booked",
"capacity",
"open_spots"
],
"properties": {
"booked": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"capacity": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "null"
}
]
},
"open_spots": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"meta": {
"type": "object",
"required": [
"count",
"providers",
"checked_at",
"partial",
"result_limit",
"travel_time_is_estimated",
"search"
],
"properties": {
"count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"search": {
"type": "object",
"required": [
"start_date",
"end_date",
"days_checked"
],
"properties": {
"end_date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"start_date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"days_checked": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"partial": {
"type": "boolean"
},
"providers": {
"type": "object",
"required": [
"requested",
"succeeded",
"failed"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"provider",
"code"
],
"properties": {
"code": {
"type": "string",
"minLength": 1
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"requested": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"succeeded": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
}
},
"additionalProperties": false
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"result_limit": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"travel_time_is_estimated": {
"type": "boolean",
"const": true
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_club — Get a padel club
Use this after a Zarvo club ID is known and the user wants its address, coordinates, facilities, racket rental, contact information, official website, or social links. This returns directory metadata, not live availability.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"club_id"
],
"properties": {
"club_id": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"data",
"source",
"checked_at",
"snapshot_at"
],
"properties": {
"data": {
"type": "object",
"required": [
"id",
"name",
"city",
"slug",
"public_path",
"country_code",
"status",
"platform",
"operator",
"coordinates",
"distance_km",
"courts",
"price",
"address",
"racket_rental",
"facilities",
"details_available",
"details_extracted_at",
"descriptions",
"contact",
"social_media_urls"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
},
"city": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"slug": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
},
"price": {
"anyOf": [
{
"type": "object",
"required": [
"minimum",
"maximum",
"currency"
],
"properties": {
"maximum": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"minimum": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"courts": {
"type": "object",
"required": [
"indoor",
"outdoor",
"covered",
"unspecified",
"total"
],
"properties": {
"total": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"indoor": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"covered": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"outdoor": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"unspecified": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
}
},
"additionalProperties": false
},
"status": {
"enum": [
"open",
"coming_soon",
"closed"
],
"type": "string"
},
"address": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"contact": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"phone",
"email",
"website_url"
],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"email": {
"anyOf": [
{
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
{
"type": "null"
}
]
},
"phone": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"website_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"operator": {
"type": [
"string",
"null"
]
},
"platform": {
"type": "string",
"minLength": 1
},
"venue_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"image_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"facilities": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"coordinates": {
"anyOf": [
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"distance_km": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"public_path": {
"type": "string",
"pattern": "^\\/clubs\\/[a-z0-9-]+\\/[a-z0-9-]+$"
},
"country_code": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"descriptions": {
"type": "object",
"required": [
"courts",
"price",
"racket_rental"
],
"properties": {
"price": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"courts": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
},
"racket_rental": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"racket_rental": {
"type": [
"boolean",
"null"
]
},
"google_maps_url": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"details_available": {
"type": "boolean"
},
"social_media_urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
}
},
"details_extracted_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"source": {
"type": "object",
"required": [
"provider",
"provider_url",
"method"
],
"properties": {
"method": {
"enum": [
"provider_live_api",
"provider_public_page",
"catalog_snapshot"
],
"type": "string"
},
"provider": {
"type": "string",
"minLength": 1
},
"provider_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"snapshot_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_availability — Get club availability
Use this when the user has selected a named provider club and wants its available courts on one date or across a bounded date range. Copy provider and club_name exactly from the selected search_clubs result; never infer provider from the club name. Results include Zarvo club IDs when matched and the total limit applies across all dates. number_of_players affects per-player price only; use singles_court to require explicit singles support. Do not use for a broad nearby search; use search_courts instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"provider",
"club_name"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 20,
"minimum": 1
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"club_name": {
"type": "string",
"maxLength": 160,
"minLength": 2
},
"date_range": {
"type": "object",
"required": [
"start",
"end"
],
"properties": {
"end": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"start": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"max_days": {
"type": "integer",
"default": 7,
"maximum": 14,
"minimum": 1
}
}
},
"earliest_time": {
"type": "string",
"default": "00:00",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"singles_court": {
"type": "boolean",
"default": false,
"description": "When true, restrict results to courts or venues explicitly identified as supporting singles play."
},
"latest_end_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"duration_minutes": {
"type": "integer",
"maximum": 180,
"minimum": 30,
"multipleOf": 30,
"description": "Omit to return every duration offered by the provider."
},
"number_of_players": {
"type": "integer",
"default": 4,
"maximum": 4,
"minimum": 1,
"description": "Used to compute per-player price only. Does not filter court capacity; use singles_court for that."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"slot_id",
"provider",
"venue",
"court",
"starts_at",
"duration",
"price",
"currency",
"club_id",
"date",
"source",
"checked_at",
"availability",
"price_details",
"travel",
"travel_estimate_uncertain",
"revalidation"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"court": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"venue": {
"type": "object",
"required": [
"id",
"name",
"location"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"source": {
"type": "object",
"required": [
"provider",
"provider_url",
"method"
],
"properties": {
"method": {
"enum": [
"provider_live_api",
"provider_public_page",
"catalog_snapshot"
],
"type": "string"
},
"provider": {
"type": "string",
"minLength": 1
},
"provider_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"travel": {
"type": "object",
"required": [
"coordinates",
"straight_line_distance_km",
"estimated_duration_minutes",
"mode",
"confidence",
"method"
],
"properties": {
"mode": {
"enum": [
"drive"
],
"type": "string"
},
"method": {
"enum": [
"straight_line_heuristic",
"not_calculated"
],
"type": "string"
},
"confidence": {
"enum": [
"estimated",
"unavailable"
],
"type": "string"
},
"coordinates": {
"anyOf": [
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"straight_line_distance_km": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"estimated_duration_minutes": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"club_id": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
},
{
"type": "null"
}
]
},
"slot_id": {
"type": "string",
"minLength": 1
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"duration": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"starts_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"availability": {
"type": "object",
"required": [
"status",
"confidence"
],
"properties": {
"status": {
"enum": [
"available",
"unavailable",
"unknown"
],
"type": "string"
},
"confidence": {
"enum": [
"confirmed_live",
"provider_reported",
"derived",
"unknown"
],
"type": "string"
}
},
"additionalProperties": false
},
"revalidation": {
"type": "object",
"required": [
"required",
"recheck_after",
"expires_at",
"semantics"
],
"properties": {
"required": {
"type": "boolean"
},
"semantics": {
"enum": [
"recheck_before_handoff",
"rechecked_for_handoff"
],
"type": "string"
},
"expires_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"recheck_after": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"price_details": {
"type": "object",
"required": [
"amount",
"currency",
"basis",
"number_of_players",
"calculated_per_player"
],
"properties": {
"basis": {
"enum": [
"whole_court",
"per_player",
"session",
"unknown"
],
"type": "string"
},
"amount": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"number_of_players": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"calculated_per_player": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"travel_estimate_uncertain": {
"type": "boolean"
}
},
"additionalProperties": false
}
},
"meta": {
"type": "object",
"required": [
"count",
"providers",
"checked_at",
"partial",
"result_limit",
"travel_time_is_estimated"
],
"properties": {
"count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"partial": {
"type": "boolean"
},
"providers": {
"type": "object",
"required": [
"requested",
"succeeded",
"failed"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"provider",
"code"
],
"properties": {
"code": {
"type": "string",
"minLength": 1
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"additionalProperties": false
}
},
"requested": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
},
"succeeded": {
"type": "array",
"items": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
}
}
},
"additionalProperties": false
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"result_limit": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"travel_time_is_estimated": {
"type": "boolean",
"const": true
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}recheck_slot — Recheck a selected court slot
Optional standalone check. get_booking_handoff already revalidates before returning a URL; call this only to confirm availability without proceeding to handoff. It never books, holds inventory, takes payment, or returns checkout.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slot_id"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"slot_id": {
"type": "string",
"maxLength": 2048,
"minLength": 1
},
"earliest_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"latest_end_time": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"duration_minutes": {
"type": "integer",
"maximum": 180,
"minimum": 30,
"multipleOf": 30
},
"number_of_players": {
"type": "integer",
"default": 4,
"maximum": 4,
"minimum": 1
}
}
}{
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"status",
"checked_at",
"data"
],
"properties": {
"data": {
"type": "object",
"required": [
"slot_id",
"provider",
"venue",
"court",
"starts_at",
"duration",
"price",
"currency",
"club_id",
"date",
"source",
"checked_at",
"availability",
"price_details",
"travel",
"travel_estimate_uncertain",
"revalidation"
],
"properties": {
"date": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
"court": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"venue": {
"type": "object",
"required": [
"id",
"name",
"location"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"source": {
"type": "object",
"required": [
"provider",
"provider_url",
"method"
],
"properties": {
"method": {
"enum": [
"provider_live_api",
"provider_public_page",
"catalog_snapshot"
],
"type": "string"
},
"provider": {
"type": "string",
"minLength": 1
},
"provider_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"travel": {
"type": "object",
"required": [
"coordinates",
"straight_line_distance_km",
"estimated_duration_minutes",
"mode",
"confidence",
"method"
],
"properties": {
"mode": {
"enum": [
"drive"
],
"type": "string"
},
"method": {
"enum": [
"straight_line_heuristic",
"not_calculated"
],
"type": "string"
},
"confidence": {
"enum": [
"estimated",
"unavailable"
],
"type": "string"
},
"coordinates": {
"anyOf": [
{
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"straight_line_distance_km": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"estimated_duration_minutes": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"club_id": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
},
{
"type": "null"
}
]
},
"slot_id": {
"type": "string",
"minLength": 1
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"duration": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"starts_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"availability": {
"type": "object",
"required": [
"status",
"confidence"
],
"properties": {
"status": {
"enum": [
"available",
"unavailable",
"unknown"
],
"type": "string"
},
"confidence": {
"enum": [
"confirmed_live",
"provider_reported",
"derived",
"unknown"
],
"type": "string"
}
},
"additionalProperties": false
},
"revalidation": {
"type": "object",
"required": [
"required",
"recheck_after",
"expires_at",
"semantics"
],
"properties": {
"required": {
"type": "boolean"
},
"semantics": {
"enum": [
"recheck_before_handoff",
"rechecked_for_handoff"
],
"type": "string"
},
"expires_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"recheck_after": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"price_details": {
"type": "object",
"required": [
"amount",
"currency",
"basis",
"number_of_players",
"calculated_per_player"
],
"properties": {
"basis": {
"enum": [
"whole_court",
"per_player",
"session",
"unknown"
],
"type": "string"
},
"amount": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"number_of_players": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"calculated_per_player": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"travel_estimate_uncertain": {
"type": "boolean"
}
},
"additionalProperties": false
},
"status": {
"type": "string",
"const": "available"
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"status",
"checked_at",
"slot_id",
"reason"
],
"properties": {
"reason": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"const": "unavailable"
},
"slot_id": {
"type": "string",
"minLength": 1
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"additionalProperties": false
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}create_game_plan — Create a shareable padel game plan
Use this only when the user explicitly wants to organise one to three selected court options with other people. Rechecks each selected slot, creates an expiring Zarvo plan, and returns separate guest and private organiser links. This changes Zarvo state but does not book a court.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"original_request",
"slot_ids",
"mode"
],
"properties": {
"mode": {
"enum": [
"choose_one",
"book_all"
],
"type": "string"
},
"slot_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048,
"minLength": 1
},
"maxItems": 3,
"minItems": 1
},
"age_confirmed": {
"type": "boolean"
},
"original_request": {
"type": "string",
"maxLength": 4000,
"minLength": 3
}
}
}{
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"public_id",
"status",
"plan_url",
"organiser_url",
"organiser_link",
"expires_at",
"candidate_count",
"mode",
"guest_url",
"guest_link"
],
"properties": {
"mode": {
"type": "string",
"const": "choose_one"
},
"status": {
"enum": [
"draft",
"collecting",
"ready",
"awaiting_booking",
"confirmed",
"cancelled",
"expired"
],
"type": "string"
},
"plan_url": {
"type": "string",
"format": "uri"
},
"guest_url": {
"type": "string",
"format": "uri"
},
"public_id": {
"type": "string",
"minLength": 1
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"guest_link": {
"type": "string",
"format": "uri"
},
"organiser_url": {
"type": "string",
"format": "uri"
},
"organiser_link": {
"type": "string",
"format": "uri"
},
"candidate_count": {
"type": "integer",
"maximum": 3,
"minimum": 1
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"public_id",
"status",
"plan_url",
"organiser_url",
"organiser_link",
"expires_at",
"candidate_count",
"mode",
"guest_url",
"guest_links"
],
"properties": {
"mode": {
"type": "string",
"const": "book_all"
},
"status": {
"enum": [
"draft",
"collecting",
"ready",
"awaiting_booking",
"confirmed",
"cancelled",
"expired"
],
"type": "string"
},
"plan_url": {
"type": "string",
"format": "uri"
},
"guest_url": {
"type": "string",
"format": "uri"
},
"public_id": {
"type": "string",
"minLength": 1
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"guest_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"slot_id",
"guest_link"
],
"properties": {
"slot_id": {
"type": "string",
"minLength": 1
},
"guest_link": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"maxItems": 3,
"minItems": 1
},
"organiser_url": {
"type": "string",
"format": "uri"
},
"organiser_link": {
"type": "string",
"format": "uri"
},
"candidate_count": {
"type": "integer",
"maximum": 3,
"minimum": 1
}
},
"additionalProperties": false
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}get_booking_handoff — Get a provider booking handoff
Use this directly after the user chooses a slot. It revalidates the provider slot and returns status unavailable with a reason if the slot was taken, or status available with a provider handoff URL and current price. The user completes login, booking, and payment on the provider site; Zarvo does not reserve inventory or complete checkout.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"slot_id"
],
"properties": {
"slot_id": {
"type": "string",
"maxLength": 2048,
"minLength": 1
},
"number_of_players": {
"type": "integer",
"default": 4,
"maximum": 4,
"minimum": 1
}
}
}{
"type": "object",
"oneOf": [
{
"type": "object",
"required": [
"slot_id",
"provider",
"venue",
"court",
"starts_at",
"duration",
"price",
"currency",
"booking_url",
"prepared_at",
"status",
"handoff_url",
"current_price",
"source",
"checked_at",
"availability",
"price_details",
"revalidation"
],
"properties": {
"court": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"venue": {
"type": "object",
"required": [
"id",
"name",
"location"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"location": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"source": {
"type": "object",
"required": [
"provider",
"provider_url",
"method"
],
"properties": {
"method": {
"enum": [
"provider_live_api",
"provider_public_page",
"catalog_snapshot"
],
"type": "string"
},
"provider": {
"type": "string",
"minLength": 1
},
"provider_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"status": {
"type": "string",
"const": "available"
},
"slot_id": {
"type": "string",
"minLength": 1
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"duration": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"provider": {
"enum": [
"padelstars",
"playtomic",
"padelmates",
"matchi",
"clubspark",
"matchpoint",
"nettla"
],
"type": "string"
},
"starts_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"booking_url": {
"type": "string",
"format": "uri"
},
"handoff_url": {
"type": "string",
"format": "uri"
},
"prepared_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"availability": {
"type": "object",
"required": [
"status",
"confidence"
],
"properties": {
"status": {
"enum": [
"available",
"unavailable",
"unknown"
],
"type": "string"
},
"confidence": {
"enum": [
"confirmed_live",
"provider_reported",
"derived",
"unknown"
],
"type": "string"
}
},
"additionalProperties": false
},
"revalidation": {
"type": "object",
"required": [
"required",
"recheck_after",
"expires_at",
"semantics"
],
"properties": {
"required": {
"type": "boolean"
},
"semantics": {
"enum": [
"recheck_before_handoff",
"rechecked_for_handoff"
],
"type": "string"
},
"expires_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"recheck_after": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"current_price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"price_details": {
"type": "object",
"required": [
"amount",
"currency",
"basis",
"number_of_players",
"calculated_per_player"
],
"properties": {
"basis": {
"enum": [
"whole_court",
"per_player",
"session",
"unknown"
],
"type": "string"
},
"amount": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
},
"currency": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"number_of_players": {
"type": "integer",
"maximum": 9007199254740991,
"exclusiveMinimum": 0
},
"calculated_per_player": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"status",
"slot_id",
"checked_at",
"current_price",
"reason"
],
"properties": {
"reason": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"const": "unavailable"
},
"slot_id": {
"type": "string",
"minLength": 1
},
"checked_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"current_price": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}Prompts
1 advertised
find-court-for-group — Find a court for a group
Turn a group’s location, date, time, player count, court, travel, and price preferences into a safe Zarvo search and handoff workflow.
- request
- No description (required)
Resources
2 advertised
provider-capabilities — Zarvo provider capabilities
Configured provider coverage and the distinction between live provider data and catalogue snapshots.
zarvo://providersavailability-semantics — Zarvo availability and revalidation semantics
Definitions for freshness, confidence, price basis, travel estimates, slot rechecks, and booking handoffs.
zarvo://availability-semantics30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 2671 ms
- 95th percentile latency
- 2671 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 2671 ms · metadata changed · 9 tool(s), 2 resource(s), 0 resource template(s), 1 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http zarvo-mcp https://zarvo.uk/mcpCodex
codex mcp add zarvo-mcp --url https://zarvo.uk/mcpCursor
{
"mcpServers": {
"zarvo-mcp": {
"url": "https://zarvo.uk/mcp"
}
}
}Cline
{
"mcpServers": {
"zarvo-mcp": {
"type": "streamableHttp",
"url": "https://zarvo.uk/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zarvo-mcp": {
"type": "http",
"url": "https://zarvo.uk/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zarvo-mcp https://zarvo.uk/mcpClaude Desktop
{
"mcpServers": {
"zarvo-mcp": {
"url": "https://zarvo.uk/mcp"
}
}
}Windsurf
{
"mcpServers": {
"zarvo-mcp": {
"serverUrl": "https://zarvo.uk/mcp"
}
}
}Let your agent find its tools
Find servers like Zarvo MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Zarvo MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.