ამ გვერდზე
დოკუმენტაცია
GeoAPI-ს რამდენიმე წუთში დაუკავშირდებით: REST API-ით, ვიჯეტით, AI ასისტენტით, SDK-ით ან CLI-ით. ყველა მისამართს (endpoint) აქვს მოთხოვნის მაგალითი (cURL, Node.js, Python, PHP) და პასუხის ნიმუში.
სწრაფი დასაწყისი
- დარეგისტრირდით და დაადასტურეთ ელფოსტა. ახალ ანგარიშზე Cars API უკვე ჩართულია; მისი გამორთვა ან ხელახლა ჩართვა შეგიძლიათ გვერდზე /account/products.
- კაბინეტში შექმენით პროექტი და მისი საიდუმლო გასაღები (geoapi_sk_…). გასაღები მხოლოდ ერთხელ, შექმნისთანავე ჩანს, ამიტომ მაშინვე შეინახეთ სერვერზე.
- გაგზავნეთ პირველი მოთხოვნა თქვენი სერვერიდან (იხ. ქვემოთ). თუ პასუხი 200-ია და data სიას შეიცავს, ყველაფერი მუშაობს.
- ამორჩევის ფორმა ააწყვეთ ამ თანმიმდევრობით: ბრენდები → მოდელები (ბრენდის slug-ით) → წლები → თაობები → მოდიფიკაციები. ყოველი slug და id წინა პასუხიდან აიღეთ.
curl "https://geoapi.ge/api/v1/brands?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
401 ნიშნავს, რომ გასაღები მითითებული არ არის, არასწორია ან გაუქმებულია. 403 ნიშნავს, რომ გასაღები სწორია, მაგრამ წვდომა დახურულია: ელფოსტა დაუდასტურებელია, პროექტი გამორთულია ან Cars API გამორთულია.
დაკავშირების სხვა გზები: ვებგვერდზე ვიჯეტი საჯარო გასაღებით (geoapi_pk_…), AI ასისტენტში (Claude, Codex, Cursor) MCP სერვერი, Node.js სერვერზე კი TypeScript SDK ან CLI. საიდუმლო გასაღები ვებგვერდზე არასოდეს ჩასვათ.
ბრენდები
ბრენდების სია. page ნაგულისხმევად 1-ია. limit ნაგულისხმევად 100-ია და 1000-ს არ აღემატება. per_page იგივე პარამეტრია, როცა limit მითითებული არ არის. sort არის name, id ან modified. direction არის asc ან desc. q სახელსა და slug-ში ეძებს.
curl "https://geoapi.ge/api/v1/brands?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/brands?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/brands?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/brands?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "1",
"slug": "toyota",
"name": "Toyota",
"synonyms": [
"Тойота"
],
"is_lcv_or_commercial": false,
"logo_url_light": null,
"logo_url_dark": null,
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 120
},
"collection": {
"count": 1,
"total": 120,
"pages": 120,
"next": "/api/v1/brands?page=2&limit=1",
"prev": null,
"first": "/api/v1/brands?page=1&limit=1",
"last": "/api/v1/brands?page=120&limit=1"
}
}
მოდელები
ერთი ბრენდის მოდელები. slug ბრენდების პასუხიდან აიღეთ. ფილტრი: body (ძარის ტიპი).
curl "https://geoapi.ge/api/v1/brands/toyota/models?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/brands/toyota/models?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/brands/toyota/models?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/brands/toyota/models?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "690",
"brand_id": "1",
"slug": "camry",
"name": "Camry",
"markets": [
"JP",
"US"
],
"has_generations": true,
"generations_count": 1,
"photo_url": "https://geoapi.ge/api/v1/models/690/photo",
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 40
},
"collection": {
"count": 1,
"total": 40,
"pages": 40,
"next": "/api/v1/brands/toyota/models?page=2&limit=1",
"prev": null,
"first": "/api/v1/brands/toyota/models?page=1&limit=1",
"last": "/api/v1/brands/toyota/models?page=40&limit=1"
}
}
წლები
ერთი მოდელის წლები მისი თაობებისა და მოდიფიკაციების year_start-ისა და year_end-ის მიხედვით. სია მიმდინარე UTC წელზე ჩერდება. სია ზრდადობით არის დალაგებული, თუ sort და direction სხვა რიგს არ მიუთითებს.
curl "https://geoapi.ge/api/v1/models/690/years?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/models/690/years?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/models/690/years?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/models/690/years?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "2018",
"year": 2018
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 8
},
"collection": {
"count": 1,
"total": 8,
"pages": 8,
"next": "/api/v1/models/690/years?page=2&limit=1",
"prev": null,
"first": "/api/v1/models/690/years?page=1&limit=1",
"last": "/api/v1/models/690/years?page=8&limit=1"
}
}
თაობები
ერთი მოდელის თაობები, შასის მიხედვით დაჯგუფებული. ფილტრები: year_from, year_to და body. საჯარო id ერთი შასის ჩანაწერებს შორის უმცირესი id-ია.
curl "https://geoapi.ge/api/v1/models/690/generations?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/models/690/generations?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/models/690/generations?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/models/690/generations?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "100",
"model_id": "690",
"slug": "xv70",
"name": "XV70",
"year_start": 2017,
"year_end": 2024,
"period_text": "2017–2024",
"body_type": "sedan",
"body_types": [
"sedan"
],
"chassis_code": "XV70",
"steering_wheel": "left",
"market": null,
"display_label": "XV70 · 2017–2024",
"photo_url": "https://geoapi.ge/api/v1/models/690/photo",
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 3
},
"collection": {
"count": 1,
"total": 3,
"pages": 3,
"next": "/api/v1/models/690/generations?page=2&limit=1",
"prev": null,
"first": "/api/v1/models/690/generations?page=1&limit=1",
"last": "/api/v1/models/690/generations?page=3&limit=1"
}
}
ფოტო
ერთი მოდელის შემოწმებული ფოტო სურათის სახით (JPEG, PNG, WebP ან GIF), წყლის ნიშნის გარეშე. გამოიყენეთ მოდელის, თაობის ან ფერის ჩანაწერის photo_url. თუ მოდელს შემოწმებული ფოტო არ აქვს, ბრუნდება 404 not_found. მოითხოვეთ თქვენი სერვერიდან საიდუმლო გასაღებით და მომხმარებელს სურათი თავად აჩვენეთ. მოდელს მაქსიმუმ ერთი ფოტო აქვს; ცალკე ფოტო თითოეული თაობისთვის ჯერ არ გაიცემა. შეუმოწმებელი ფოტო არასოდეს გაიცემა.
curl "https://geoapi.ge/api/v1/models/690/photo" \ -H "Authorization: Bearer geoapi_sk_…" \ -o photo.jpg
// Server-side only. Fetch the photo with the secret key, then serve or store it yourself.
const response = await fetch("https://geoapi.ge/api/v1/models/690/photo", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
if (response.ok) {
const type = response.headers.get('Content-Type');
const bytes = Buffer.from(await response.arrayBuffer());
}
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/models/690/photo", headers={'Authorization': 'Bearer geoapi_sk_…'})
with urllib.request.urlopen(request) as response:
open('photo.jpg', 'wb').write(response.read())
$ch = curl_init("https://geoapi.ge/api/v1/models/690/photo");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
file_put_contents('photo.jpg', curl_exec($ch));
HTTP/1.1 200 OK Content-Type: image/jpeg ETag: W/"…" X-Quota-Remaining: 999 <image bytes>
თაობის მოდიფიკაციები
ერთი საჯარო თაობის მოდიფიკაციები. ფილტრები: year_from, year_to, body, fuel, drive და transmission.
curl "https://geoapi.ge/api/v1/generations/100/modifications?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/generations/100/modifications?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/generations/100/modifications?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/generations/100/modifications?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "1000",
"generation_id": "100",
"name": "2.5",
"engine_volume_cc": 2494,
"transmission": "automatic",
"drive_type": "fwd",
"body_type": "sedan",
"year_start": 2018,
"year_end": 2024,
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 6
},
"collection": {
"count": 1,
"total": 6,
"pages": 6,
"next": "/api/v1/generations/100/modifications?page=2&limit=1",
"prev": null,
"first": "/api/v1/generations/100/modifications?page=1&limit=1",
"last": "/api/v1/generations/100/modifications?page=6&limit=1"
}
}
სპეციფიკაცია
ერთი მოდიფიკაციის ძრავი, ტრანსმისია და საწვავის ხარჯი (ლიტრი 100 კმ-ზე). უცნობი მნიშვნელობა null-ია. dimensions და performance ყოველთვის null-ია.
curl "https://geoapi.ge/api/v1/modifications/1000/specs" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/modifications/1000/specs", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/modifications/1000/specs", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/modifications/1000/specs");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": {
"modification_id": "1000",
"engine": {
"volume_cc": 2494,
"fuel": "petrol",
"power_hp": 200
},
"transmission": {
"type": "automatic",
"drive": "fwd"
},
"dimensions": null,
"performance": null,
"consumption": {
"city_l": 9.1,
"highway_l": 5.9,
"combined_l": 7.4,
"unit": "L/100km"
}
}
}
კომპლექტაცია
ერთი მოდიფიკაციის კომპლექტაცია ოთხ ჯგუფად: standard (სტანდარტული), optional (დამატებითი), not_available (მიუწვდომელი) და unknown (უცნობი). ერთნაირი კატეგორიის, სახელისა და ჯგუფის ჩანაწერები ერთიანდება.
curl "https://geoapi.ge/api/v1/modifications/1000/equipment" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/modifications/1000/equipment", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/modifications/1000/equipment", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/modifications/1000/equipment");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": {
"modification_id": "1000",
"standard": [
{
"id": "1",
"category": "Safety",
"name": "ABS",
"value": null
}
],
"optional": [
{
"id": "2",
"category": "Comfort",
"name": "Sunroof",
"value": null
}
],
"not_available": [],
"unknown": []
}
}
მოდიფიკაცია
ერთი მოდიფიკაცია ბრენდით, მოდელითა და თაობით. modified ბოლო ცვლილების დროა (UTC).
curl "https://geoapi.ge/api/v1/modifications/1000" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/modifications/1000", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/modifications/1000", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/modifications/1000");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": {
"id": "1000",
"name": "2.5",
"engine_volume_cc": 2494,
"transmission": "automatic",
"drive_type": "fwd",
"body_type": "sedan",
"year_start": 2018,
"year_end": 2024,
"brand": {
"id": "1",
"slug": "toyota",
"name": "Toyota"
},
"model": {
"id": "690",
"slug": "camry",
"name": "Camry"
},
"generation": {
"id": "100",
"name": "XV70"
},
"modified": "2026-01-01T00:00:00Z"
}
}
მოდიფიკაციები
მოდიფიკაციების ძებნა ყველა ბრენდში, მოდელსა და თაობაში. ფილტრები: year_from, year_to, body, fuel, drive, transmission, brand_id, model_id და q.
curl "https://geoapi.ge/api/v1/modifications?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/modifications?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/modifications?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/modifications?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "1000",
"name": "2.5",
"brand_id": "1",
"model_id": "690",
"generation_id": "100",
"engine_volume_cc": 2494,
"transmission": "automatic",
"drive_type": "fwd",
"body_type": "sedan",
"fuel": "petrol",
"year_start": 2018,
"year_end": 2024,
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 5000
},
"collection": {
"count": 1,
"total": 5000,
"pages": 5000,
"next": "/api/v1/modifications?page=2&limit=1",
"prev": null,
"first": "/api/v1/modifications?page=1&limit=1",
"last": "/api/v1/modifications?page=5000&limit=1"
}
}
ძრავები
ძრავის მოცულობა, საწვავი და სიმძლავრე იმ მოდიფიკაციებისთვის, რომლებსაც ძრავის მოცულობა ან საწვავის ტიპი აქვს. ფილტრები: fuel, brand_id, model_id, volume_from და volume_to.
curl "https://geoapi.ge/api/v1/engines?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/engines?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/engines?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/engines?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "1000",
"volume_cc": 2494,
"fuel": "petrol",
"power_hp": 200,
"brand_id": "1",
"model_id": "690",
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 5000
},
"collection": {
"count": 1,
"total": 5000,
"pages": 5000,
"next": "/api/v1/engines?page=2&limit=1",
"prev": null,
"first": "/api/v1/engines?page=1&limit=1",
"last": "/api/v1/engines?page=5000&limit=1"
}
}
ძარის ტიპები
ძარის ყველა ტიპი და თითოეული ტიპის ჩანაწერების რაოდენობა. q სახელში ეძებს. modified_after არ მიიღება.
curl "https://geoapi.ge/api/v1/bodies?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/bodies?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/bodies?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/bodies?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "sedan",
"name": "sedan",
"count": 1520,
"modified": null
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 12
},
"collection": {
"count": 1,
"total": 12,
"pages": 12,
"next": "/api/v1/bodies?page=2&limit=1",
"prev": null,
"first": "/api/v1/bodies?page=1&limit=1",
"last": "/api/v1/bodies?page=12&limit=1"
}
}
საწვავი
საწვავის ხარჯი ქალაქში, ტრასაზე და კომბინირებულ ციკლში (ლიტრი 100 კმ-ზე) იმ მოდიფიკაციებისთვის, რომლებსაც ეს მონაცემი აქვს. მიიღება მოდიფიკაციების ძებნის ფილტრები, მათ შორის body, drive და transmission.
curl "https://geoapi.ge/api/v1/fuel?limit=1" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/fuel?limit=1", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/fuel?limit=1", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/fuel?limit=1");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "1000",
"fuel": "petrol",
"city_l": 9.1,
"highway_l": 5.9,
"combined_l": 7.4,
"brand_id": "1",
"model_id": "690",
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 1,
"total": 5000
},
"collection": {
"count": 1,
"total": 5000,
"pages": 5000,
"next": "/api/v1/fuel?page=2&limit=1",
"prev": null,
"first": "/api/v1/fuel?page=1&limit=1",
"last": "/api/v1/fuel?page=5000&limit=1"
}
}
ფერები
მოდელის ფოტოზე შენახული ყველა ფერი. id მოდელის id-ია, ამიტომ ერთი მოდელის რამდენიმე ფერს ერთი id აქვს. verified არის false, თუ ფოტო შემოწმებული არ არის, და ასეთი ჩანაწერი სიაში რჩება. photo_url შემოწმებული ფოტოს სურათის მისამართია, სხვა შემთხვევაში null-ია.
curl "https://geoapi.ge/api/v1/colors?limit=2" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/colors?limit=2", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/colors?limit=2", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/colors?limit=2");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"data": [
{
"id": "690",
"model_id": "690",
"brand_id": "1",
"name": "white",
"verified": true,
"photo_url": "https://geoapi.ge/api/v1/models/690/photo",
"modified": "2026-01-01T00:00:00Z"
},
{
"id": "12",
"model_id": "12",
"brand_id": "1",
"name": "red",
"verified": false,
"photo_url": null,
"modified": "2026-01-01T00:00:00Z"
}
],
"meta": {
"page": 1,
"per_page": 2,
"total": 2400
},
"collection": {
"count": 2,
"total": 2400,
"pages": 1200,
"next": "/api/v1/colors?page=2&limit=2",
"prev": null,
"first": "/api/v1/colors?page=1&limit=2",
"last": "/api/v1/colors?page=1200&limit=2"
}
}
დაფარვა
კატალოგის რაოდენობები. ისინი შეიძლება რამდენიმე წუთით ძველი იყოს; measured_at დათვლის დროა. generations_count შასის მიხედვით დაჯგუფებულ თაობებს ითვლის, ისე, როგორც თაობების სია აბრუნებს. photos_count იმ ფოტოების რაოდენობაა, რომლებსაც ფოტოს მისამართი გასცემს (მოდელზე მაქსიმუმ ერთი). generations_with_photo_urls_count იმ თაობების რაოდენობაა, რომლებსაც photo_url აქვს. ფილტრები არ მიიღება.
curl "https://geoapi.ge/api/v1/coverage" \ -H "Authorization: Bearer geoapi_sk_…"
// Server-side only: a geoapi_sk_ key must never reach the browser. In a web page use the widget (geoapi_pk_).
const response = await fetch("https://geoapi.ge/api/v1/coverage", {
headers: { Authorization: 'Bearer geoapi_sk_…' },
});
console.log(await response.json());
import urllib.request
request = urllib.request.Request("https://geoapi.ge/api/v1/coverage", headers={'Authorization': 'Bearer geoapi_sk_…'})
print(urllib.request.urlopen(request).read().decode())
$ch = curl_init("https://geoapi.ge/api/v1/coverage");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer geoapi_sk_…'],
CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);
{
"brands_count": 120,
"models_count": 1800,
"generations_count": 4200,
"models_with_generations_count": 1650,
"models_without_generations_count": 150,
"modifications_count": 52000,
"photos_count": 556,
"generations_with_photo_urls_count": 410,
"measured_at": "2026-01-01T00:00:00Z"
}
ავთენტიფიკაცია
გასაღები გაგზავნეთ მხოლოდ Authorization სათაურით: Authorization: Bearer geoapi_sk_…. URL-ში, cookie-ში ან კაბინეტის სესიაში გადაცემული გასაღები არ მიიღება. საჯარო გასაღები geoapi_pk_ მხოლოდ ვიჯეტში მუშაობს.
კაბინეტის პერსონალურ ტოკენს cars:read ან * უფლებით დამატებით სჭირდება სათაური X-GEOAPI-PROJECT თქვენი რომელიმე აქტიური პროექტის id-ით. საიდუმლო გასაღები ამ სათაურს არ ითვალისწინებს: მოხმარება იმ პროექტზე აღირიცხება, რომელსაც გასაღები ეკუთვნის.
401 unauthorized: გასაღები მითითებული არ არის, უცნობია, გაუქმებულია ან ვადაგასულია. პასუხს აქვს WWW-Authenticate: Bearer და არ აქვს X-Quota-* სათაურები. 403 forbidden: გასაღები სწორია, მაგრამ პროექტი გამორთულია, ანგარიში შეჩერებულია, ელფოსტა დაუდასტურებელია ან Cars API გამორთულია.
გასაღები HTTP მეთოდამდე მოწმდება, ამიტომ სწორი გასაღების გარეშე POST მოთხოვნა 401-ს აბრუნებს, არა 405-ს. 405 method_not_allowed მხოლოდ გასაღების მიღების შემდეგ ბრუნდება; გამოიყენეთ GET ან HEAD. ერთი IP მისამართიდან წუთში 300 მოთხოვნაა დასაშვები. ეს ლიმიტი გასაღებამდე მოწმდება, ამიტომ გასაღების გარეშე ბევრმა მოთხოვნამ 401-ის ნაცვლად შეიძლება 429 მიიღოს.
გასაღების ავტომატური როტაცია არ არსებობს. გასაღების შესაცვლელად შექმენით ახალი, სერვერზე ჩასვით ის და შემდეგ გააუქმეთ ძველი; მანამდე ორივე გასაღები მუშაობს. გაუქმებული გასაღები მაშინვე წყვეტს მუშაობას და აღარ აღდგება, პროექტის გამორთვითა და ხელახლა ჩართვითაც კი.
ვიჯეტი
ვიჯეტი იძახებს ამ POST მისამართებს, სადაც {public-key} პროექტის საჯარო გასაღებია: /widget/v1/{public-key}/brands, /widget/v1/{public-key}/brands/{slug}/models, /widget/v1/{public-key}/models/{id}/years, /widget/v1/{public-key}/models/{id}/generations და /widget/v1/{public-key}/generations/{id}/modifications. წლები იგივეა, რაც GET /api/v1/models/{id}/years-ში, მაგრამ უახლესი წლით იწყება. პროექტის საჯარო გასაღები არის geoapi_pk_ და 32 თექვსმეტობითი სიმბოლო. კოდში geoapi_pk_… თქვენი პროექტის საჯარო გასაღებით შეცვალეთ. geoapi:change მოვლენა შეიცავს ველებს brand_id, model_id, year, body_type, generation_id და modification_id, ასევე საჩვენებელ სახელებს brand_name, model_name, year_name, body_name, generation_name და modification_name. modification_id null-ია, სანამ მოდიფიკაციას აირჩევთ. ვიჯეტი მხოლოდ იმ საიტებს პასუხობს, რომლებიც პროექტის დაშვებული origin-ების სიაშია. არაბრაუზერულ კლიენტს Origin სათაურის გაყალბება შეუძლია, ამიტომ ეს სია სრული დაცვა არ არის. სკრიპტი geoapi_sk_ გასაღებს არასოდეს შეიცავს.
<script src="https://geoapi.ge/widget/v1/geoapi-filter.js"></script> <geoapi-filter public-key="geoapi_pk_…"></geoapi-filter>
AI ასისტენტები (MCP)
MCP სერვერი AI ასისტენტს GeoAPI-ის კატალოგს უკავშირებს. ასისტენტს ჩვეულებრივ ენაზე ეკითხებით, მაგალითად: „Toyota Camry-ის რომელი თაობები არსებობს?“, და ის GeoAPI-ის მონაცემებით გპასუხობთ. სერვერის დაყენება არ გჭირდებათ: ის მუშაობს მისამართზე https://geoapi.ge/mcp.
- კაბინეტში შექმენით საიდუმლო გასაღები (geoapi_sk_…).
- ქვემოთ აირჩიეთ თქვენი ასისტენტი და დაამატეთ მისი კონფიგურაცია. geoapi_sk_… შეცვალეთ თქვენი გასაღებით.
- გადატვირთეთ ასისტენტი და ჰკითხეთ: „აჩვენე BMW-ის მოდელები GeoAPI-დან“.
Claude Code
გაუშვით ერთხელ ტერმინალში. --scope user GeoAPI-ს ყველა პროექტში ხელმისაწვდომს ხდის. claude mcp list აჩვენებს, დაკავშირებულია თუ არა.
claude mcp add --transport http --scope user geoapi https://geoapi.ge/mcp \ --header "Authorization: Bearer geoapi_sk_…"
Claude Desktop
Settings → Developer → Edit Config ხსნის ფაილს claude_desktop_config.json. დაამატეთ ქვემოთ მოცემული ბლოკი და გადატვირთეთ Claude. კომპიუტერზე Node.js უნდა იყოს დაყენებული: npx უშვებს mcp-remote შუამავალს, რომელიც გასაღებს GeoAPI-ს უგზავნის.
{
"mcpServers": {
"geoapi": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://geoapi.ge/mcp",
"--header",
"Authorization:${GEOAPI_AUTH}"
],
"env": {
"GEOAPI_AUTH": "Bearer geoapi_sk_…"
}
}
}
}
Codex
დაამატეთ ბლოკი ფაილში ~/.codex/config.toml. ამ ფაილს იყენებს Codex CLI, IDE-ის გაფართოება და ChatGPT-ის დესკტოპ აპლიკაცია. Codex გასაღებს GEOAPI_API_KEY ცვლადიდან იღებს, ამიტომ ჩაწერეთ ის shell-ის პროფილში (მაგალითად ~/.zshrc). თუ აპლიკაცია ცვლადს ვერ ხედავს, ბოლო ხაზის ნაცვლად ჩაწერეთ http_headers = { Authorization = "Bearer geoapi_sk_…" }. codex mcp list კონფიგურირებულ სერვერებს აჩვენებს.
[mcp_servers.geoapi] url = "https://geoapi.ge/mcp" bearer_token_env_var = "GEOAPI_API_KEY"
export GEOAPI_API_KEY="geoapi_sk_…"
Cursor
დაამატეთ ბლოკი ფაილში ~/.cursor/mcp.json (ყველა პროექტისთვის) ან .cursor/mcp.json (ერთი პროექტისთვის). Cursor-ის გვერდით პანელში გახსენით Customize და შეამოწმეთ, რომ geoapi ჩართულია; კავშირის შეცდომები Output პანელში, MCP Logs-შია. გასაღებიანი ფაილი რეპოზიტორიაში არ ატვირთოთ.
{
"mcpServers": {
"geoapi": {
"url": "https://geoapi.ge/mcp",
"headers": {
"Authorization": "Bearer geoapi_sk_…"
}
}
}
}
MCP სერვერი: https://geoapi.ge/mcp (Streamable HTTP, მხოლოდ POST; ბრაუზერში გახსნისას მისამართი 405-ს აბრუნებს). ხელსაწყოს ყოველი წარმატებული გამოძახება ერთ API მოთხოვნად ითვლება, REST API-ის იგივე წუთის ლიმიტითა და თვიური კვოტით.
ყველა ხელსაწყო მხოლოდ კითხულობს მონაცემებს: geoapi_list_brands, geoapi_list_models, geoapi_list_generations, geoapi_list_years, geoapi_list_modifications, geoapi_get_modification, geoapi_get_specs, geoapi_get_equipment და geoapi_get_coverage. ფოტოს ხელსაწყო არ არის.
გასაღები მხოლოდ ასისტენტის კონფიგურაციაში ჩაწერეთ, არასოდეს ჩატში ან საერთო რეპოზიტორიაში. ვებგვერდიდან გაგზავნილ მოთხოვნას (Origin სათაურით) სერვერი 403-ით უარყოფს.
claude.ai-ისა და ChatGPT-ის ვებ-კონექტორებს OAuth-ით შესვლა სჭირდება, რასაც GeoAPI ჯერ არ უჭერს მხარს. გამოიყენეთ ზემოთ ჩამოთვლილი პროგრამები.
Claude არის Anthropic-ის სავაჭრო ნიშანი, Codex — OpenAI-ის, Cursor კი Anysphere-ის. ლოგოები მხოლოდ იმას აჩვენებს, რომელ პროგრამებთან მუშაობს GeoAPI.
SDK და CLI
Node.js სერვერისთვის (Node 20 ან უფრო ახალი). ორივე პაკეტი geoapi.ge-დან ჩამოიტვირთება და არა npm-ის რეესტრიდან.
npm install https://geoapi.ge/downloads/geoapi-sdk-0.2.0.tgz
import { GeoAPI } from "@geoapi/sdk";
const api = new GeoAPI({ apiKey: process.env.GEOAPI_API_KEY });
const brands = await api.brands.list({ limit: 20 });
const models = await api.models.byBrand("bmw");
npm install -g https://geoapi.ge/downloads/geoapi-cli-0.2.0.tgz export GEOAPI_API_KEY="geoapi_sk_…" geoapi brands list --limit 20 --json geoapi models list --brand bmw geoapi modifications list --model-id 314 --year-from 2020 geoapi coverage
TypeScript SDK 0.2.0-ის მეთოდები: brands.list, models.byBrand, models.photo (აბრუნებს contentType-სა და bytes-ს), years.byModel, generations.byModel, generations.modifications, modifications.list, modifications.get, modifications.specs, modifications.equipment, engines.list, bodies.list, fuel.list, colors.list და coverage.get.
SDK-ის პარამეტრები: retries (ნაგულისხმევად 2), timeout (ნაგულისხმევად 30 000 მწ) და baseUrl (https; უბრალო http მხოლოდ localhost-ისთვის). ხელახლა მხოლოდ 429 და 503 იგზავნება: SDK ელოდება Retry-After-ში მითითებულ წამებს, მაქსიმუმ 2 წამს, ხოლო ამ სათაურის გარეშე 250 მწ-ს, გამრავლებულს მცდელობის ნომერზე. GeoAPIError-ს აქვს status, code, retryAfter და requestId; SDK 0.2.0-ში requestId null-ია, რადგან SDK X-Request-Id სათაურს ჯერ არ კითხულობს. SDK ბრაუზერის გვერდზე ან web worker-ში საიდუმლო გასაღებით არ ეშვება.
CLI 0.2.0-ში SDK უკვე ჩაშენებულია. გასაღები მხოლოდ GEOAPI_API_KEY ცვლადიდან აიღება და ბრძანების პარამეტრად არასოდეს გადაეცემა. --json stdout-ზე ერთ JSON დოკუმენტს წერს, შეცდომები კი stderr-ზე გადის. გამოსვლის კოდები (exit code): 0 წარმატება, 2 არასწორი შეყვანა ან ჩანაწერი ვერ მოიძებნა, 3 ავთენტიფიკაცია (401 ან 403), 4 ლიმიტი (429), 5 ქსელის ან სერვისის შეცდომა. geoapi --help ყველა ბრძანებას აჩვენებს.
SDK და CLI შპს „ინოვა ლაბის“ საკუთრებაა. მათი გამოყენება შეიძლება მხოლოდ GeoAPI.ge-ის გამოსაძახებლად, თქვენი გასაღებით. კოპირება, შეცვლა და გავრცელება აკრძალულია; სრული პირობები თითოეული პაკეტის LICENSE ფაილშია.
მონაცემების ლექსიკონი
JSON-ში id სტრიქონია (string). slug ბრენდს ან მოდელს URL-ში ასახელებს. მოდელი ბრენდს ეკუთვნის, თაობა მოდელს, მოდიფიკაცია კი თაობას. ერთი შასის ჩანაწერები, მაგალითად რესტაილინგი, ერთ საჯარო თაობად ერთიანდება. მისი id ამ ჯგუფის უმცირესი id-ია, ხოლო ჯგუფის სხვა id-ით მოთხოვნა 404-ს აბრუნებს.
year_start და year_end წარმოების წლებია. ცარიელი year_end ნიშნავს, რომ მოდელი ჯერ კიდევ იწარმოება. წლების სია მიმდინარე UTC წელზე ჩერდება, მაშინაც კი, როცა year_end უფრო გვიანდელია; თავად year_end ველი ისე ბრუნდება, როგორც ბაზაშია. year_from და year_to ფილტრებია და არა ველები: ჩანაწერი შედეგში ხვდება, თუ მისი წლები დიაპაზონს ნაწილობრივ მაინც ფარავს, ხოლო წლების გარეშე ჩანაწერი ყოველთვის ხვდება. REST-ის წლების სია ზრდადობით არის დალაგებული, ვიჯეტისა კი უახლესი წლით იწყება.
engine_volume_cc და volume_cc კუბურ სანტიმეტრებშია. power_hp ცხენის ძალაა და შეიძლება null იყოს. საწვავის ხარჯი ლიტრებშია 100 კმ-ზე. null ნიშნავს, რომ მნიშვნელობა უცნობია. dimensions და performance ყოველთვის null-ია, რადგან ეს მონაცემები ჯერ არ გროვდება.
ფერების მისამართი ყველა შენახულ ფერს აბრუნებს. verified არის false, თუ ფოტო შემოწმებული არ არის. ფერის ჩანაწერში id მოდელის id-ია, ამიტომ ერთი მოდელის რამდენიმე ფერს ერთი id აქვს. VIN-ით ძებნა ხელმისაწვდომი არ არის.
ფოტოები: მოდელს, მის თაობასა და ფერის ჩანაწერს photo_url აქვს, როცა ამ მოდელის შემოწმებული ფოტო ბაზაშია; სხვა შემთხვევაში photo_url null-ია. თაობა photo_url-ს მხოლოდ მაშინ იღებს, როცა ფოტო სწორედ ამ თაობისაა. photo_url-ზე GET მოთხოვნა იმავე Authorization სათაურით თავად სურათს აბრუნებს (JPEG, PNG, WebP ან GIF), წყლის ნიშნის გარეშე. ფოტოები GeoAPI-ს ეკუთვნის და მათი ჩვენება თქვენს პროდუქტში დაშვებულია.
ლიმიტები
სამუშაო სივრცის ყველა პროექტი ერთ თვიურ კვოტასა და ერთ წუთის ლიმიტს იზიარებს. უფასო გეგმა: თვეში 1 000 წარმატებული მოთხოვნა, 1 აქტიური პროექტი და წუთში 15 მოთხოვნა. Starter: თვეში 25 000 მოთხოვნა, 3 პროექტი და წუთში 60 მოთხოვნა, 51 ₾ თვეში. Growth: თვეში 150 000 მოთხოვნა, 10 პროექტი და წუთში 120 მოთხოვნა, 159 ₾ თვეში. წლიური გადახდა 12 თვის ჯამზე 15%-ით იაფია, კვოტა კი მაინც ყოველ საბილინგო თვეში ნულდება. ფასი ლარშია და დღგ-ს შეიცავს. თანხა ავტომატურად არ ჩამოიჭრება: იხდით მხოლოდ მაშინ, როცა თავად განაახლებთ. ადრე ნაყიდი გეგმა იმ ლიმიტებს ინარჩუნებს, რომლითაც შეიძინეთ. Business ჯერ არ იყიდება, რადგან მისი წუთის ლიმიტი წინასწარ უნდა გაიზომოს. ვიჯეტი და საიდუმლო გასაღები ერთ მრიცხველს იზიარებს. ახალი პროექტი ან ახალი გასაღები მოხმარებას არ ანულებს.
წინასწარ ნაყიდი მოთხოვნების პაკეტი 90 დღე მოქმედებს და თვიური კვოტის ამოწურვის შემდეგ იხარჯება. X-Quota-Remaining მის გამოუყენებელ მოთხოვნებსაც ითვლის. პროექტს შეიძლება საკუთარი თვიური ზღვარიც ჰქონდეს. ზღვრის მიღწევისას API აბრუნებს PROJECT_CAP_EXCEEDED-ს. დღიური ლიმიტი არ არის. თუ სერვისი მოთხოვნას ვერ დაითვლის, ის 503-ს აბრუნებს და მოთხოვნას აღურიცხავად არასოდეს ასრულებს.
წარმატებული პასუხი წუთის ლიმიტისთვის აგზავნის X-RateLimit-Limit, X-RateLimit-Remaining და X-RateLimit-Reset სათაურებს, თვიური კვოტისთვის კი X-Quota-Limit, X-Quota-Remaining და X-Quota-Reset სათაურებს. შეუზღუდავ გეგმაზე X-Quota-Limit-ისა და X-Quota-Remaining-ის მნიშვნელობა unlimited-ია. 401 X-Quota-* სათაურებს არ აგზავნის.
429 პასუხი JSON-ია და შეიცავს Retry-After სათაურს. კოდები: RATE_LIMIT_EXCEEDED, MONTHLY_QUOTA_EXCEEDED, PROJECT_CAP_EXCEEDED. 429-ზე X-RateLimit-* აღწერს იმ ლიმიტს, რომელიც ამოიწურა. დაელოდეთ Retry-After-ში მითითებულ წამებს და შემდეგ სცადეთ ხელახლა. 401, 403, 404 და 422 ხელახლა არ გაგზავნოთ. შეცდომები თვიურ კვოტაში არ ითვლება, მაგრამ 404 და 422 წუთის ლიმიტში მაინც ითვლება. ახალი გასაღები მრიცხველებს არ ანულებს.
ცვლილებები
2026-10-26: TypeScript SDK და CLI 0.2.0 ჩამოიტვირთება https://geoapi.ge/downloads-დან, ხოლო AI ასისტენტებისთვის ამოქმედდა MCP სერვერი მისამართზე https://geoapi.ge/mcp. REST API არ შეცვლილა.
1.3.0 (2026-10-25): დაემატა GET /api/v1/models/{id}/photo და ველი photo_url მოდელებზე, თაობებსა და ფერებზე. coverage-ის photos_count და generations_with_photo_urls_count ახლა იმ ფოტოებს ითვლის, რომლებსაც ეს API გასცემს.
1.2.0 (2026-10-22): სიის პასუხს აქვს data, meta და collection. დაემატა წლები, სპეციფიკაცია, კომპლექტაცია და ფერები verified ველით. ამ ვერსიაში არცერთი ველი მოძველებულად (deprecated) არ არის მონიშნული.
რეცეპტები
ამორჩევის ფორმა: ბრენდები, შემდეგ მოდელები slug-ით, შემდეგ წლები, შემდეგ თაობები და ბოლოს არჩეული საჯარო თაობის მოდიფიკაციები. year_from და year_to თაობებსა და მოდიფიკაციებზე მუშაობს; წლების მისამართი მათ გაგზავნისას 422-ს აბრუნებს.
მარაგის ძებნა: GET /api/v1/modifications პარამეტრებით brand_id, model_id, year_from და fuel. სპეციფიკაცია და კომპლექტაცია: GET /api/v1/modifications/{id}/specs და /equipment. მოდიფიკაციების სიაზე include=specs სპეციფიკაციას იმავე მოთხოვნაში აბრუნებს.
ქეშირება: შენახული ETag გაგზავნეთ If-None-Match სათაურით. 304 პასუხი კვოტას არ ხარჯავს, ისევე როგორც კომპლექტაციის მოთხოვნა, რომელსაც ჩანაწერი არ აქვს. If-None-Match: * არ განიხილება. თვიური კვოტის ამოწურვის შემდეგ ხელახალი შემოწმებაც 429-ს აბრუნებს.
ფოტოები: აიღეთ photo_url მოდელის, თაობის ან ფერის ჩანაწერიდან და მოითხოვეთ ის თქვენი სერვერიდან საიდუმლო გასაღებით. სურათი შეინახეთ ან დაქეშეთ თქვენს მხარეს და მომხმარებელს იქიდან აჩვენეთ, რადგან საიდუმლო გასაღები გვერდზე არასოდეს უნდა მოხვდეს. ფოტოს ყოველი წარმატებული მოთხოვნა ერთ მოთხოვნად ითვლება. თუ photo_url null-ია, ფოტო არ არის: აჩვენეთ ფერის სახელი ან თქვენი ჩანაცვლების სურათი.
შეცდომები
შეცდომის პასუხი JSON-ია მხოლოდ ორი ველით: error.code და error.message. ლიმიტის კოდები დიდი ასოებითაა, დანარჩენი კოდები პატარა ასოებით. ყოველ პასუხს, შეცდომის ჩათვლით, აქვს X-Request-Id სათაური. შეგიძლიათ საკუთარი X-Request-Id გაგზავნოთ (64-მდე ლათინური ასო, ციფრი, წერტილი, დეფისი ან ქვედა ტირე) და იგივე მნიშვნელობა დაგიბრუნდებათ; პრობლემის შეტყობინებისას ის მიუთითეთ.
401 unauthorized: გასაღები მითითებული არ არის ან აღარ მუშაობს. გასაღები მეთოდამდე მოწმდება, ამიტომ სწორი გასაღების გარეშე GET-ისგან განსხვავებული მოთხოვნა 401-ს აბრუნებს, არა 405-ს. 403 forbidden: გასაღები სწორია, მაგრამ პროექტი გამორთულია, ანგარიში შეჩერებულია, ელფოსტა დაუდასტურებელია ან Cars API გამორთულია. 404 not_found: ჩანაწერი ან მისამართი ვერ მოიძებნა. 405 method_not_allowed: ბრუნდება მხოლოდ გასაღების მიღების შემდეგ; გამოიყენეთ GET ან HEAD. 422 invalid_parameter: page, limit, per_page, sort, direction, ფილტრი ან id არასწორია. 429: RATE_LIMIT_EXCEEDED, MONTHLY_QUOTA_EXCEEDED, PROJECT_CAP_EXCEEDED. 503 unavailable: სერვისი ან მოთხოვნების მრიცხველი დროებით მიუწვდომელია.
შეტყობინება ქართულია, როცა Accept-Language ცარიელია ან ka-თი იწყება. ნებისმიერი სხვა მნიშვნელობისას, მაგალითად en, შეტყობინება ინგლისურია.