REST API · v1.0

Location intelligence
for developers

One call. Multiple place types. The optimal meeting point — scored, ranked, ready to use.

Get API key → View docs

Pricing

Start for free

Free tier is permanent — no credit card, no expiry. Need more? Contact us.

Free
Starter
$0/mo
For personal projects and prototyping.
  • 100 requests / day
  • Up to 3 targets per request
  • 5 km max radius
  • 60 requests / minute
  • Full JSON combo response
Coming soon
Pro
Pro
$29/mo
For production apps with real traffic.
  • 2,000 requests / day
  • Up to 5 targets per request
  • 30 km max radius
  • Priority rate limit
  • Email support
Coming soon
Business
Business
Custom
For high-volume platforms and enterprise.
  • 20,000+ requests / day
  • Up to 5 targets per request
  • 50 km max radius
  • Dedicated rate limits
  • SLA & dedicated support

Need higher limits now? Contact us — we handle it manually.


Get access

Request an API key

Fill in the form. You'll receive a confirmation email — click it to get your key. Takes less than a minute.

✓  Free keys issued automatically
✓  Pro / Business requests within 24h
✓  Lost your key? Use the resend option below

You'll receive a confirmation email to verify your address.

Confirmation email sent. Check your inbox and click the link to receive your key.

API Reference

Endpoint

POST https://api.multispot.net/v1/combos
Request body
{
  "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"     }
  ]
}
Response 200
{
  "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"
  }
}

Code examples

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']

Error codes

HTTPcodeMeaning
401AUTH_MISSINGNo Authorization header
401AUTH_INVALIDKey not found or revoked
400VALIDATION_ERRORBad request — message field explains what
429RATE_LIMITED60 req/min exceeded — check Retry-After header
429QUOTA_EXCEEDEDDaily limit reached — resets at midnight UTC
502UPSTREAM_ERRORGoogle Places API error (transient)
404NOT_FOUNDWrong method or path