Skip to content
Lanewise
Get started
REST APIRead the quickstart

The points of interest API for location-aware apps

Store your places, tag them with your own typed attributes and let Lanewise add a street address to every one. Then find what is within any radius of a point, filtered exactly the way your app needs.

The Free plan includes 50 requests per hour, 1,000 POIs and every API feature.

GET/v1/pois · request
curl -G https://api.lanewise.app/v1/pois \
  -H "X-API-KEY: $LANEWISE_KEY" \
  -d latitude=41.3851 \
  -d longitude=2.1734 \
  -d distance=500 \
  -d "attributes[open]=true"
response headers
HTTP/1.1 200 OK
Content-Type: application/json
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 997
X-RateLimit-Reset: 1790600400

Every response carries your hourly quota, so clients can back off before they hit a 429.

200 OK · application/json
{
  "data": [
    {
      "id": "01K5YQ3H8V2N6T4R9M7C1X0B5D",
      "name": "Mercat de la Boqueria",
      "latitude": 41.3817,
      "longitude": 2.1716,
      "distance": 406.8,
      "category": {
        "id": "01K5YQ1A7C2D3E4F5G6H7J8K9M",
        "name": "Markets",
        "created_at": "2026-09-18T08:02:11.000000Z",
        "updated_at": "2026-09-18T08:02:11.000000Z"
      },
      "attributes": {
        "open": true,
        "rating": 4.6,
        "owner_id": "client_1042"
      },
      "address": {
        "display_name": "Mercat de la Boqueria, 91, La Rambla, el Gòtic, Ciutat Vella, Barcelona, Barcelonès, Barcelona, Catalunya, 08001, España",
        "street": "La Rambla",
        "city": {
          "id": "9b2f6c1e-4a7d-4f0b-8c3e-2d5a6f7b8c9d",
          "name": "Barcelona"
        },
        "country": {
          "id": "3e8a1d2c-5b6f-4c7d-9e0f-1a2b3c4d5e6f",
          "name": "España"
        },
        "zipcode": {
          "id": "7c4d2e1f-8a9b-4c0d-a1e2-f3a4b5c6d7e8",
          "code": "08001"
        },
        "geocoded_at": "2026-09-21T10:15:34.000000Z"
      },
      "created_at": "2026-09-21T10:15:32.000000Z",
      "updated_at": "2026-09-24T17:40:05.000000Z"
    },
    {
      "id": "01K5YQ4B2W8X1Z3P5N7Q9S0T2V",
      "name": "Mercat de Santa Caterina",
      "latitude": 41.3859,
      "longitude": 2.1786,
      "distance": 442.85,
      "category": {
        "id": "01K5YQ1A7C2D3E4F5G6H7J8K9M",
        "name": "Markets",
        "created_at": "2026-09-18T08:02:11.000000Z",
        "updated_at": "2026-09-18T08:02:11.000000Z"
      },
      "attributes": {
        "open": true,
        "rating": 4.4,
        "owner_id": "client_1042"
      },
      "address": {
        "display_name": "Mercat de Santa Caterina, Avinguda de Francesc Cambó, Sant Pere, Santa Caterina i la Ribera, Ciutat Vella, Barcelona, Barcelonès, Barcelona, Catalunya, 08003, España",
        "street": "Avinguda de Francesc Cambó",
        "city": {
          "id": "9b2f6c1e-4a7d-4f0b-8c3e-2d5a6f7b8c9d",
          "name": "Barcelona"
        },
        "country": {
          "id": "3e8a1d2c-5b6f-4c7d-9e0f-1a2b3c4d5e6f",
          "name": "España"
        },
        "zipcode": {
          "id": "2a6b8c0d-1e3f-4a5b-9c7d-8e9f0a1b2c3d",
          "code": "08003"
        },
        "geocoded_at": "2026-09-21T10:16:02.000000Z"
      },
      "created_at": "2026-09-21T10:15:58.000000Z",
      "updated_at": "2026-09-21T10:16:02.000000Z"
    }
  ],
  "next": "01K5YQ5C9D1F3G5H7J9K1M3N5P"
}

Features

Everything your app needs to work with places

One API for storing locations, describing them with your own data and finding the right ones fast. No GIS stack to run, no geocoder to wire up.

