# TikTok Place / Location Scraper (`maximedupre/tiktok-location-scraper`) Actor

Get public TikTok videos tagged at any place from place links, IDs, or place names. Or get place details with address, category, rating, photos, and optional reviews. Each video row has views, likes, creator, music, and GPS coordinates.

- **URL**: https://apify.com/maximedupre/tiktok-location-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Travel, Videos
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 1,000 place videos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 📍 See what people post at any TikTok place

TikTok Location Scraper is for marketers, travel and food researchers, and local businesses who want to see what happens at a real place on TikTok. Add TikTok place links, place IDs, or place names. You get the public videos tagged at each place, with views, likes, creators, music, and the exact tagged place. Or you get the place details, such as address, category, rating, photos, and public reviews. You need no TikTok account, and you get clean rows that you can sort and export.

- Collect every public video tagged at a landmark, venue, or shop with this **[TikTok location scraper](https://apify.com/maximedupre/tiktok-location-scraper/examples/tiktok-location-scraper)**.
- Build a list of matching spots with addresses, categories, and ratings using a **[TikTok places scraper](https://apify.com/maximedupre/tiktok-location-scraper/examples/tiktok-places-scraper)**.
- Read star ratings, text, and photos from visitors with a **[TikTok place reviews scraper](https://apify.com/maximedupre/tiktok-location-scraper/examples/tiktok-place-reviews-scraper)**.
- Find hotels, restaurants, and other spots that offer bookings or deals with a **[TikTok deals scraper](https://apify.com/maximedupre/tiktok-location-scraper/examples/tiktok-deals-scraper)**.
- Look up the branches of a chain or a type of shop in one country with a **[TikTok business locations scraper](https://apify.com/maximedupre/tiktok-location-scraper/examples/tiktok-business-locations-scraper)**.

#### 🎬 Place videos and place details from TikTok

You choose one of two row types for each run:

- **Place videos:** one row for each public video tagged at a place. Each row has the video ID and link, caption, hashtags, post date, length, cover image, and a direct video file link when TikTok gives one. It also has views, likes, comments, shares, and saves, the creator's profile with follower and total like counts when TikTok shows them, the music title and artist, and the tagged place with its address, city, and GPS coordinates.
- **Places:** one row for each place. Each row has the place name, link, address, city, country, category, subcategory, GPS coordinates, and the total number of TikTok videos tagged there. It also has the average star rating, review count, and photos when TikTok shows them. When you turn on reviews, each place row also lists its public reviews with rating, text, photos, author, like count, and date.

#### 🚀 How to scrape a TikTok location

1. Add TikTok place links or IDs, place names to search, or both.
2. Pick **Place videos** or **Places** in **Result type**.
3. Set how many rows you want in total, and how many videos or reviews you want for each place.
4. Start the run. Rows show up in the dataset while the run works.
5. Download your results as JSON, CSV, Excel, or another format, or read them through the Apify API.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `placeUrls` | array of strings | TikTok place links, such as `https://www.tiktok.com/place/Eiffel-Tower-22535796485551493`, or place IDs, such as `22535796485551493`. Add one per line. |
| `searchQueries` | array of strings | Place names or keywords to search for on TikTok, such as a restaurant, a landmark, or a city. Add one per line. The form starts with `Eiffel Tower` filled in. |
| `maxItems` | integer | The most rows to save in total. Leave it empty or use `0` to get all available results. The form starts with `20`. |
| `resultType` | string | Required. `videos` (Place videos) saves one row for each video tagged at a place. `places` (Places) saves one row for each place. The form starts with `videos`. |
| `maxVideosPerPlace` | integer | Place videos only. The most videos to get for each place. Leave it empty or use `0` to get every video TikTok shows for the place. The form starts with `10`. |
| `includeReviews` | boolean | Places only. Adds public reviews to each place row. Default: `false`. Each review has its own charge. |
| `maxReviewsPerPlace` | integer | The most reviews to get for each place, where available. Use `0` to get every review. Default: `20`. It works only when `includeReviews` is on. |
| `country` | string | Two-letter country code to search places in, such as `US`, `FR`, or `JP`. It applies only to `searchQueries`. Leave it empty to let TikTok choose. |
| `maxPlacesPerQuery` | integer | How many matching places to take for each place name, best match first. Default: `1`. The lowest value is `1`. Use more for chains or common names. |
| `dealsOnly` | boolean | Finds only places that offer bookings or deals on TikTok. It applies only to `searchQueries`. Default: `false`. |

You must add at least one place link, place ID, or place name. A value in the form that the form "starts with" is a prefill. It is not used when you leave the field out of an API call.

**Example input**

```json
{
  "searchQueries": [
    "Eiffel Tower"
  ],
  "maxItems": 20,
  "resultType": "videos",
  "maxVideosPerPlace": 10,
  "includeReviews": false,
  "maxReviewsPerPlace": 20,
  "maxPlacesPerQuery": 1,
  "dealsOnly": false
}
```

#### 🧾 Output

**Output fields**

Each run saves one of two row shapes. `recordType` tells you which one a row is. A field is left out when TikTok does not show it.

**Place video row**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `video` for this row. |
| `id` | string | TikTok ID of the video. |
| `url` | string | Link to the video on TikTok. |
| `caption` | string | Caption text of the video. |
| `hashtags` | array of strings | Hashtags of the video, without the # sign. Empty when there are none. |
| `postedAt` | string | Date and time when the video was posted, in ISO 8601 format. |
| `durationSeconds` | number | Length of the video in seconds. |
| `coverUrl` | string | Link to the cover image of the video. |
| `videoUrl` | string | Direct link to the video file when TikTok gives one. The link can stop working after some time. |
| `viewCount` | integer | Number of times the video was played. |
| `likeCount` | integer | Number of likes on the video. |
| `commentCount` | integer | Number of comments on the video. |
| `shareCount` | integer | Number of times the video was shared. |
| `saveCount` | integer | Number of times the video was saved. |
| `creator.id` | string | TikTok ID of the creator account. |
| `creator.username` | string | TikTok username of the creator, without the @ sign. |
| `creator.displayName` | string | Display name of the creator. |
| `creator.url` | string | Link to the creator profile on TikTok. |
| `creator.avatarUrl` | string | Link to the creator profile picture. |
| `creator.isVerified` | boolean | `true` when TikTok shows the creator as verified. |
| `creator.bio` | string | Profile bio text of the creator. |
| `creator.followerCount` | integer | Number of followers of the creator when TikTok shows it. |
| `creator.likeCount` | integer | Total likes on all videos of the creator when TikTok shows it. |
| `music.title` | string | Title of the music in the video. |
| `music.artist` | string | Artist or author of the music. |
| `place.id` | string | TikTok ID of the place the video is tagged at. |
| `place.name` | string | Place name shown on TikTok. |
| `place.address` | string | Street address of the place. |
| `place.city` | string | City of the place. |
| `place.latitude` | number | Latitude of the place in decimal degrees. |
| `place.longitude` | number | Longitude of the place in decimal degrees. |

**Example place video row**

```json
{
  "recordType": "video",
  "id": "7689599259515030791",
  "url": "https://www.tiktok.com/@melquinterooo/video/7689599259515030791",
  "caption": "Acompañenme a ver esta triste historia 🫠🫠 #torreeiffel #paris #foryoupage #france #fyp ",
  "hashtags": [
    "torreeiffel",
    "paris",
    "foryoupage",
    "france",
    "fyp"
  ],
  "postedAt": "2026-09-25T22:12:35.000Z",
  "durationSeconds": 15,
  "coverUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/o0A8EiUvgrYBB8BAxnDa24EAAjlbC0nnAIiPd~tplv-tiktokx-origin.image?dr=9636&x-expires=1793332800&x-signature=gM4FINkxkxJpsU5lU4hYWvSAV9k%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
  "videoUrl": "https://www.tiktok.com/aweme/v1/play/?faid=1988&file_id=5d951bed58f742d3b0309a0cc096f9a1&is_play_url=1&item_id=7689599259515030791&line=0&ply_type=2&pt=YXdlbWUud2ViLndlYmFwaSYvYXBpL3BvaS9pdGVtX2xpc3QvJjIwMjYxMDI4MDQzMDUwRjM1NjI2MTREMzlERTkwOTA2N0MmMTc5MzE2MTg1MCY0YmY4ODIxY2YzZmM&signaturev3=dmlkZW9faWQ7ZmlsZV9pZDtpdGVtX2lkLjBiMTQ0ZTM2OGI3OWRlODQ2ODQwZWJkYTU3OGJiZDZk&tk=tt_chain_token&video_id=v1c044g50000darf3i7og65juqielp1g",
  "viewCount": 7400000,
  "likeCount": 766800,
  "commentCount": 7006,
  "shareCount": 5869,
  "saveCount": 17110,
  "creator": {
    "id": "6814515566536180741",
    "username": "melquinterooo",
    "displayName": "Mel",
    "url": "https://www.tiktok.com/@melquinterooo",
    "avatarUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7334025623674978309~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=bd9a5b36&x-expires=1793332800&x-signature=g9zFQZ8YtyXDD%2F9oTcH4kEk%2Fjuw%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast5",
    "isVerified": false,
    "bio": "Lifestyle, Fitness & Travel \nArg 🇦🇷\n\n\n• IG @melquinteroo",
    "followerCount": 54800,
    "likeCount": 1100000
  },
  "music": {
    "title": "Groove Token",
    "artist": "Tom Webster"
  },
  "place": {
    "id": "42203861110571891",
    "name": "Eiffel Tower",
    "address": "43 Rue Rouelle, 75015 Paris, France",
    "city": "Paris",
    "latitude": 48.849872,
    "longitude": 2.289067
  }
}
```

**Place row**

| Field | Type | What it does |
| --- | --- | --- |
| `recordType` | string | Always `place` for this row. |
| `id` | string | TikTok ID of the place. |
| `name` | string | Place name shown on TikTok. |
| `url` | string | Link to the place page on TikTok. |
| `address` | string | Street address of the place. |
| `city` | string | City of the place. |
| `country` | string | Country of the place. |
| `category` | string | Main category of the place. |
| `subcategory` | string | More exact category of the place. |
| `latitude` | number | Latitude of the place in decimal degrees. |
| `longitude` | number | Longitude of the place in decimal degrees. |
| `videoCount` | integer | Total number of TikTok videos tagged at the place. |
| `rating` | number | Average star rating of the place when TikTok shows it. |
| `reviewCount` | integer | Total number of reviews of the place when TikTok shows it. |
| `photoUrls` | array of strings | Links to photos of the place. Empty when TikTok shows none. |
| `reviews` | array of objects | Public reviews of the place. Only there when `includeReviews` is on. Empty when TikTok shows no reviews. |
| `reviews.rating` | number | Star rating the author gave, from 1 to 5. |
| `reviews.text` | string | Text of the review. |
| `reviews.photoUrls` | array of strings | Links to photos added to the review. Empty when there are none. |
| `reviews.authorName` | string | Name of the review author shown on TikTok. |
| `reviews.authorAvatarUrl` | string | Link to the profile picture of the review author. |
| `reviews.likeCount` | integer | Number of likes on the review. |
| `reviews.createdAt` | string | Date and time when the review was posted, in ISO 8601 format. |

**Example place row with reviews**

This example is shortened. The `"..."` values mark photos and reviews that were left out to keep it short.

```json
{
  "recordType": "place",
  "id": "22535865202508922",
  "name": "Louvre Museum",
  "url": "https://www.tiktok.com/place/Louvre-Museum-22535865202508922",
  "address": "75001 Paris, France",
  "city": "Paris",
  "country": "France",
  "category": "Outdoors and Attractions",
  "subcategory": "Museum",
  "latitude": 48.860611,
  "longitude": 2.337644,
  "videoCount": 230169,
  "rating": 4.9,
  "reviewCount": 22895,
  "photoUrls": [
    "https://p16-tiktok-poi-picture-sign-sg.ibyteimg.com/tos-alisg-i-0x5759trmt-sg/954768a278826fd4e7e7fd6562ff5f4a~tplv-0x5759trmt-image-origin-heic-v1.heic?rk3s=733ab7a5&x-expires=1824697851&x-signature=H31Uw1xpMigefEokffnrZN7T9jI%3D",
    "https://p16-tiktok-poi-picture-sign-sg.ibyteimg.com/tos-alisg-i-0x5759trmt-sg/096f2a7d77d0cae93bef0949082154f2~tplv-0x5759trmt-image-origin-heic-v1.heic?rk3s=733ab7a5&x-expires=1824697851&x-signature=Vc7J9mknsDxfYm5yzv0eJImOZUU%3D",
    "..."
  ],
  "reviews": [
    {
      "rating": 5,
      "text": "As expected of a world-famous museum, the Louvre was super crowded.\nYou should definitely buy your Louvre tickets in advance!\nThe exhibits keep you completely captivated from start to finish.\nIf you’re visiting the Louvre, you definitely have to check out Musée de l'Orangerie too!",
      "photoUrls": [
        "https://p19-comment-sign-sg.tiktokcdn.com/tos-alisg-i-zt8igodiya-sg/9818115caaa083e20a5f9b2652622cde~tplv-jj85edgx6n-image-origin.image?dr=8569&refresh_token=9b2d23df&x-expires=1824696000&x-signature=Fc577F7j%2FPyxEBQty0KpfuYydr4%3D&t=67a6c45e&ps=a0626fcd&shp=d057eb96&shcp=d057eb96&idc=my",
        "..."
      ],
      "authorName": "_i_quan",
      "authorAvatarUrl": "https://p16-common-sign.tiktokcdn.com/tos-alisg-avt-0068/b0663f2477e5a52a69da1f1a5d1ab481~tplv-tiktokx-cropcenter:1080:1080.webp?dr=14579&refresh_token=e0e7baf2&x-expires=1793246400&x-signature=kvGAeg8AvMYthx35LHpCaPsQXTA%3D&t=4d5b0474&ps=13740610&shp=30310797&shcp=8047b050&idc=my",
      "likeCount": 19,
      "createdAt": "2026-09-29T03:37:38.000Z"
    },
    "..."
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. You pay only for the place videos, places, and reviews it saves.

| Event | When you pay | Price |
| --- | --- | --- |
| Place video | Each video row saved | $0.0002 ($0.20 for 1,000 videos) |
| Place | Each place row saved | $0.0009 on Free, Bronze, and Silver plans. $0.0008 on Gold, Platinum, and Diamond plans. |
| Review | Each review added to a place row | $0.0009 on Free and Bronze plans. $0.00075 on Silver. $0.00045 on Gold, Platinum, and Diamond plans. |

Reviews cost nothing when `includeReviews` is off. You pay only when a row is saved, so work that saves no row has no charge. Use `maxItems`, `maxVideosPerPlace`, and `maxReviewsPerPlace` to control your cost. When your run reaches its spending limit, the Actor stops saving rows. If the limit runs out in the middle of a place's reviews, that place row keeps only the reviews you paid for.

#### 🔌 Integrations

You can connect this Actor to other apps and tools on Apify. Send results to Google Sheets, Slack, Zapier, Make, or your own webhook, or start runs on a schedule. You can also run it and read its dataset through the Apify API. This video shows how integrations work:

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I get the GPS coordinates of each place?

Yes. Place rows have `latitude` and `longitude`. Place video rows have them inside `place`, for the exact place the video is tagged at.

##### What happens when I search a common name, like a coffee chain?

By default the Actor takes only the best match for each name. Set `maxPlacesPerQuery` higher to take more matches, best match first. Add `country` to search in one country only.

##### Can I get every video at a place, not just the first few?

Yes. Set `maxVideosPerPlace` to `0` and leave `maxItems` empty or at `0`. You then get every video TikTok shows for the place.

##### Do I need a TikTok account, cookies, or a login?

No. The Actor reads public TikTok data only. It does not need your TikTok account.

##### Can I download the video files?

Each video row has a `videoUrl` link to the video file when TikTok gives one. The Actor does not store the files. The link can stop working after some time, so use it soon after the run.

##### Why is a field missing from some rows?

TikTok does not show every detail for every video, creator, or place. For example, a rating appears only when the place has one. A missing field means TikTok did not show it.

##### Can I get private or deleted videos?

No. The Actor gets only public videos and places that TikTok shows.

### 📝 Changelog

**v0.0** (28-10-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~tiktok-location-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [TikTok Place Posts Scraper](https://apify.com/maximedupre/tiktok-place-posts-scraper): get public TikTok posts from place links or IDs when you only need the videos.
- [Instagram Location Posts Scraper](https://apify.com/maximedupre/instagram-location-posts): collect public Instagram posts tagged at a location to compare with TikTok.
- [TikTok Search Scraper](https://apify.com/maximedupre/tiktok-search-results-scraper): search public TikTok videos or creators by keyword, such as a city or venue name.
- [TikTok Hashtag Search Scraper](https://apify.com/maximedupre/tiktok-hashtag-search-scraper): find hashtag ideas and stats for a place, such as #paris or #eiffeltower.
- [TikTok Creator Analytics Scraper](https://apify.com/maximedupre/tiktok-creator-analytics): look deeper into the creators who post at a place, with audience totals and recent posts.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `placeUrls` (type: `array`):

TikTok place links, such as https://www.tiktok.com/place/Eiffel-Tower-22535796485551493, or place IDs, such as 22535796485551493. Add one per line.

## `searchQueries` (type: `array`):

Place names or keywords to search for on TikTok, such as a restaurant, a landmark, or a city. Add one per line.

## `maxItems` (type: `integer`):

The most rows to save in total. Leave empty or use 0 to get all available results.

## `resultType` (type: `string`):

Place videos saves one row for each video tagged at a place. Places saves one row for each place, with its details and, if you turn them on, its reviews.

## `maxVideosPerPlace` (type: `integer`):

The most videos to get for each place. Leave empty or use 0 to get every video TikTok shows for the place.

## `includeReviews` (type: `boolean`):

Add public reviews to each place row: star rating, text, photos, author, like count, and date. Each review has its own charge.

## `maxReviewsPerPlace` (type: `integer`):

Up to this many reviews for each place, where available. Use 0 to get every review. This works only when Include reviews is on.

## `country` (type: `string`):

Two-letter country code to search places in, such as US, FR, or JP. This applies only to place names to search. Leave empty to let TikTok choose.

## `maxPlacesPerQuery` (type: `integer`):

How many matching places to take for each place name to search, best match first. Use more than 1 for chains or common names.

## `dealsOnly` (type: `boolean`):

Find only places that offer bookings or deals on TikTok. This applies only to place names to search.

## Actor input object example

```json
{
  "searchQueries": [
    "Eiffel Tower"
  ],
  "maxItems": 20,
  "resultType": "videos",
  "maxVideosPerPlace": 10,
  "includeReviews": false,
  "maxReviewsPerPlace": 20,
  "maxPlacesPerQuery": 1,
  "dealsOnly": false
}
```

# Actor output Schema

## `results` (type: `string`):

Open the default dataset to see one row for each saved TikTok place video or TikTok place.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "Eiffel Tower"
    ],
    "maxItems": 20,
    "resultType": "videos",
    "maxVideosPerPlace": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/tiktok-location-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["Eiffel Tower"],
    "maxItems": 20,
    "resultType": "videos",
    "maxVideosPerPlace": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/tiktok-location-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "Eiffel Tower"
  ],
  "maxItems": 20,
  "resultType": "videos",
  "maxVideosPerPlace": 10
}' |
apify call maximedupre/tiktok-location-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/tiktok-location-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Gav2CxECo9mR2Kr2H/builds/sl4ZZlSt7qrOjGM1r/openapi.json
