Places (beta)

The places creators tag on their TikTok and Instagram posts: a shopping centre, a beach, a stadium, a suburb or a city. Find the places Virlo has seen, see how many videos are tagged at each, and read the videos tagged there.

At a glance
What it does
Finds places by name, suburb, postcode or country, ranked by how many Virlo videos are tagged there, and lists the videos tagged at one of them.
You send
A name, suburb, postcode or country. Or a place id for its videos.
You get back
Within seconds, places with their suburb, postcode, coordinates and video count, or the videos tagged at one place.
Cost
$0.05 per call, even when nothing matches. Failed requests are free.

What a place is

  • A place is the tag the creator chose, not GPS. When a creator posts on TikTok or Instagram they can tag a location. It is usually where the video was filmed, and sometimes it is wrong (a Melbourne Cup video tagged "Gulf of Carpentaria"). Say "tagged at", not "filmed at".
  • About 1 TikTok or Instagram video in 7 carries a tag. YouTube has no place tag, so YouTube videos never have one. A place's videos are the tagged ones in Virlo's library, not every video made there.
  • Venues and areas. kind is venue (a business, landmark, beach, station) or area (a suburb, city, state or country). Instagram sends no type, so its places have kind: null.
  • Places and crowds only. These endpoints describe places and what people post there. There is no way to list where one creator has been, and Virlo will not add one.
  • New since November 2026. Virlo started keeping tags on Nov 7 2026 and is filling in older TikTok videos, so counts grow over time.

Location on videos

Every video read from Virlo's library carries location: the place its creator tagged, or null when there is no tag. It is on search results, agent videos, the videos digest and the per-platform digests, and a sound's videos. The fields are listed under Fields.

location on a video

"location": {
  "id": "20267999-d417-4ef0-ab3f-06d09a387454",
  "name": "Queen Victoria Market",
  "kind": "venue",
  "category": "Shopping",
  "locality": "Melbourne",
  "postcode": "3000",
  "city": "Melbourne",
  "region": "VIC",
  "country": "AU",
  "lat": -37.806809,
  "lng": 144.959434
}

GET/v1/places

Search places

The places Virlo has seen that match your filters, most tagged first (by video_count, then name).

Cost per request:$0.05

Query parameters

Send at least one of q, locality, postcode or country. An unknown parameter returns 400.

  • Name
    q
    Type
    string
    Description

    Place name contains this, not case-sensitive: chadstone, bondi beach, coles. 2 to 100 characters.

  • Name
    locality
    Type
    string
    Description

    Suburb, town or city, matched exactly (not case-sensitive) against the place's locality or city: St Kilda, Melbourne, Brooklyn. Letters, digits, spaces, ., ' and - only.

  • Name
    postcode
    Type
    string
    Description

    Postcode, matched exactly: 3182, 10001.

  • Name
    country
    Type
    string
    Description

    ISO 3166 alpha-2: AU, US, GB.

  • Name
    kind
    Type
    string
    Description

    venue or area. Instagram places have no kind and match neither.

  • Name
    page
    Type
    integer
    Description

    Default 1.

  • Name
    limit
    Type
    integer
    Description

    Default 50, maximum 100.

pagination.total is exact. A search that matches more than 5,000 places returns 400: narrow it with q, locality, postcode or kind.

Request

GET
/v1/places
curl "https://api.virlo.ai/v1/places?locality=Melbourne&country=AU&limit=2" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": "1f713019-cf97-4006-ad1b-fb20ce05a199",
      "name": "Flemington Racecourse",
      "kind": "venue",
      "category": "Leisure",
      "locality": "Flemington",
      "postcode": "3031",
      "city": "Melbourne",
      "region": "VIC",
      "country": "AU",
      "lat": -37.78547,
      "lng": 144.91902,
      "video_count": 79
    },
    {
      "id": "b7fa189b-df27-44c5-9f83-e483927c8e18",
      "name": "Melbourne Cricket Ground",
      "kind": "venue",
      "category": "Leisure",
      "locality": "Richmond",
      "postcode": "3002",
      "city": "Melbourne",
      "region": "VIC",
      "country": "AU",
      "lat": -37.819919,
      "lng": 144.98335,
      "video_count": 73
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 2,
    "total": 245,
    "total_pages": 123,
    "has_next_page": true,
    "has_prev_page": false
  }
}

GET/v1/places/{id}/videos

Videos tagged at a place

The videos in Virlo's library whose creator tagged this place, newest first. Each video has the same fields as a search result, including location. The answer also carries the place.