Geo search by distance

Ask for everything within N meters of a point. Lanewise runs a haversine search over your POIs and tells you how far away each result is.

  • Pass latitude, longitude and a distance of up to 100 km
  • Every result includes its distance in meters
  • Combine with attribute, category and location filters

Automatic address enrichment

Send coordinates, get an address. Every POI is reverse-geocoded in the background with OpenStreetMap Nominatim, and again whenever its coordinates change.

POSTyou send
{
  "name": "Mercat de la Boqueria",
  "latitude": 41.3817,
  "longitude": 2.1716
}
the POI now includes
{
  "address": {
    "display_name": "Mercat de la Boqueria, 91, La Rambla, el Gòtic, Ciutat Vella, Barcelona, …, 08001, España",
    "street": "La Rambla",
    "city": {
      "id": "9b2f6c1e-4a7d-4f0b-8c3e-2d5a6f7b8c9d",
      "name": "Barcelona"
    },
    "country": {
      "id": "3e8a1d2c-5b6f-4c7d-9e0f-1a2b3c4d5e6f",
      "name": "España"
    },
    "zipcode": {
      "id": "7c4d2e1f-8a9b-4c0d-a1e2-f3a4b5c6d7e8",
      "code": "08001"
    },
    "geocoded_at": "2026-09-21T10:15:34.000000Z"
  }
}
Points of interest
Create, read, update and delete POIs with a name and coordinates. Each one gets a sortable ULID you can store anywhere.
Typed attributes
Define string, number or boolean attributes like owner_id, rating or open once, then set and filter them on any POI by name or ID.
Categories
Group POIs into restaurants, parks, depots or anything else, and filter by category ID or by name.
Bulk CSV import
Upload up to 50,000 POIs per CSV file with POST /v1/imports or from the dashboard. Categories and attributes ride along as columns.
Routes that avoid POIs
Plan a route through up to 50 waypoints that keeps a set distance from the POIs you select, such as road works or restricted streets.
Clustering and delivery optimization
Split up to 2,000 stops into compact areas, then assign stops to vehicles and order them around time windows and capacities.
Location filters
Narrow results to a country, city or zipcode. The geo endpoints list the countries, cities and zipcodes your POIs are in.
Cursor pagination
Pages of up to 100 results with a next cursor, so walking large collections stays fast and consistent.
Predictable errors
Every error is JSON with a human-readable message and the right status code, from 401 to 422 and 429.
Rate limit headers
X-RateLimit-Limit, -Remaining and -Reset on every authenticated response, plus Retry-After when a quota runs out.
Plain REST and JSON
Authenticate with an X-API-KEY header and call it from curl, a backend, a mobile app or a serverless function.
API explorer and Postman
Try every endpoint from the docs with your own key, or import the Postman collection or OpenAPI spec into your tools.

How it works

From zero to your first nearby search in minutes

Three steps, all over HTTPS. Use any language or HTTP client you already have.

  1. Step 1: Create an API key

    Sign up, create a team and generate a key in the dashboard. Choose exactly which resources it can touch and when it expires.

    terminal
    export LANEWISE_KEY="your-api-key"
  2. Step 2: Store your POIs

    Define the attributes you care about once, then send your places. Categories and attribute values ride along in the same request.

    POST /v1/attributes, /v1/pois
    curl https://api.lanewise.app/v1/attributes \
      -H "X-API-KEY: $LANEWISE_KEY" \
      -H "Content-Type: application/json" \
      -d '{ "name": "open", "type": "boolean" }'
    
    curl https://api.lanewise.app/v1/pois \
      -H "X-API-KEY: $LANEWISE_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "Mercat de la Boqueria",
        "latitude": 41.3817,
        "longitude": 2.1716,
        "category_id": "01K5YQ1A7C2D3E4F5G6H7J8K9M",
        "attributes": { "open": true }
      }'
  3. Step 3: Query them

    Search around a point, by category, by attribute or by location, and page through the results with a cursor.

    GET /v1/pois
    curl -G https://api.lanewise.app/v1/pois \
      -H "X-API-KEY: $LANEWISE_KEY" \
      -d latitude=41.3851 -d longitude=2.1734 \
      -d distance=500 \
      -d category_name=Markets

