One call. Multiple place types. The optimal meeting point — scored, ranked, ready to use.
Free tier is permanent — no credit card, no expiry. Need more? Contact us.
Need higher limits now? Contact us — we handle it manually.
Fill in the form. You'll receive a confirmation email — click it to get your key. Takes less than a minute.
https://api.multispot.net/v1/combos
{
"location": {
"lat": 48.8566,
"lng": 2.3522
},
"radius_m": 2000,
"language": "en",
"targets": [
{ "query": "cafe", "kind": "category" },
{ "query": "pharmacy", "kind": "category" },
{ "query": "Carrefour", "kind": "text" }
]
}
{
"nearest": {
"score": 312,
"avg_spread_m": 380,
"dist_to_user_m": 210,
"places": [
{
"name": "Café de Flore",
"target": "cafe",
"rating": 4.5,
"open_now": true,
"dist_to_user_m": 180,
"lat": 48.854,
"lng": 2.333
}
]
},
"tightest_cluster": { /* ... */ },
"others": [ /* up to 5 */ ],
"meta": {
"total_combos": 47,
"quota_used": 12,
"quota_limit": 100,
"tier": "free"
}
}
curl -X POST https://api.multispot.net/v1/combos \ -H "Authorization: Bearer ms_live_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "location": {"lat": 48.8566, "lng": 2.3522}, "radius_m": 2000, "targets": [ {"query": "cafe", "kind": "category"}, {"query": "pharmacy", "kind": "category"} ] }'
const res = await fetch('https://api.multispot.net/v1/combos', { method: 'POST', headers: { 'Authorization': 'Bearer ms_live_YOUR_KEY', 'Content-Type': 'application/json', }, body: JSON.stringify({ location: { lat: 48.8566, lng: 2.3522 }, radius_m: 2000, targets: [ { query: 'cafe', kind: 'category' }, { query: 'pharmacy', kind: 'category' }, ], }), }); const data = await res.json(); console.log(data.nearest);
import requests data = requests.post( "https://api.multispot.net/v1/combos", headers={ "Authorization": "Bearer ms_live_YOUR_KEY", "Content-Type": "application/json", }, json={ "location": {"lat": 48.8566, "lng": 2.3522}, "radius_m": 2000, "targets": [ {"query": "cafe", "kind": "category"}, {"query": "pharmacy", "kind": "category"}, ], } ).json() print(data["nearest"])
$ch = curl_init('https://api.multispot.net/v1/combos'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ms_live_YOUR_KEY', 'Content-Type: application/json', ], CURLOPT_POSTFIELDS => json_encode([ 'location' => ['lat' => 48.8566, 'lng' => 2.3522], 'radius_m' => 2000, 'targets' => [ ['query' => 'cafe', 'kind' => 'category'], ['query' => 'pharmacy', 'kind' => 'category'], ], ]), ]); $data = json_decode(curl_exec($ch), true); var_dump($data['nearest']);
package main import ( "bytes"; "encoding/json"; "fmt"; "net/http" ) func main() { body, _ := json.Marshal(map[string]any{ "location": map[string]float64{"lat": 48.8566, "lng": 2.3522}, "radius_m": 2000, "targets": []map[string]string{ {"query": "cafe", "kind": "category"}, {"query": "pharmacy", "kind": "category"}, }, }) req, _ := http.NewRequest("POST", "https://api.multispot.net/v1/combos", bytes.NewBuffer(body)) req.Header.Set("Authorization", "Bearer ms_live_YOUR_KEY") req.Header.Set("Content-Type", "application/json") resp, _ := http.DefaultClient.Do(req) var data map[string]any json.NewDecoder(resp.Body).Decode(&data) fmt.Println(data["nearest"]) }
require 'net/http' require 'json' uri = URI('https://api.multispot.net/v1/combos') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true req = Net::HTTP::Post.new(uri) req['Authorization'] = 'Bearer ms_live_YOUR_KEY' req['Content-Type'] = 'application/json' req.body = { location: { lat: 48.8566, lng: 2.3522 }, radius_m: 2000, targets: [ { query: 'cafe', kind: 'category' }, { query: 'pharmacy', kind: 'category' }, ] }.to_json data = JSON.parse(http.request(req).body) puts data['nearest']
| HTTP | code | Meaning |
|---|---|---|
| 401 | AUTH_MISSING | No Authorization header |
| 401 | AUTH_INVALID | Key not found or revoked |
| 400 | VALIDATION_ERROR | Bad request — message field explains what |
| 429 | RATE_LIMITED | 60 req/min exceeded — check Retry-After header |
| 429 | QUOTA_EXCEEDED | Daily limit reached — resets at midnight UTC |
| 502 | UPSTREAM_ERROR | Google Places API error (transient) |
| 404 | NOT_FOUND | Wrong method or path |