Cost per request:$0.05

Path parameters

  • Name
    id
    Type
    string
    Required
    *
    Description

    A place id, from search places or a video's location.id.

Query parameters

  • Name
    sort
    Type
    string
    Description

    newest (default) or most_views.

  • Name
    page
    Type
    integer
    Description

    Default 1.

  • Name
    limit
    Type
    integer
    Description

    Default 25, maximum 25. Larger values are cut to 25.

An unknown id returns 404 not_found. pagination.total is exact.

Request

GET
/v1/places/{id}/videos
curl "https://api.virlo.ai/v1/places/1f713019-cf97-4006-ad1b-fb20ce05a199/videos?sort=most_views&limit=1" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": {
    "place": {
      "id": "1f713019-cf97-4006-ad1b-fb20ce05a199",
      "name": "Flemington Racecourse",
      "kind": "venue",
      "category": "Leisure",
      "locality": "Flemington",
      "postcode": "3031",
      "city": "Melbourne",
      "region": "VIC",
      "country": "AU",
      "lat": -37.78547,
      "lng": 144.91902,
      "video_count": 79
    },
    "videos": [
      {
        "id": "4b1f7a52-9c3e-4f0a-8d21-6e5a2c9b7d10",
        "url": "https://www.tiktok.com/@victoriaracingclub/video/7702789419979279637",
        "platform": "tiktok",
        "views": 296977,
        "likes": 15200,
        "publish_date": "2026-11-04T05:12:40",
        "virality_score": 21.4,
        "author": { "username": "victoriaracingclub", "followers": 88000, "verified": true },
        "upload_region": "AU",
        "location": { "id": "1f713019-cf97-4006-ad1b-fb20ce05a199", "name": "Flemington Racecourse", "kind": "venue", "locality": "Flemington", "country": "AU" }
      }
    ]
  },
  "pagination": {
    "page": 1,
    "limit": 1,
    "total": 79,
    "total_pages": 79,
    "has_next_page": true,
    "has_prev_page": false
  }
}

Shortened: each video has every search result field.


Filter a video search by place

POST /v1/search/videos takes places: a list of place words, any of them. A word matches as a phrase inside the place name ("chadstone" matches "Chadstone Shopping Centre") or exactly against its suburb, city or postcode. ["*"] means any video with a tagged place.

A library search with places alone is too broad: add a platform, region, topic or date window. To read every video at one place, use videos tagged at a place.

Tagged in Melbourne, on TikTok

curl -X POST "https://api.virlo.ai/v1/search/videos" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "scope": "virlo_library", "places": ["melbourne"], "platforms": ["tiktok"] }'

applied then includes place: melbourne. Search pricing is unchanged: $0.05 per library page of 25 with results.

Search near a point

near takes map points instead of names: each item is "lat,lng,km", a latitude, a longitude and a radius in km from 0.1 to 200, any of them. A video matches when its tagged place's own map point lies inside the radius, so untagged videos never match. Take the point from a place's lat and lng above, or from your own geocoder. With places as well, a video must match both. A point out of range is a 400 and is not charged.

Like places, near alone is too broad for the library: add a platform, region, topic or date window.

Tagged within 5 km of central Melbourne, on TikTok

curl -X POST "https://api.virlo.ai/v1/search/videos" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "scope": "virlo_library", "near": ["-37.8136,144.9631,5"], "platforms": ["tiktok"] }'

applied then includes near a point. The price is the same as any library search page.

Fields

A place, and a video's location, have:

  • Name
    id
    Type
    string
    Description

    Virlo place id.

  • Name
    name
    Type
    string
    Description

    The place name as the platform shows it.

  • Name
    kind
    Type
    string | null
    Description

    venue or area. null on Instagram, which sends no type.

  • Name
    category
    Type
    string | null
    Description

    TikTok's top-level place category, like Food and Drink, Shopping or Leisure. null on Instagram.

  • Name
    locality
    Type
    string | null
    Description

    Suburb or town read from the place's street address (Australian, New Zealand, US and Canadian formats). null when the address does not parse; never guessed.

Costs and errors

  • GET /v1/places: $0.05 (5 credits) per call.
  • GET /v1/places/{id}/videos: $0.05 (5 credits) per call, up to 25 videos. The same price per video as a search library page.
  • Calls that return nothing are still charged. Errors are never charged.
  • 400 validation_error: no search field, a bad field, or more than 5,000 matching places.
  • 404 not_found: unknown place id.

The X-Cost response header is the exact charge for each call.

Was this page helpful?