|
1 | 1 | { |
2 | 2 | "slug": "playtomic-public", |
3 | | - "name": "Playtomic (Public)", |
4 | | - "description": "Find padel, tennis, and futsal courts worldwide — read-only, no account needed. Search clubs near you, check court availability and pricing, browse Playtomic's tenant catalog. 4 tools, zero setup.", |
5 | | - "instructions": "This connector wraps Playtomic's **public** read endpoints — no login, no API key, no setup. It's the fastest way to give an AI agent the ability to find padel/tennis courts and check availability.\n\n**What you can do without an account**:\n- Search clubs (tenants) by geo coordinate + radius, optionally filtered by sport.\n- Fetch a single club's full details (resources/courts, opening info, address, timezone, images).\n- Read free time slots for a given day across one or more clubs, with prices.\n- Read Playtomic's sport configuration (allowed durations, resource types, sport list).\n\n**What requires the full Playtomic connector instead**:\n- Your own profile, level, match history, social graph.\n- Open matches you can join.\n- Member/club-specific discounted pricing (this connector returns generic pricing).\n- Booking a court (write operations are not exposed — Playtomic has no official public booking API).\n\n**Pricing notes**:\n- `price` is a string like `\"48 EUR\"` — parse amount + currency separately.\n- Same `start_time` may appear multiple times with different `duration` values (60/90/120 min). These are alternative bookings of the same slot, not separate free slots.\n- `duration` is in **minutes**.\n\n**Time handling**:\n- `local_start_min` / `local_start_max` are naive ISO-8601 in the tenant's local timezone — find the timezone in `tenant.address.timezone` (e.g. `Europe/Berlin`).\n- For a full-day window use `2026-05-23T00:00:00` → `2026-05-23T23:59:59`.\n\n**Joining availability back to courts**: every availability row has a `resource_id`; map it back to `tenant.resources[].name` from `get_tenant` to know which court (indoor/outdoor, single/double, etc.).\n\n**Rate limits**: Playtomic has no published public-API SLA. Be gentle — under 1 req/s is safe. The connector identifies itself honestly as AnythingMCP (no UA spoofing).\n\n**Stability**: this is an undocumented/internal API reverse-engineered from the iOS app. Endpoints can change without notice. If a tool breaks, check the docs URL for updates.\n\n**Suggested starter prompts**:\n- \"Find padel clubs within 30 km of Milan that are open today.\"\n- \"What time slots are free on Saturday afternoon at FREIBURG PADEL?\"\n- \"Compare prices across all padel clubs in Madrid for Sunday morning, 90-minute sessions.\"\n- \"Which courts in Barcelona offer indoor crystal padel?\"", |
| 3 | + "name": "Playtomic (Lite)", |
| 4 | + "description": "Find padel, tennis, and futsal courts worldwide — read-only. Search clubs near you, check court availability and pricing, browse Playtomic's tenant catalog. 4 read tools; needs a free Playtomic account (email + password), no API key.", |
| 5 | + "instructions": "This is the **lite, read-only** Playtomic connector — the fastest way to give an AI agent the ability to find padel/tennis courts and check availability, without the 13-tool full connector's personal-data scope.\n\n**Authentication (handled automatically)**: Playtomic closed anonymous access to its API in mid-2025, so even read-only club search now needs an authenticated session. Provide a **free** Playtomic account (`PLAYTOMIC_EMAIL` + `PLAYTOMIC_PASSWORD`); the AnythingMCP `LOGIN_TOKEN` engine logs in, attaches `Authorization: Bearer <jwt>` to every call, caches the token encrypted, and re-logs in automatically ~60 s before expiry and on any `401`. Your password is stored encrypted and only sent over TLS to Playtomic's login endpoint. No club membership is required — any registered Playtomic user works.\n\n**What you can do**:\n- Search clubs (tenants) by geo coordinate + radius, optionally filtered by sport.\n- Fetch a single club's full details (resources/courts, opening info, address, timezone, images).\n- Read free time slots for a given day across one or more clubs, with prices.\n- Read Playtomic's sport configuration (allowed durations, resource types, sport list).\n\n**What requires the full Playtomic connector instead**:\n- Your own profile, level, match history, social graph.\n- Open matches you can join.\n- Member/club-specific discounted pricing (this connector returns generic pricing).\n- Booking a court (write operations are not exposed — Playtomic has no official public booking API).\n\n**Pricing notes**:\n- `price` is a string like `\"48 EUR\"` — parse amount + currency separately.\n- Same `start_time` may appear multiple times with different `duration` values (60/90/120 min). These are alternative bookings of the same slot, not separate free slots.\n- `duration` is in **minutes**.\n\n**Time handling**:\n- `local_start_min` / `local_start_max` are naive ISO-8601 in the tenant's local timezone — find the timezone in `tenant.address.timezone` (e.g. `Europe/Berlin`).\n- For a full-day window use `2026-05-23T00:00:00` → `2026-05-23T23:59:59`.\n\n**Joining availability back to courts**: every availability row has a `resource_id`; map it back to `tenant.resources[].name` from `get_tenant` to know which court (indoor/outdoor, single/double, etc.).\n\n**Rate limits**: Playtomic has no published public-API SLA. Be gentle — under 1 req/s is safe. The connector identifies itself honestly as AnythingMCP (no UA spoofing).\n\n**Stability**: this is an undocumented/internal API reverse-engineered from the iOS app. Endpoints can change without notice. If a tool breaks, check the docs URL for updates.\n\n**Suggested starter prompts**:\n- \"Find padel clubs within 30 km of Milan that are open today.\"\n- \"What time slots are free on Saturday afternoon at FREIBURG PADEL?\"\n- \"Compare prices across all padel clubs in Madrid for Sunday morning, 90-minute sessions.\"\n- \"Which courts in Barcelona offer indoor crystal padel?\"", |
6 | 6 | "region": "intl", |
7 | 7 | "category": "sports", |
8 | 8 | "icon": "playtomic", |
9 | 9 | "docsUrl": "https://playtomic.io", |
10 | 10 | "featured": true, |
11 | 11 | "priority": 80, |
12 | | - "requiredEnvVars": [], |
| 12 | + "requiredEnvVars": [ |
| 13 | + "PLAYTOMIC_EMAIL", |
| 14 | + "PLAYTOMIC_PASSWORD" |
| 15 | + ], |
13 | 16 | "connector": { |
14 | | - "name": "Playtomic Public API", |
| 17 | + "name": "Playtomic Lite", |
15 | 18 | "type": "REST", |
16 | | - "baseUrl": "https://app.playtomic.io", |
17 | | - "authType": "NONE", |
18 | | - "authConfig": {} |
| 19 | + "baseUrl": "https://api.app.playtomic.io", |
| 20 | + "authType": "LOGIN_TOKEN", |
| 21 | + "authConfig": { |
| 22 | + "loginUrl": "https://api.app.playtomic.io/v3/auth/login", |
| 23 | + "loginMethod": "POST", |
| 24 | + "loginBody": { |
| 25 | + "requested_user_roles": [ |
| 26 | + "ROLE_CUSTOMER" |
| 27 | + ], |
| 28 | + "email": "${username}", |
| 29 | + "password": "${password}" |
| 30 | + }, |
| 31 | + "username": "{{PLAYTOMIC_EMAIL}}", |
| 32 | + "password": "{{PLAYTOMIC_PASSWORD}}", |
| 33 | + "tokenJsonPath": "access_token", |
| 34 | + "expiryJsonPath": "access_token_expiration", |
| 35 | + "expiryFormat": "iso8601", |
| 36 | + "refreshOn401": true, |
| 37 | + "proactiveRefreshSeconds": 60, |
| 38 | + "headerName": "Authorization", |
| 39 | + "headerTemplate": "Bearer ${token}" |
| 40 | + } |
19 | 41 | }, |
20 | 42 | "tools": [ |
21 | 43 | { |
|
62 | 84 | }, |
63 | 85 | "endpointMapping": { |
64 | 86 | "method": "GET", |
65 | | - "path": "/api/v1/tenants", |
| 87 | + "path": "/v1/tenants", |
66 | 88 | "queryParams": { |
67 | 89 | "coordinate": "$coordinate", |
68 | 90 | "radius": "$radius", |
|
91 | 113 | }, |
92 | 114 | "endpointMapping": { |
93 | 115 | "method": "GET", |
94 | | - "path": "/api/v1/tenants/{tenant_id}" |
| 116 | + "path": "/v1/tenants/{tenant_id}" |
95 | 117 | } |
96 | 118 | }, |
97 | 119 | { |
|
132 | 154 | }, |
133 | 155 | "endpointMapping": { |
134 | 156 | "method": "GET", |
135 | | - "path": "/api/v1/availability", |
| 157 | + "path": "/v1/availability", |
136 | 158 | "queryParams": { |
137 | 159 | "sport_id": "$sport_id", |
138 | 160 | "tenant_id": "$tenant_id", |
|
151 | 173 | }, |
152 | 174 | "endpointMapping": { |
153 | 175 | "method": "GET", |
154 | | - "path": "/api/v2/configuration" |
| 176 | + "path": "/v2/configuration" |
155 | 177 | } |
156 | 178 | } |
157 | 179 | ] |
|
0 commit comments