Built for teams

Share one workspace, keep every key on a short leash

Lanewise is multi-tenant from the ground up. Your team's POIs, attributes and categories are isolated from everyone else's, and the dashboard gives you control over who and what can reach them.

Teams, roles and invites
Invite teammates by email and give each one a role. Build your own roles from granular permissions.
Scoped API keys
Grant each key only the permissions it needs, per resource. Set an expiry date, deactivate a key and turn it back on at any time.
Request logs and usage
Every API request is logged with its endpoint, status and payloads, and the dashboard turns that log into usage analytics.

API keys

Illustration
  • Production backend

    Active
    • read-pois
    • create-pois
    • update-pois
    • read-categories

    Expires in 11 months

  • Driver app (read only)

    Active
    • read-pois
    • read-categories
    • plan-routes

    No expiry

  • Old import script

    Inactive
    • create-pois
    • delete-pois

    Deactivated

Illustration of three API keys with different permissions and states.

Use cases

One API, many kinds of places

If your product answers “what is near here?”, Lanewise can hold the answer. A few of the ways teams put it to work:

  • Logistics and delivery

    Keep depots, hubs, lockers and drop-off points in one place and find the closest ones to a driver or an order. Cluster the stops and optimize each vehicle’s deliveries.

    GET /v1/pois?category_name=Depots&distance=5000

  • Fleet and driver apps

    Warn drivers about the hazards or restricted zones you store, or plan routes that keep away from road works and closed streets.

    GET /v1/pois?category_name=Hazards&distance=2000

  • Store and venue locators

    Power a "near me" page with stores, venues or partners, showing only the ones that are open right now.

    GET /v1/pois?attributes[open]=true

  • Field services

    Track job sites, assets and inspection points by city or zipcode, and let the whole team work from the same data.

    GET /v1/pois?city_id=…&attributes[status]=pending

  • Marketplaces

    Store locations for many clients in one team and keep them apart with an owner or client attribute.

    GET /v1/pois?attributes[owner_id]=client_1042

Roadmap

What just shipped, and what is next

Bulk CSV import and routing are live. The rest is in the works and not available yet. Want one of them first? Tell us at [email protected].

  • Available now

    Bulk CSV import

    Load up to 50,000 POIs per file, attributes included, in one upload.

    • POST /v1/imports or the dashboard
    • Categories and attributes as columns
    • Processed and geocoded in the background
    Read the import guide
  • Available now

    Routing

    Put your POIs to work between A and B.

    • Routes that avoid POIs
    • Route clustering
    • Delivery optimization (VRPTW)
    Read the routing guides
  • Coming soon

    Data providers

    Ready-made datasets you can switch on next to your own POIs.

    • Speed cameras from SCDB
    • Weather
  • Coming soon

    Official SDKs

    Typed clients so you can skip the HTTP plumbing.

    • Laravel
    • Go
    • Node.js

Pricing

Pay for the capacity you use, nothing else

Choose how many requests per hour and how many POIs your team needs. Each is priced on its own, and the first 50 requests per hour and 1,000 POIs are free.

Start from a preset

Requests are counted per team and reset at the top of every hour (UTC), with at most a thirtieth of them in any minute (never fewer than 20). Routing calls that avoid POIs or optimize deliveries also use a daily allowance that resets at midnight UTC. The POI limit is the most your team can store at once.

Pro plan

€44/ month excl. VAT for 1,000 requests/hour, 50,000 POIs

Requests
1,000 / hour€29
POIs
50,000€15
Routing calls
400 / day
Members
Up to 10
Get Pro

Create your account, then confirm this plan and pay securely through Link, powered by Stripe. Prices exclude VAT, added at checkout where it applies. Billed monthly, cancel anytime.

Included in every plan

  • Every API feature, on every plan
  • POIs, typed attributes and categories
  • Distance, attribute and location search
  • Automatic reverse geocoding
  • Bulk CSV import
  • Routing, clustering and delivery optimization
  • API explorer, OpenAPI spec and Postman collection
  • Teams with roles and invites
  • Scoped API keys with expiry
  • Request logs and usage analytics

Quotas and limits apply to your whole team, and you can change plan from the dashboard at any time. Requests over the hourly quota or the per-minute burst cap get a 429, and imports stop once the POI limit is reached. Each requests tier includes a daily allowance of routing calls. Teams have up to 2 members on Free and 10 on any paid plan, pending invitations included. Each account can have one team on Free. Paid plans also get conditional requests: data that hasn't changed comes back as an empty 304 that costs a tenth of a request. POI tiers above 250,000 are set up by agreement.

FAQ

Frequently asked questions

Can't find what you are looking for? Email [email protected].

How is the price calculated?
You pick a tier for requests per hour and a tier for POIs, and the monthly price is the two tier prices added together. The smallest tier of each is free, so the Free plan gives you 50 requests per hour and 1,000 POIs at no cost.
Are there limits on the Free plan?
Each account can have one team on Free; to create another team, upgrade the first one. You also need a verified email address to create API keys.
What counts as a request?
Every call made with an API key counts toward your team's hourly quota, including calls that end in an error. A CSV import or a routing call counts as one request, however large. Calls rejected with a 429 because a limit is reached do not count.
What happens when I reach my request quota?
Requests over your hourly quota get a 429 JSON error and a Retry-After header until the quota resets at the top of the next hour (UTC). Each team can also send at most a thirtieth of its hourly quota in any minute, never fewer than 20; over that, the 429 tells you how many seconds to wait. The X-RateLimit-* headers on every response let you see it coming.
Is there a limit on how many POIs I can store?
Yes, every plan has a POI limit, 1,000 on Free. Once your team reaches it, creating more POIs is rejected until you delete some or move to a larger plan, and a running import stops at the limit and reports the rows it skipped.
Can I import POIs in bulk?
Yes. Upload a CSV with name, latitude, longitude, an optional category and one column per attribute, from the dashboard or with POST /v1/imports. It is processed in the background, and every new POI is geocoded.
Can I plan routes with my POIs?
Yes. POST /v1/routes plans a route that keeps away from the POIs you select, /v1/routes/clusters groups stops into compact areas, and /v1/routes/optimize assigns stops to vehicles around time windows and capacities. The API key needs the plan-routes permission. Avoiding POIs and optimizing deliveries use a daily allowance of routing calls set by your requests tier, from 20 on Free to 1,000 on the largest tier; clustering is free. See the routing guides.
Where do the addresses come from?
From OpenStreetMap, through Nominatim reverse geocoding. When you create a POI or change its coordinates, a background job fills in the street, display address, city, country and zipcode. Until then those fields are empty, and geocoded_at tells you when it last ran.
What can I store on a POI?
A name, coordinates, an optional category and any attributes your team defines. Attributes are typed as string, number or boolean, and you filter on them with attributes[name]=value, using either the attribute name or its ID.
How far can a distance search reach?
Up to 100 km. Pass latitude, longitude and a distance in meters; if you leave the distance out it defaults to 1,000 m. Each result includes its distance from the point.
How does pagination work?
List endpoints are cursor-paginated. Ask for 1 to 100 results with limit (15 by default) and pass the next value from the response as cursor to get the following page.
How many people can join my team?
Up to 2 on Free and 10 on any paid plan, pending invitations included. Members share the team's POIs, API keys and quotas, each with the role you give them.
Is my data separate from other customers?
Yes. POIs, attributes, categories and API keys all belong to a team, and a key can only ever reach the data of the team that created it.
Is there an SDK?
Not yet. Official SDKs for Laravel, Go and Node.js are coming soon. In the meantime the API is plain REST and JSON, so any HTTP client works. The docs have curl examples, and the API explorer lets you try every endpoint in the browser and download a Postman collection and an OpenAPI spec to generate a client from.
How do I get a larger plan?
Every account starts on Free. When you need more requests or more POIs, pick new tiers on the Plan & usage page of the dashboard and pay securely through Link, powered by Stripe. Prices exclude VAT, which is added at checkout where it applies. The new limits apply to your whole team right away and changes are prorated. You can cancel anytime and keep your limits until the end of the billing period. POI tiers above 250,000 are set up by agreement; for those, or anything beyond the largest tiers, email [email protected].

Put your places on the map, and in your API

Create a free account, generate a key and run your first nearby search today.