2GIS API & Scraper
The 2GIS API turns 2GIS, the business directory and map used across Russia, Kazakhstan, Central Asia, the Caucasus and the UAE, into JSON in five actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search finds businesses by words, by 2GIS category (rubric_id) or both, in one of 2GIS's regions (moscow, spb, novosibirsk, almaty, tashkent, bishkek, dubai and 200 more) or around a point with a radius, up to 50 rows a page: name and its brand, address, street and house, postcode, district and city, coordinates, categories, every phone with its display form, emails, websites, social links (VK, Telegram, WhatsApp, Instagram and others), opening hours per weekday, the branch's rating and review count, the brand's rating, photo count and the 2GIS link. Filters keep only businesses with photos, with a website, or open at a given weekday and time; results sort by relevance, rating, name or distance. detail returns one business card in full, adding 2GIS's attribute list (average bill, cuisine, payment, services), nearest metro stations and purpose. reviews pages through the public customer reviews, 50 at a time: star rating, text, dates, author name and review count, likes, photos and the business's reply. rubrics lists the category tree of a region with how many businesses each category holds, and cities lists every region 2GIS covers. One ReefAPI key, the standard { ok, data, meta, error } envelope, no 2GIS account.
Which 2GIS rating is which
A 2GIS business carries two ratings and three counts; they answer different questions. Field names as the API returns them, measured 2026-11-03 on one Moscow coffee shop.
| field | what it is | example (Здрасте coffee shop, Krymskaya nab. 10) |
|---|---|---|
| rating | This branch's rating, 1 to 5 | 4.7 |
| review_count | Reviews written about this branch | 114 |
| rating_count | Ratings given to this branch, with or without text | 130 |
| brand_rating | The rating of the whole brand, all its branches together | 4.9 |
| brand_review_count | Reviews of the whole brand | 17,258 |
| brand_branch_count | How many branches the brand has in 2GIS | 103 |
On 10 businesses in Moscow, St Petersburg, Almaty and Tashkent, the name, address, rating, review count, coordinates, phones and websites the API returned matched the business's own 2GIS page on all 70 checks.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/2gis/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "кофейня",
"city": "moscow"
}
}{
"ok": true,
"meta": {
"api": "2gis",
"endpoint": "search",
"mode": "live",
"latency_ms": 4528.7,
"record_count": 12,
"bytes": 4055727,
"cache_hit": false,
"stop_reason": "limit_reached",
"upstream_requests": 2,
"site_config_refreshed": true,
"site_config_bytes": 3955153,
"total": 5339,
"page": 1,
"page_size": 12,
"total_pages": 445,
"has_more": true,
"next_page": 2,
"page_out_of_range": false,
"region": {
"region_id": "32",
"code": "moscow",
"name": "Москва",
"country_code": "ru"
},
"region_defaulted": false,
"locale": "ru_RU",
"sort": "relevance",
"filters_applied": {},
"rows_skipped": 0,
"charged_credits": 2,
"version": "1.0.0",
"request_id": "257a7aa35b624c06",
"queue_ms": 2.5,
"fetched_at": "2026-11-03T13:40:22.246Z"
},
"data": {
"rows": [
{
"org_id": "70000001113359188",
"name": "Здрасте, кофейня",
"name_primary": "Здрасте",
"name_extension": "кофейня",
"type": "branch",
"brand_id": "70000001033681797",
"brand_name": "Здрасте, кофейня",
"brand_branch_count": 103,
"address": "Крымская набережная, 10 ст2",
"full_address": "Москва, Крымская набережная, 10 ст2",
"address_comment": null,
"street": "Крымская набережная",
"house": "10 ст2",
"postcode": "119049",
"country": "Россия",
"region": "Москва",
"city": "Москва",
"district": "Якиманка",
"latitude": 55.735952,
"longitude": 37.605268,
"rubrics": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
}
],
"phones": [
{
"number": "[trimmed-depth]",
"display": "[trimmed-depth]",
"comment": "[trimmed-depth]"
}
],
"emails": [],
"websites": [
"http://zdraste.ru",
"http://zdrastecafe.ru",
"http://t.me/+X0ITYNollx1iOGEy"
],
"social_links": [
{
"type": "[trimmed-depth]",
"url": "[trimmed-depth]",
"handle": "[trimmed-depth]"
},
{
"type": "[trimmed-depth]",
"url": "[trimmed-depth]",
"handle": "[trimmed-depth]"
}
],
"other_contacts": [],
"hours": {
"mon": [
"[trimmed-depth]"
],
"tue": [
"[trimmed-depth]"
],
"wed": [
"[trimmed-depth]"
],
"thu": [
"[trimmed-depth]"
],
"fri": [
"[trimmed-depth]"
],
"sat": [
"[trimmed-depth]"
],
"sun": [
"[trimmed-depth]"
]
},
"is_24x7": null,
"hours_comment": null,
"rating": 4.7,
"review_count": 114,
"rating_count": 130,
"brand_rating": 4.9,
"brand_review_count": 17258,
"photo_count": 63,
"main_photo_url": "https://i2.photo.2gis.com/main/branch/32/70000001113359188/common",
"is_advertiser": true,
"timezone_offset_min": 180,
"updated_at": "2026-10-05T05:39:06Z",
"url": "https://2gis.ru/moscow/firm/70000001113359188"
},
{
"org_id": "70000001064534699",
"name": "Comme à Paris, французская кофейня-кондитерская",
"name_primary": "Comme à Paris",
"name_extension": "французская кофейня-кондитерская",
"type": "branch",
"brand_id": "70000001018413368",
"brand_name": "Comme à Paris, французская кофейня-кондитерская",
"brand_branch_count": 2,
"address": "Ленинградский проспект, 36",
"full_address": "Москва, Ленинградский проспект, 36",
"address_comment": "1 этаж",
"street": "Ленинградский проспект",
"house": "36",
"postcode": "125167",
"country": "Россия",
"region": "Москва",
"city": "Москва",
"district": "Аэропорт",
"latitude": 55.792065,
"longitude": 37.561501,
"rubrics": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
}
],
"phones": [
{
"number": "[trimmed-depth]",
"display": "[trimmed-depth]",
"comment": "[trimmed-depth]"
}
],
"emails": [
"[redacted-email]"
],
"websites": [
"http://commeaparis.ru"
],
"social_links": [
{
"type": "[trimmed-depth]",
"url": "[trimmed-depth]",
"handle": "[trimmed-depth]"
},
{
"type": "[trimmed-depth]",
"url": "[trimmed-depth]",
"handle": "[trimmed-depth]"
},
{
"type": "[trimmed-depth]",
"url": "[trimmed-depth]",
"handle": "[trimmed-depth]"
}
],
"other_contacts": [],
"hours": {
"mon": [
"[trimmed-depth]"
],
"tue": [
"[trimmed-depth]"
],
"wed": [
"[trimmed-depth]"
],
"thu": [
"[trimmed-depth]"
],
"fri": [
"[trimmed-depth]"
],
"sat": [
"[trimmed-depth]"
],
"sun": [
"[trimmed-depth]"
]
},
"is_24x7": null,
"hours_comment": null,
"rating": 4.8,
"review_count": 26,
"rating_count": 32,
"brand_rating": 4.8,
"brand_review_count": 73,
"photo_count": 28,
"main_photo_url": "https://i5.photo.2gis.com/main/branch/32/70000001064534699/common",
"is_advertiser": true,
"timezone_offset_min": 180,
"updated_at": "2026-09-15T13:30:54Z",
"url": "https://2gis.ru/moscow/firm/70000001064534699"
},
{
"org_id": "70000001114794591",
"name": "Special, кофейня",
"name_primary": "Special",
"name_extension": "кофейня",
"type": "branch",
"brand_id": "70000001115608348",
"brand_name": "Special, кофейня",
"brand_branch_count": 1,
"address": "Сельскохозяйственная улица, вл35 к6",
"full_address": "Москва, Сельскохозяйственная улица, вл35 к6",
"address_comment": null,
"street": "Сельскохозяйственная улица",
"house": "вл35 к6",
"postcode": "129323",
"country": "Россия",
"region": "Москва",
"city": "Москва",
"district": "Останкинский",
"latitude": 55.853786,
"longitude": 37.623477,
"rubrics": [
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
},
{
"id": "[trimmed-depth]",
"name": "[trimmed-depth]",
"kind": "[trimmed-depth]",
"alias": "[trimmed-depth]"
}
],
"phones": [
{
"number": "[trimmed-depth]",
"display": "[trimmed-depth]",
"comment": "[trimmed-depth]"
}
],
"emails": [],
"websites": [
"http://onespecial.ru/"
],
"social_links": [],
"other_contacts": [],
"hours": {
"mon": [
"[trimmed-depth]"
],
"tue": [
"[trimmed-depth]"
],
"wed": [
"[trimmed-depth]"
],
"thu": [
"[trimmed-depth]"
],
"fri": [
"[trimmed-depth]"
],
"sat": [
"[trimmed-depth]"
],
"sun": [
"[trimmed-depth]"
]
},
"is_24x7": null,
"hours_comment": null,
"rating": 5,
"review_count": 23,
"rating_count": 29,
"brand_rating": 5,
"brand_review_count": 23,
"photo_count": 208,
"main_photo_url": "https://i8.photo.2gis.com/main/branch/32/70000001114794591/common",
"is_advertiser": true,
"timezone_offset_min": 180,
"updated_at": "2026-09-14T17:00:13Z",
"url": "https://2gis.ru/moscow/firm/70000001114794591"
}
]
}
}What the 2GIS API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search 2GIS businesses by text and/or rubric in a city, or around a point. Up to 50 rows per page with phones, emails, websites, social links, hours, rating and review count; filters for photos, website and open-at time; sort by relevance, rating, name or distance. Either query or rubric_id is required. | Support teams call search to search 2GIS businesses by text and/or rubric in a city, or around a point. | query, rubric_id, city, ll, radius, ... |
| detail | Full 2GIS business card by org_id (or firm url): everything a search row has plus the attribute list (average bill, cuisine, payment, amenities …), description, nearest metro stations and purpose. | Reputation platforms call detail to get full 2GIS business card by org_id (or firm url). | org_id, url, locale |
| reviews | Public customer reviews of one 2GIS business, newest first, up to 50 per page with cursor paging: star rating, text, dates, author name and review count, likes, photos and the business's reply. | Market researchers call reviews to get public customer reviews of one 2GIS business, newest first, up to 50 per page with cursor paging. | org_id, limit, cursor, sort |
| rubrics | 2GIS rubric (category) tree for a region: the 28-or-so top groups, or the rubrics under one group (parent_id), with how many branches and organisations each holds there. | B2B review analysts call rubrics to get 2GIS rubric (category) tree for a region. | city, parent_id, locale |
| cities | Every region 2GIS covers (207 on 2026-11-03): region id, code, name, country, locale, time zone and centre point — the values `city` accepts. | Support teams call cities to get every region 2GIS covers (207 on 2026-11-03). | country, locale |
Call search from your stack
curl -X POST https://api.reefapi.com/2gis/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"кофейня","city":"moscow"}'import requests
r = requests.post(
"https://api.reefapi.com/2gis/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "кофейня",
"city": "moscow"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/2gis/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "кофейня",
"city": "moscow"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.2gis.search with {"query":"кофейня","city":"moscow"}.Who uses this API and why
- Lead lists: search a category in a city with has_website and collect phones, emails, websites and socials.
- Local market mapping: rubrics for the category tree, then search by rubric_id to count and locate every business.
- Reputation monitoring: reviews newest first for a branch, with the business's own replies.
- Store-locator data: every branch of a brand with coordinates, hours and phones.
- Site selection: search around a point with radius and sort=distance to see the competition nearby.
Questions developers ask before integrating
Which countries and cities does it cover?
Every region in 2GIS's own list: 207 on 2026-11-03, of them 153 in Russia, 19 in Kazakhstan, 3 in Uzbekistan, 3 in Georgia, and Kyrgyzstan, Tajikistan, Belarus, Armenia, Azerbaijan, Cyprus and the UAE. The cities action lists them with the code to pass as city. The whole UAE is one region (dubai). The 14 Saudi regions are in the list but 2GIS holds buildings there, not businesses, so a business search there comes back empty.
Does it return phone numbers and websites?
Yes, exactly as 2GIS publishes them on the business: every phone (international number and the display form), emails, websites and social links. On 132 search rows across 11 cities, 128 had a phone, 120 a social link, 89 a website and 80 an email; Dubai rows had no emails and Bishkek rows no websites.
How many results can I get for one search?
Up to 50 per page, and the search pages through its whole result set: 'аптека' in St Petersburg had 1,903 results, 39 pages of 50; page 40 comes back empty with meta.page_out_of_range. meta.total is 2GIS's own count; three pages in a row gave 60 different businesses.
Can I search around a point instead of a city?
Yes. ll takes longitude,latitude (longitude first). With radius in metres it keeps only that circle (22 coffee shops within 500 m of Red Square); with sort=distance it orders the results nearest first.
How do I get all reviews of a business?
Call reviews with the org_id from a search row; each page has up to 50 reviews, newest first, and meta.next_cursor opens the next page. A business with 113 reviews came back in three pages (50, 50 and 4) with no review repeated. meta.review_count is 2GIS's count for the branch.
Which filters work?
rubric_id (a 2GIS category; 'кофейня' in Moscow 5,339 → 3,677 coffee shops), has_photos (→ 5,100), has_website (→ 3,140), open_at with a weekday and time (Monday 23:30 → 205), and ll with radius. Each was measured against the same search without it.
Which language are names in?
Each region's own language by default: Russian in Russia, English in Dubai, Russian in Almaty and Tashkent. locale changes it, for example en_AE or ar_AE in Dubai.
What is the org_id?
2GIS's id of the branch, the number in 2gis.ru/<city>/firm/<id>. detail and reviews take it, or the 2GIS link itself.
What is the 2GIS API?
2GIS API is a ReefAPI endpoint group for 2gis business directory as json: businesses by query, category or point across russia, kazakhstan, central asia and the uae, with phones, emails, websites, social links, hours, rating and review count, plus full business cards, customer reviews, the category tree and the region list. It returns live JSON through POST requests under /2gis/v1.
Is the 2GIS API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. 2GIS calls use the same shared credit balance as every other ReefAPI engine.
Do I need a 2GIS login or account?
No login to 2GIS is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the 2GIS data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the 2GIS API use?
2GIS actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call 2GIS from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call 2gis actions with the same key, credit pool and JSON envelope used by normal REST requests.