Koskamo

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.

Zarvo MCP logo, by ZarvoVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Zarvo
MCP endpoint (Streamable HTTP)
https://zarvo.uk/mcp
Vendor documentation

What 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

Vendor evidenceRegistry 2.0.0

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
Server-advertised capabilities
{
  "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.

Use search_clubs to resolve club descriptions or partial names before requesting provider availability. Use search_courts for live bookable court options. Do not ask for a start time, duration, or player count when omitted: search from 00:00, return every provider-supported duration, and use four players only for per-player price display. Use get_club for Zarvo club details and get_availability for live inventory at a named provider club. Pass only the user's stated time window, duration, player count, travel, court-type, singles-court, and price constraints as typed inputs; rely on tool defaults for omitted optional values. Return no more than three court options in prose; the client may render structured results separately. Treat travel minutes as straight-line estimates, not live traffic or routing guarantees. Use search_public_games for existing games needing players. Prefer its broad 14-day default and omit optional date, time, level, and result-limit filters unless the user supplied them. Use search_activities for scheduled socials, coaching, training, intro, junior, and competition sessions. PadelStars is currently the supported activity provider; return its live session details and booking URL, and make clear the user completes joining and payment on the provider website. After the user clearly chooses a slot, call get_booking_handoff; it revalidates and may return unavailable. Use recheck_slot for a standalone availability check without proceeding to handoff. Use create_game_plan only with explicit user intent and an explicit choose_one or book_all mode. Never claim Zarvo reserved, booked, joined, or paid. The user completes booking or joining on the provider website. Never ask for names, contact details, health information, private exact addresses, or another person's private availability. Include venue, local date and time, duration, whole-court price when known, and the provider handoff URL. Do not invent availability, prices, venues, travel guarantees, or links. Share guest links with invitees and keep organiser links private.

Tools

9 advertised

search_courts — Search available padel courts
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

search_courts input schema
{
  "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
    }
  }
}
search_courts output schema
{
  "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
}
search_courts annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
search_clubs — Search padel clubs
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_clubs input schema
{
  "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"
    }
  }
}
search_clubs output schema
{
  "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
}
search_clubs annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_public_games — Search public padel games
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

search_public_games input schema
{
  "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$"
    }
  }
}
search_public_games output schema
{
  "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
}
search_public_games annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
search_activities — Search padel activities and coaching
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

search_activities input schema
{
  "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$"
    }
  }
}
search_activities output schema
{
  "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
}
search_activities annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_club — Get a padel club
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_club input schema
{
  "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]+)*$"
    }
  }
}
get_club output schema
{
  "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
}
get_club annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_availability — Get club availability
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

get_availability input schema
{
  "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."
    }
  }
}
get_availability output schema
{
  "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
}
get_availability annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
recheck_slot — Recheck a selected court slot
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

recheck_slot input schema
{
  "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
    }
  }
}
recheck_slot output schema
{
  "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"
}
recheck_slot annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
create_game_plan — Create a shareable padel game plan
Advertised by the server during the last successful anonymous check.
Open-world

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.

create_game_plan input schema
{
  "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
    }
  }
}
create_game_plan output schema
{
  "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"
}
create_game_plan annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_booking_handoff — Get a provider booking handoff
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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.

get_booking_handoff input schema
{
  "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
    }
  }
}
get_booking_handoff output schema
{
  "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"
}
get_booking_handoff annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

1 advertised

find-court-for-group — Find a court for a group

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

Configured provider coverage and the distinction between live provider data and catalogue snapshots.

provider-capabilities URI
zarvo://providers

MIME type: application/json

availability-semantics — Zarvo availability and revalidation semantics

Advertised by the server during the last successful anonymous check.

Definitions for freshness, confidence, price basis, travel estimates, slot rechecks, and booking handoffs.

availability-semantics URI
zarvo://availability-semantics

MIME type: application/json

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

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http zarvo-mcp https://zarvo.uk/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add zarvo-mcp --url https://zarvo.uk/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zarvo-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zarvo-mcp": {
      "url": "https://zarvo.uk/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zarvo-mcp": {
      "type": "streamableHttp",
      "url": "https://zarvo.uk/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zarvo-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zarvo-mcp": {
      "type": "http",
      "url": "https://zarvo.uk/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http zarvo-mcp https://zarvo.uk/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "zarvo-mcp": {
      "url": "https://zarvo.uk/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing