{"openapi":"3.1.0","info":{"title":"Union API - Car Data Aggregator","description":"\nUnified REST API for vehicle listings across multiple markets. Use `GET /api/v2/markets` to list all available markets.\n\nAuthentication:\n- POST /auth/token — get JWT token (send {\"api_key\": \"...\"})\n- All API requests require Authorization: Bearer <token> header\n- Token is valid for 30 minutes\n\nArchitecture:\n- User MUST specify ?market= query parameter\n- Each market has its own PostgreSQL database\n- Fields unified through SQL VIEW across all markets\n- Redis caching (TTL 300 sec)\n- Unified response schema for all markets\n","contact":{"name":"Union API Team","url":"https://github.com/org/union-api"},"license":{"name":"MIT"},"version":"1.4.0"},"paths":{"/auth/token":{"post":{"tags":["Authentication"],"summary":"Get JWT token","description":"Exchange API key for a JWT access token.","operationId":"login_auth_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["Authentication"],"summary":"Current user info","description":"Return current user info from JWT.","operationId":"me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/cars":{"get":{"tags":["Cars"],"summary":"Search cars","description":"Search vehicles with filters, sorting, pagination. Market parameter is required. Results are cached in Redis for 300 seconds.","operationId":"get_cars_api_v2_cars_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code","examples":{"che168":{"summary":"Che168 (China)","value":"che168"},"guazi":{"summary":"Guazi (China)","value":"guazi"},"encar":{"summary":"Encar (Korea)","value":"encar"},"goo_net":{"summary":"Goo-net (Japan)","value":"goo_net"},"dongchedi":{"summary":"Dongchedi (China)","value":"dongchedi"},"myauto_ge":{"summary":"MyAuto (Georgia)","value":"myauto_ge"},"mashina_kg":{"summary":"Mashina (Kyrgyzstan)","value":"mashina_kg"},"dubicars":{"summary":"Dubicars (UAE)","value":"dubicars"}}},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand","title":"Brand"},"description":"Brand"},{"name":"model_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Series (3 Series, Camry, A6, ...)","title":"Model Group"},"description":"Series (3 Series, Camry, A6, ...)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Model","title":"Model"},"description":"Model"},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variant/trim (GTI, Sportback, ...)","title":"Variant"},"description":"Variant/trim (GTI, Sportback, ...)"},{"name":"year_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year from","title":"Year From"},"description":"Year from"},{"name":"year_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year to","title":"Year To"},"description":"Year to"},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price from","title":"Price Min"},"description":"Price from"},{"name":"price_min_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price from (RUB)","title":"Price Min Rub"},"description":"Price from (RUB)"},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to","title":"Price Max"},"description":"Price to"},{"name":"price_max_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to (RUB)","title":"Price Max Rub"},"description":"Price to (RUB)"},{"name":"price_total_min_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Total price with customs from (RUB, sort_price_rub)","title":"Price Total Min Rub"},"description":"Total price with customs from (RUB, sort_price_rub)"},{"name":"price_total_max_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Total price with customs to (RUB, sort_price_rub)","title":"Price Total Max Rub"},"description":"Total price with customs to (RUB, sort_price_rub)"},{"name":"mileage_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max mileage (km)","title":"Mileage Max"},"description":"Max mileage (km)"},{"name":"engine_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Engine size from (cc)","title":"Engine Min"},"description":"Engine size from (cc)"},{"name":"engine_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Engine size to (cc)","title":"Engine Max"},"description":"Engine size to (cc)"},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"City/region","title":"City"},"description":"City/region"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country code","title":"Country"},"description":"Country code","examples":{"DE":{"value":"DE"},"FR":{"value":"FR"},"IT":{"value":"IT"},"ES":{"value":"ES"},"AT":{"value":"AT"},"BE":{"value":"BE"},"LU":{"value":"LU"},"NL":{"value":"NL"}}},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fuel type","title":"Fuel Type"},"description":"Fuel type","examples":{"gasoline":{"value":"gasoline"},"diesel":{"value":"diesel"},"electric":{"value":"electric"},"electric/gasoline":{"value":"electric/gasoline"}}},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Transmission","title":"Transmission"},"description":"Transmission","examples":{"manual":{"value":"manual"},"automatic":{"value":"automatic"},"semi-automatic":{"value":"semi-automatic"}}},{"name":"vin","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"VIN for exact lookup","title":"Vin"},"description":"VIN for exact lookup"},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Listing ID(s), comma-separated","title":"Id"},"description":"Listing ID(s), comma-separated"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Last visit (ISO8601) — delta updates","title":"Since"},"description":"Last visit (ISO8601) — delta updates"},{"name":"attributes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by attributes: availability:in_stock,document_status:original","title":"Attributes"},"description":"Filter by attributes: availability:in_stock,document_status:original"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated field list (id,brand,model,price,year,mileage)","title":"Fields"},"description":"Comma-separated field list (id,brand,model,price,year,mileage)"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort order","title":"Sort"},"description":"Sort order","examples":{"price_asc":{"value":"price_asc"},"price_desc":{"value":"price_desc"},"year_asc":{"value":"year_asc"},"year_desc":{"value":"year_desc"},"mileage_asc":{"value":"mileage_asc"},"mileage_desc":{"value":"mileage_desc"}}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cursor for pagination (from meta.next_cursor)","title":"Cursor"},"description":"Cursor for pagination (from meta.next_cursor)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Records per page","default":20,"title":"Limit"},"description":"Records per page"},{"name":"max_records","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500000,"minimum":1},{"type":"null"}],"description":"От 1 до 500000; при превышении — 422. Верхняя граница числа записей на запрос (потолок, страницу не расширяет). Работает и при безлимите, и при выключенном биллинге. Между страницами не накапливается.","title":"Max Records"},"description":"От 1 до 500000; при превышении — 422. Верхняя граница числа записей на запрос (потолок, страницу не расширяет). Работает и при безлимите, и при выключенном биллинге. Между страницами не накапливается."},{"name":"max_cost","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}],"description":"Строго больше 0. Ограничивает объём через цену записи (max_cost / per_unit). Не применяется при безлимите или выключенном биллинге. Если заданы оба лимита — применяется меньший. Меньше цены одной записи → 422 budget_too_low.","title":"Max Cost"},"description":"Строго больше 0. Ограничивает объём через цену записи (max_cost / per_unit). Не применяется при безлимите или выключенном биллинге. Если заданы оба лимита — применяется меньший. Меньше цены одной записи → 422 budget_too_low."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CarsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/aggregations":{"get":{"tags":["Cars"],"summary":"Aggregations & stats","description":"Returns statistics (price, year, fuel types) without detailed listings.","operationId":"get_cars_aggregations_api_v2_cars_aggregations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code","examples":{"che168":{"summary":"Che168 (China)","value":"che168"},"guazi":{"summary":"Guazi (China)","value":"guazi"},"encar":{"summary":"Encar (Korea)","value":"encar"},"goo_net":{"summary":"Goo-net (Japan)","value":"goo_net"},"dongchedi":{"summary":"Dongchedi (China)","value":"dongchedi"},"myauto_ge":{"summary":"MyAuto (Georgia)","value":"myauto_ge"},"mashina_kg":{"summary":"Mashina (Kyrgyzstan)","value":"mashina_kg"},"dubicars":{"summary":"Dubicars (UAE)","value":"dubicars"}}},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand","title":"Brand"},"description":"Brand"},{"name":"model_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Series (3 Series, Camry, A6, ...)","title":"Model Group"},"description":"Series (3 Series, Camry, A6, ...)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Model","title":"Model"},"description":"Model"},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variant/trim (GTI, Sportback, ...)","title":"Variant"},"description":"Variant/trim (GTI, Sportback, ...)"},{"name":"year_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year from","title":"Year From"},"description":"Year from"},{"name":"year_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year to","title":"Year To"},"description":"Year to"},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price from","title":"Price Min"},"description":"Price from"},{"name":"price_min_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price from (RUB)","title":"Price Min Rub"},"description":"Price from (RUB)"},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to","title":"Price Max"},"description":"Price to"},{"name":"price_max_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to (RUB)","title":"Price Max Rub"},"description":"Price to (RUB)"},{"name":"mileage_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max mileage (km)","title":"Mileage Max"},"description":"Max mileage (km)"},{"name":"engine_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Engine size from (cc)","title":"Engine Min"},"description":"Engine size from (cc)"},{"name":"engine_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Engine size to (cc)","title":"Engine Max"},"description":"Engine size to (cc)"},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"City/region","title":"City"},"description":"City/region"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country code","title":"Country"},"description":"Country code","examples":{"DE":{"value":"DE"},"FR":{"value":"FR"},"IT":{"value":"IT"},"ES":{"value":"ES"}}},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fuel type","title":"Fuel Type"},"description":"Fuel type","examples":{"gasoline":{"value":"gasoline"},"diesel":{"value":"diesel"},"electric":{"value":"electric"},"electric/gasoline":{"value":"electric/gasoline"}}},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Transmission","title":"Transmission"},"description":"Transmission","examples":{"manual":{"value":"manual"},"automatic":{"value":"automatic"},"semi-automatic":{"value":"semi-automatic"}}},{"name":"attributes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by JSON attributes: availability:in_stock,doors:5","title":"Attributes"},"description":"Filter by JSON attributes: availability:in_stock,doors:5"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cars Aggregations Api V2 Cars Aggregations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/filters":{"get":{"tags":["Cars"],"summary":"Filter values","description":"Returns available values for the given field with current filters. Параметр field обязателен.","operationId":"get_cars_filters_api_v2_cars_filters_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code","examples":{"che168":{"summary":"Che168 (China)","value":"che168"},"guazi":{"summary":"Guazi (China)","value":"guazi"},"encar":{"summary":"Encar (Korea)","value":"encar"},"goo_net":{"summary":"Goo-net (Japan)","value":"goo_net"},"dongchedi":{"summary":"Dongchedi (China)","value":"dongchedi"},"myauto_ge":{"summary":"MyAuto (Georgia)","value":"myauto_ge"},"mashina_kg":{"summary":"Mashina (Kyrgyzstan)","value":"mashina_kg"},"dubicars":{"summary":"Dubicars (UAE)","value":"dubicars"}}},{"name":"field","in":"query","required":true,"schema":{"type":"string","description":"Field","title":"Field"},"description":"Field","examples":{"brand":{"value":"brand"},"model":{"value":"model"},"variant":{"value":"variant"},"fuel_type":{"value":"fuel_type"},"transmission":{"value":"transmission"},"city":{"value":"city"},"country":{"value":"country"}}},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand","title":"Brand"},"description":"Brand"},{"name":"model_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Series (3 Series, Camry, A6, ...)","title":"Model Group"},"description":"Series (3 Series, Camry, A6, ...)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Model","title":"Model"},"description":"Model"},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variant","title":"Variant"},"description":"Variant"},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fuel type","title":"Fuel Type"},"description":"Fuel type","examples":{"gasoline":{"value":"gasoline"},"diesel":{"value":"diesel"},"electric":{"value":"electric"},"electric/gasoline":{"value":"electric/gasoline"}}},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Transmission","title":"Transmission"},"description":"Transmission","examples":{"manual":{"value":"manual"},"automatic":{"value":"automatic"},"semi-automatic":{"value":"semi-automatic"}}},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"City","title":"City"},"description":"City"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country","title":"Country"},"description":"Country","examples":{"DE":{"value":"DE"},"FR":{"value":"FR"},"IT":{"value":"IT"},"ES":{"value":"ES"}}},{"name":"year_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year from","title":"Year From"},"description":"Year from"},{"name":"year_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year to","title":"Year To"},"description":"Year to"},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price from","title":"Price Min"},"description":"Price from"},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to","title":"Price Max"},"description":"Price to"},{"name":"price_max_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to (RUB)","title":"Price Max Rub"},"description":"Price to (RUB)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cars Filters Api V2 Cars Filters Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/range":{"get":{"tags":["Cars"],"summary":"Numeric field ranges","description":"Min and max values for price, year, mileage, engine_cc given the current filters.","operationId":"get_cars_range_api_v2_cars_range_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand","title":"Brand"},"description":"Brand"},{"name":"model_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Series (3 Series, Camry, A6, ...)","title":"Model Group"},"description":"Series (3 Series, Camry, A6, ...)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Model","title":"Model"},"description":"Model"},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variant/trim (GTI, Sportback, ...)","title":"Variant"},"description":"Variant/trim (GTI, Sportback, ...)"},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fuel type","title":"Fuel Type"},"description":"Fuel type","examples":{"gasoline":{"value":"gasoline"},"diesel":{"value":"diesel"},"electric":{"value":"electric"},"electric/gasoline":{"value":"electric/gasoline"}}},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Transmission","title":"Transmission"},"description":"Transmission","examples":{"manual":{"value":"manual"},"automatic":{"value":"automatic"},"semi-automatic":{"value":"semi-automatic"}}},{"name":"attributes","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by JSON attributes: availability:in_stock,doors:5","title":"Attributes"},"description":"Filter by JSON attributes: availability:in_stock,doors:5"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cars Range Api V2 Cars Range Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/suggest":{"get":{"tags":["Cars"],"summary":"Autocomplete","description":"Suggestions for text input. Params: field, query, limit.","operationId":"get_cars_suggest_api_v2_cars_suggest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"},{"name":"field","in":"query","required":true,"schema":{"type":"string","description":"Field: brand, model_group, model, city","title":"Field"},"description":"Field: brand, model_group, model, city"},{"name":"query","in":"query","required":false,"schema":{"type":"string","description":"Search query string","default":"","title":"Query"},"description":"Search query string"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Max results","default":10,"title":"Limit"},"description":"Max results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Cars Suggest Api V2 Cars Suggest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/distinct/{field}":{"get":{"tags":["Cars"],"summary":"Distinct field values","description":"All distinct text field values (city, color, body_type, etc.) with pagination.","operationId":"get_cars_distinct_api_v2_cars_distinct__field__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"field","in":"path","required":true,"schema":{"type":"string","title":"Field"}},{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Max results","default":50,"title":"Limit"},"description":"Max results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset","default":0,"title":"Offset"},"description":"Offset"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Get Cars Distinct Api V2 Cars Distinct  Field  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/attributes":{"get":{"tags":["Cars"],"summary":"Attribute keys and values","description":"List all unique JSON attribute keys with value counts. Comma-separated market codes. Empty = all markets.","operationId":"get_cars_attributes_api_v2_cars_attributes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"market","in":"query","required":false,"schema":{"type":"string","description":"Market code(s), comma-separated. Empty = all markets.","default":"","title":"Market"},"description":"Market code(s), comma-separated. Empty = all markets."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cars Attributes Api V2 Cars Attributes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/stats":{"get":{"tags":["Cars"],"summary":"Market statistics","description":"Overall stats: total listings, avg price, new today.","operationId":"get_cars_stats_api_v2_cars_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Cars Stats Api V2 Cars Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/{car_id}/similar":{"get":{"tags":["Cars"],"summary":"Similar listings","description":"Similar vehicles — same brand/model, closest price and year.\n\nТариф: по одной записи за каждый отданный похожий автомобиль (per_unit). Безлимит на рынок покрывает. При недостаточном балансе — HTTP 402.","operationId":"get_car_similar_api_v2_cars__car_id__similar_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"car_id","in":"path","required":true,"schema":{"type":"string","title":"Car Id"}},{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"description":"Max results","default":6,"title":"Limit"},"description":"Max results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Car Similar Api V2 Cars  Car Id  Similar Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/{car_id}":{"get":{"tags":["Cars"],"summary":"Get listing by ID","description":"Full details for a single listing with all fields.\n\nТариф: одна запись по тарифу аккаунта (per_unit). Безлимит на рынок покрывает. Если авто не найдено — запись не тарифицируется (возврат). При недостаточном балансе — HTTP 402.","operationId":"get_car_by_id_api_v2_cars__car_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"car_id","in":"path","required":true,"schema":{"type":"string","title":"Car Id"}},{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Car By Id Api V2 Cars  Car Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/{car_id}/report":{"get":{"tags":["Cars"],"summary":"Inspection report with body damages (encar)","description":"Builds a car inspection report. Damage/inspection data is fetched from the external car-report service; only encar market is supported.\n\nТариф: 1 ₽ за запись с заполненным отчётом (checkup/resume). Списание НЕ покрывается безлимитом на рынок и не входит в подписку — платный тариф применяется всегда, когда по car_id возвращён заполненный отчёт (has_checkup=true). Если отчёта по авто нет — запись не тарифицируется (возврат). При недостаточном балансе — HTTP 402.","operationId":"get_car_report_api_v2_cars__car_id__report_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"car_id","in":"path","required":true,"schema":{"type":"string","title":"Car Id"}},{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","description":"Language for status labels: ru | en","default":"ru","title":"Lang"},"description":"Language for status labels: ru | en"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Car Report Api V2 Cars  Car Id  Report Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/batch":{"post":{"tags":["Cars"],"summary":"Batch fetch by ID","description":"Batch fetch: up to 100 vehicles by ID list.\n\nТариф: по одной записи за каждый найденный автомобиль (per_unit). Ненайденные id не тарифицируются (возврат разницы). Безлимит на рынок покрывает. При недостаточном балансе — HTTP 402.","operationId":"get_cars_batch_api_v2_cars_batch_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Get Cars Batch Api V2 Cars Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/cars/export/count":{"post":{"tags":["Export"],"summary":"Estimate and reserve export quote","description":"Returns quote_id for export creation. Quote expires in 15 minutes.","operationId":"count_export_api_v2_cars_export_count_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/cars/export":{"post":{"tags":["Export"],"summary":"Create export task","description":"Creates export using quote_id from /cars/export/count. Параметры экспорта берутся из квоты, передавать их повторно не нужно.","operationId":"create_export_api_v2_cars_export_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportConfirmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/export/{task_id}/status":{"get":{"tags":["Export"],"summary":"Export task status","operationId":"get_export_status_api_v2_export__task_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Export Status Api V2 Export  Task Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/export/{task_id}/download":{"get":{"tags":["Export"],"summary":"Download export result","description":"If multi-part export, specify ?page=N.","operationId":"download_export_api_v2_export__task_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Part number (for multi-part export)","default":1,"title":"Page"},"description":"Part number (for multi-part export)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/cars/search/all":{"get":{"tags":["Cross-Market"],"summary":"Cross-market search","description":"Ищет автомобили одновременно на нескольких рынках.\n\nС каждого рынка возвращается до `limit` записей.\nЦена конвертируется в рубли (price_rub).\nРезультаты объединяются, сортируются и возвращается одна страница.\nНедоступные рынки пропускаются.\n\nЕсли все запрошенные рынки пилотные (одна БД union_cars), сортировка и страница\nидут по всему корпусу, а `meta.total` точный (`meta.total_is_exact = true`).\n\nПагинация. Два способа, взаимоисключающие:\n- `page` + `limit` — классическая страница по OFFSET (на глубине дороже);\n- `cursor` — keyset-пагинация: возьмите `meta.next_cursor` прошлого ответа и\n  передайте его в `cursor` следующего запроса. Курсор привязан к набору фильтров,\n  сортировке и рынкам: измените что-нибудь — получите 400 `cursor_query_mismatch`\n  и начните заново с первой страницы. Инвариант: `meta.has_more = false` ⇔\n  `meta.next_cursor = null`. Передавать `cursor` вместе с `page` нельзя\n  (400 `cursor_page_conflict`). Ключи `next_cursor` / `has_more` /\n  `markets_total_listings` присутствуют в режиме всех-пилотных рынков.\n\n`meta.markets_total_listings` — это объём рынка: **все активные объявления рынка\nбез учёта фильтров** запроса (удобно для «ещё столько-то на рынке»), а не число\nстрок, попавших под фильтр (оно в `meta.total`).\n\nКвота на рынок: `diversify=true` ограничивает страницу `limit` записями **с\nкаждого** рынка (мелкие рынки не тонут под крупными). Страница отсчитывается по\nрангу внутри рынка: `page=2, limit=5` — записи 6..10 каждого рынка. `meta.total`\nпри этом остаётся полным итогом под фильтр (не урезается). `diversify`\nнесовместим с `cursor` (400 `diversify_cursor_conflict`) и доступен только когда\nвсе рынки пилотные (иначе 400 `diversify_not_supported`).\n\nБиллинг: плата — за запись, `стоимость = число_записей × per_unit` (₽/запись\nтарифа). Списываются только записи рынков, **не покрытых безлимитом** («плата — за\nрынки, которые безлимит не покрывает»); если безлимит покрывает все запрошенные\nрынки, списания нет. Резерв берётся по верхней границе страницы, подтверждение —\nпо факту отданных записей.\n\nПоля ответа: id, make, model, model_group, variant, price, price_rub,\nmileage, firstreg, year, fuel_type, displacement_cc, power_kw,\npower_hp, transmission, drive_train, color, body_type, seats, cover_image,\nimages, vin, country, city, url, first_seen_at, last_seen_at, market, currency.","operationId":"search_all_api_v2_cars_search_all_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"markets","in":"query","required":false,"schema":{"type":"string","description":"Comma-separated market codes. Empty = all markets.","default":"","title":"Markets"},"description":"Comma-separated market codes. Empty = all markets."},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand (Toyota, BMW...)","title":"Brand"},"description":"Brand (Toyota, BMW...)"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Model (Camry, X5...)","title":"Model"},"description":"Model (Camry, X5...)"},{"name":"year_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year from","title":"Year From"},"description":"Year from"},{"name":"year_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year to","title":"Year To"},"description":"Year to"},{"name":"price_min_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price from (RUB)","title":"Price Min Rub"},"description":"Price from (RUB)"},{"name":"price_max_rub","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to (RUB)","title":"Price Max Rub"},"description":"Price to (RUB)"},{"name":"mileage_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max mileage (km)","title":"Mileage Max"},"description":"Max mileage (km)"},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fuel type (Gasoline, Diesel, Electric, Hybrid)","title":"Fuel Type"},"description":"Fuel type (Gasoline, Diesel, Electric, Hybrid)"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort: price_asc, price_desc, year_asc, year_desc, mileage_asc, mileage_desc","default":"price_asc","title":"Sort"},"description":"Sort: price_asc, price_desc, year_asc, year_desc, mileage_asc, mileage_desc"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Записей на рынок (1..100). В режиме всех-пилотных рынков страница равна limit × число рынков (limit=20 при 8 рынках → 160 записей). В смешанном режиме — окно до limit записей на каждый рынок. При `diversify=true` limit — жёсткая квота на рынок: не больше limit записей с каждого рынка.","default":20,"title":"Limit"},"description":"Записей на рынок (1..100). В режиме всех-пилотных рынков страница равна limit × число рынков (limit=20 при 8 рынках → 160 записей). В смешанном режиме — окно до limit записей на каждый рынок. При `diversify=true` limit — жёсткая квота на рынок: не больше limit записей с каждого рынка."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page number (1..100). Несовместим с cursor.","default":1,"title":"Page"},"description":"Page number (1..100). Несовместим с cursor."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Keyset-курсор из meta.next_cursor предыдущего ответа. Взаимоисключающ с page.","title":"Cursor"},"description":"Keyset-курсор из meta.next_cursor предыдущего ответа. Взаимоисключающ с page."},{"name":"diversify","in":"query","required":false,"schema":{"type":"boolean","description":"Жёсткая квота на рынок: в странице не больше `limit` записей с каждого рынка (мелкие рынки не тонут под крупными). `page` при этом отсчитывается по каждому рынку отдельно (`page=2, limit=5` — записи 6..10 каждого рынка). Несовместим с `cursor`; доступен только когда все рынки пилотные.","default":false,"title":"Diversify"},"description":"Жёсткая квота на рынок: в странице не больше `limit` записей с каждого рынка (мелкие рынки не тонут под крупными). `page` при этом отсчитывается по каждому рынку отдельно (`page=2, limit=5` — записи 6..10 каждого рынка). Несовместим с `cursor`; доступен только когда все рынки пилотные."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/currency/rates":{"get":{"tags":["Currency"],"summary":"Central Bank of Russia exchange rates","description":"Current Central Bank of Russia exchange rates (RUB base). Cached for 6 hours.","operationId":"get_currency_rates_api_v2_currency_rates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Currency Rates Api V2 Currency Rates Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/demo/cars":{"get":{"tags":["Demo"],"summary":"Demo: search cars (public)","description":"Public endpoint for the demo site. No JWT required. Only listings with demo_flag=TRUE. Max 15 oldest (by year + add date). Filters: market, brand, model, year_from/year_to, price_min/price_max, fuel_type, transmission, country, city.","operationId":"demo_cars_api_v2_demo_cars_get","parameters":[{"name":"market","in":"query","required":true,"schema":{"type":"string","description":"Market code","title":"Market"},"description":"Market code"},{"name":"brand","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand","title":"Brand"},"description":"Brand"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Model","title":"Model"},"description":"Model"},{"name":"model_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Series (3 Series, 5 Series)","title":"Model Group"},"description":"Series (3 Series, 5 Series)"},{"name":"variant","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Variant","title":"Variant"},"description":"Variant"},{"name":"year_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year from","title":"Year From"},"description":"Year from"},{"name":"year_to","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":2030,"minimum":1900},{"type":"null"}],"description":"Year to","title":"Year To"},"description":"Year to"},{"name":"price_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price from","title":"Price Min"},"description":"Price from"},{"name":"price_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}],"description":"Price to","title":"Price Max"},"description":"Price to"},{"name":"mileage_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Max mileage","title":"Mileage Max"},"description":"Max mileage"},{"name":"city","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"City","title":"City"},"description":"City"},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Country code","title":"Country"},"description":"Country code"},{"name":"fuel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Fuel type","title":"Fuel Type"},"description":"Fuel type"},{"name":"transmission","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Transmission","title":"Transmission"},"description":"Transmission"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Demo Cars Api V2 Demo Cars Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/digiseller/{slug}":{"get":{"tags":["Digiseller"],"summary":"Выдача архива по коду Digiseller","description":"Проверить код у Digiseller, отдать архив и отметить выдачу.\n\nПокупателя сюда приводит Digiseller после оплаты: он добавляет к адресу\nстраницы (verify_url товара) параметры uniquecode и pay_uid.\n\nПорядок важен: проверка переводит код в состояние «проверен», затем\nотметка о выдаче разблокирует деньги продавцу, и только после этого\nотдаём файл.","operationId":"download_archive_api_v2_digiseller__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"uniquecode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"16-значный уникальный код (имя параметра Digiseller)","title":"Uniquecode"},"description":"16-значный уникальный код (имя параметра Digiseller)"},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"то же, альтернативное имя","title":"Code"},"description":"то же, альтернативное имя"},{"name":"unique_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"то же, альтернативное имя","title":"Unique Code"},"description":"то же, альтернативное имя"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/billing/tariffs":{"get":{"tags":["Billing"],"summary":"List available tariffs","description":"Доступен без API-ключа. С ключом дополнительно помечает текущий тариф (`is_current`) и запланированный даунгрейд (`scheduled`).","operationId":"list_tariffs_api_v2_billing_tariffs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TariffInfo"},"type":"array","title":"Response List Tariffs Api V2 Billing Tariffs Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/billing/unlimited":{"get":{"tags":["Billing"],"summary":"List market unlimited plans","description":"Безлимиты на рынки: цена и срок. Доступен без API-ключа; с ключом дополнительно помечает уже активные (`is_active`, `expires_at`).","operationId":"list_unlimited_api_v2_billing_unlimited_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlimitedListResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/markets":{"get":{"tags":["Markets"],"summary":"List available markets","description":"Returns the list of supported sources for the market parameter.","operationId":"get_markets_api_v2_markets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Markets Api V2 Markets Get"}}}}}}},"/api/v2/billing/balance":{"get":{"tags":["Billing"],"summary":"Current balance and tariff info","description":"Return current balance and active tariff.","operationId":"get_balance_api_v2_billing_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/billing/unlimited/buy":{"post":{"tags":["Billing"],"summary":"Купить безлимит на рынок на 30 дней","description":"Buy (or extend) unlimited access to a market. Price is deducted from balance.\n\nСписание баланса, активация подписки и запись транзакции выполняются атомарно\nв одной транзакции (service.purchase_unlimited).","operationId":"buy_unlimited_api_v2_billing_unlimited_buy_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlimitedBuyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlimitedBuyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/billing/tariff/select":{"post":{"tags":["Billing"],"summary":"Select a tariff","description":"Upgrade (на более дорогой) — сразу, списывается месячная плата.\nDowngrade (на более дешёвый) — в конце текущего периода.\nДаунгрейд до base — отключение платного тарифа по окончании.\nauto_renew=false — после окончания периода переход на base.","operationId":"select_tariff_api_v2_billing_tariff_select_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TariffSelectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TariffSelectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/billing/transactions":{"get":{"tags":["Billing"],"summary":"Transaction history","description":"Return paginated transaction history for current user.","operationId":"get_transactions_api_v2_billing_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/billing/spending":{"get":{"tags":["Billing"],"summary":"Spending summary","description":"Total spent all time, today, this month. Shows balance and tariff.","operationId":"get_spending_api_v2_billing_spending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingSummaryResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v2/billing/spending/export":{"get":{"tags":["Billing"],"summary":"Export spending report as CSV","description":"Download spending report. detail=summary — по дням, detail=full — каждая транзакция.","operationId":"export_spending_api_v2_billing_spending_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date_from","in":"query","required":true,"schema":{"type":"string","description":"Начало периода (YYYY-MM-DD)","title":"Date From"},"description":"Начало периода (YYYY-MM-DD)"},{"name":"date_to","in":"query","required":true,"schema":{"type":"string","description":"Конец периода (YYYY-MM-DD)","title":"Date To"},"description":"Конец периода (YYYY-MM-DD)"},{"name":"detail","in":"query","required":false,"schema":{"type":"string","description":"summary — сводка по дням, full — каждая операция","default":"summary","title":"Detail"},"description":"summary — сводка по дням, full — каждая операция"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/register-link":{"get":{"tags":["Authentication"],"summary":"Register Link","description":"Ссылка на регистрацию в Telegram боте.","operationId":"register_link_register_link_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/guide":{"get":{"tags":["Authentication"],"summary":"Api Guide","description":"Краткое руководство по API.","operationId":"api_guide_guide_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v2/support":{"get":{"tags":["System"],"summary":"Support Contact","description":"Контакт техподдержки — из ссылки клиент рисует кнопку.\n\nПуть под /api/v2: nginx пускает наружу только перечисленные location'ы\n(/api/, /auth/, /docs, /register-link, /guide, /health), поэтому голый\n/support снаружи недостижим — уходит на сайт-каталог и даёт 404.","operationId":"support_contact_api_v2_support_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BalanceResponse":{"properties":{"balance":{"type":"number","title":"Balance"},"tariff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff"},"per_unit":{"type":"number","title":"Per Unit","default":0.05},"is_active":{"type":"boolean","title":"Is Active","default":true},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"auto_renew":{"type":"boolean","title":"Auto Renew","default":true},"scheduled_tariff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Tariff","description":"Запланированный тариф на следующий период"},"unlimited_markets":{"anyOf":[{"items":{"$ref":"#/components/schemas/UnlimitedInfo"},"type":"array"},{"type":"null"}],"title":"Unlimited Markets","description":"Активные безлимиты на рынки"}},"type":"object","required":["balance"],"title":"BalanceResponse"},"CarsResponse":{"properties":{"data":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Data"},"meta":{"$ref":"#/components/schemas/MetaInfo"}},"type":"object","required":["meta"],"title":"CarsResponse","example":{"data":[{"brand":"BMW","city":"Berlin","currency":"EUR","fuel_type":"diesel","id":"12345","mileage":35000,"model":"X5","price":45000.0,"transmission":"automatic","year":2020}],"meta":{"has_more":false,"limit":20,"market":"encar","page":1,"took_ms":42,"total":1}}},"ExportConfirmRequest":{"properties":{"quote_id":{"type":"string","title":"Quote Id","description":"UUID, полученный от /cars/export/count"}},"type":"object","required":["quote_id"],"title":"ExportConfirmRequest","description":"Подтверждение экспорта по UUID квоты."},"ExportCountResponse":{"properties":{"quote_id":{"type":"string","title":"Quote Id","description":"UUID квоты для создания экспорта"},"total":{"type":"integer","title":"Total","description":"Записей под фильтр (точное значение, либо нижняя граница при total_is_capped)"},"cost":{"type":"number","title":"Cost","description":"Стоимость по total (зафиксирована)"},"per_unit":{"type":"number","title":"Per Unit","description":"Цена за одну запись"},"balance":{"type":"number","title":"Balance","description":"Текущий баланс"},"balance_after":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance After","description":"Баланс после списания"},"tariff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff","description":"Тариф"},"chunks":{"type":"integer","title":"Chunks","description":"Количество файлов (частей)"},"chunk_size":{"type":"integer","title":"Chunk Size","description":"Записей в одной части"},"can_export":{"type":"boolean","title":"Can Export","description":"Достаточно ли средств"},"expires_at":{"type":"string","title":"Expires At","description":"Срок действия квоты (ISO8601)"},"total_is_capped":{"type":"boolean","title":"Total Is Capped","description":"true — total и cost не точные, а нижние границы: точный COUNT не уложился в таймаут","default":false},"record_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Record Limit","description":"Применённый лимит записей (max_records / max_cost), если задан"},"include_removed_allowed":{"type":"boolean","title":"Include Removed Allowed","description":"Доступны ли на вашем тарифе снятые с продажи (include_removed): Business, Premium или безлимит на рынок. Если false — параметр будет проигнорирован при создании задачи, и export_removed.csv не появится","default":false}},"type":"object","required":["quote_id","total","cost","per_unit","balance","chunks","chunk_size","can_export","expires_at"],"title":"ExportCountResponse","description":"Оценка экспорта перед созданием задачи."},"ExportRequest":{"properties":{"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand","description":"Марка автомобиля (например: BMW, Toyota, Audi)"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Модель автомобиля (например: X5, Camry, A6)"},"variant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant","description":"Вариант/комплектация (GTI, Sportback, ...)"},"model_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Group","description":"Серия/семейство (3 Series, 5 Series, X5, ...)"},"year_from":{"anyOf":[{"type":"integer","maximum":2030.0,"minimum":1900.0},{"type":"null"}],"title":"Year From","description":"Год выпуска от (включительно)"},"year_to":{"anyOf":[{"type":"integer","maximum":2030.0,"minimum":1900.0},{"type":"null"}],"title":"Year To","description":"Год выпуска до (включительно)"},"price_min":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Min","description":"Цена от"},"price_min_rub":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Min Rub","description":"Цена от (в рублях)"},"price_max":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Max","description":"Цена до"},"price_max_rub":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Max Rub","description":"Цена до (в рублях)"},"price_total_min_rub":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Total Min Rub","description":"Итоговая стоимость с таможней от (₽, sort_price_rub)"},"price_total_max_rub":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Price Total Max Rub","description":"Итоговая стоимость с таможней до (₽, sort_price_rub)"},"mileage_max":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Mileage Max","description":"Пробег до (км)"},"engine_cc_min":{"anyOf":[{"type":"integer","maximum":99999.0,"minimum":0.0},{"type":"null"}],"title":"Engine Cc Min","description":"Объём двигателя от (см³)"},"engine_cc_max":{"anyOf":[{"type":"integer","maximum":99999.0,"minimum":0.0},{"type":"null"}],"title":"Engine Cc Max","description":"Объём двигателя до (см³)"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"Город / регион"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Код страны (DE, FR, IT, ES, ...)"},"fuel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fuel Type","description":"Тип топлива (gasoline, diesel, electric, ...)"},"transmission":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transmission","description":"КПП (manual, automatic, semi-automatic, ...)"},"fields":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fields","description":"Список полей через запятую (id,brand,model,price,year,mileage)"},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since","description":"Время последнего визита (ISO8601)"},"include_new":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include New","description":"При since: включить новые (дефолт true)"},"include_removed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Removed","description":"При since: включить удалённые"},"demo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Demo","description":"Демо-режим: только каждое 100-е объявление"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"ID объявления (один или через запятую)"},"attributes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attributes","description":"Фильтр по attributes: availability:in_stock,document_status:original"},"vin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vin","description":"VIN-номер для точного поиска"},"sort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort","description":"Сортировка: price_asc, price_desc, year_asc, year_desc, mileage_asc, mileage_desc"},"cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor","description":"Курсор для cursor-based пагинации (из meta.next_cursor предыдущего запроса)"},"page":{"type":"integer","maximum":500000.0,"minimum":1.0,"title":"Page","description":"Номер страницы (начиная с 1)","default":1},"limit":{"type":"integer","maximum":500000.0,"minimum":1.0,"title":"Limit","description":"Записей за один запрос/порцию. Поисковые HTTP-эндпоинты ограничивают диапазон Query-обвязкой (1..100, SEARCH_LIMIT_MAX); экспорт ставит limit = chunk_size.","default":20},"max_records":{"anyOf":[{"type":"integer","maximum":500000.0,"minimum":1.0},{"type":"null"}],"title":"Max Records","description":"Верхняя граница общего числа записей: от 1 до 500000, при превышении — 422. Больше запрошенного limit страницу не расширяет — это потолок, а не запрос «хочу столько». Применяется и при безлимите (per_unit=0), и при выключенном биллинге — это ограничение объёма, а не денег. Действует на запрос (поиск) или на задачу (экспорт), между страницами не накапливается."},"max_cost":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Cost","description":"Стоимость запроса строго больше 0. Ограничивает объём через цену за запись (max_cost / per_unit). Не применяется при безлимите или выключенном биллинге (per_unit<=0). Если заданы и max_records, и max_cost — применяется меньший из лимитов. Если max_cost меньше цены одной записи — 422 budget_too_low."},"market":{"type":"string","title":"Market","description":"Код рынка"},"export_format":{"type":"string","title":"Export Format","description":"Формат: csv, xlsx, parquet, json","default":"csv"},"archive_format":{"type":"string","title":"Archive Format","description":"Архив: zip, tar, tar.gz, tar.bz2","default":"zip"},"delimiter":{"type":"string","title":"Delimiter","description":"Разделитель: auto, comma, semicolon, pipe, tab","default":"auto"},"header_lang":{"type":"string","title":"Header Lang","description":"Язык заголовков: ru, en","default":"ru"},"chunk_size":{"type":"integer","maximum":500000.0,"minimum":1000.0,"title":"Chunk Size","description":"Записей в одном архиве (по умолч. 100 000)","default":100000}},"type":"object","required":["market"],"title":"ExportRequest","description":"Тело запроса экспорта — все фильтры поиска + параметры экспорта."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginRequest":{"properties":{"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["api_key"],"title":"LoginRequest"},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token"],"title":"LoginResponse"},"MetaInfo":{"properties":{"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Общее количество объявлений (null при курсорной пагинации)"},"page":{"type":"integer","title":"Page","description":"Текущая страница"},"limit":{"type":"integer","title":"Limit","description":"Записей на странице"},"market":{"type":"string","title":"Market","description":"Код рынка"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"Валюта рынка"},"took_ms":{"type":"integer","title":"Took Ms","description":"Время выполнения запроса (мс)","default":0},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Курсор для следующей страницы (cursor-based pagination)"},"has_more":{"type":"boolean","title":"Has More","description":"Есть ли ещё страницы","default":false},"responded_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Responded At","description":"Время ответа (ISO8601) — передавать как since в следующий запрос"},"new_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"New Count","description":"Количество новых объявлений (при since)"},"balance_after":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance After","description":"Остаток на балансе после списания (если подключена биллинговая система)"},"total_is_capped":{"type":"boolean","title":"Total Is Capped","description":"true — total не точный, а нижняя граница: точный COUNT не уложился в таймаут","default":false},"total_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Min","description":"Нижняя граница количества объявлений (заполняется только при total_is_capped)"}},"type":"object","required":["total","page","limit","market"],"title":"MetaInfo"},"SpendingSummaryResponse":{"properties":{"total_spent":{"type":"number","title":"Total Spent","description":"Всего потрачено за всё время"},"tariff_spent":{"type":"number","title":"Tariff Spent","description":"Потрачено на тарифы","default":0},"search_spent":{"type":"number","title":"Search Spent","description":"Потрачено на поиск","default":0},"spent_today":{"type":"number","title":"Spent Today","description":"Потрачено сегодня"},"spent_this_month":{"type":"number","title":"Spent This Month","description":"Потрачено в этом месяце"},"requests_today":{"type":"integer","title":"Requests Today","description":"Количество запросов сегодня"},"balance":{"type":"number","title":"Balance","description":"Текущий баланс"},"tariff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tariff"},"per_unit":{"type":"number","title":"Per Unit","default":0.05}},"type":"object","required":["total_spent","spent_today","spent_this_month","requests_today","balance"],"title":"SpendingSummaryResponse"},"TariffInfo":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"monthly_price":{"type":"number","title":"Monthly Price","description":"Стоимость периода в рублях"},"per_unit":{"type":"number","title":"Per Unit","description":"Цена одного авто (записи) в рублях"},"period_days":{"type":"integer","title":"Period Days","description":"Длительность оплаченного периода в днях","default":30},"is_current":{"type":"boolean","title":"Is Current","description":"Тариф пользователя; false без авторизации","default":false},"scheduled":{"type":"boolean","title":"Scheduled","description":"Запланирован на следующий период (даунгрейд)","default":false}},"type":"object","required":["name","label","monthly_price","per_unit"],"title":"TariffInfo"},"TariffSelectRequest":{"properties":{"tariff":{"type":"string","title":"Tariff","description":"base, standard, business, premium"},"auto_renew":{"type":"boolean","title":"Auto Renew","description":"Автопродление по истечении периода","default":true}},"type":"object","required":["tariff"],"title":"TariffSelectRequest"},"TariffSelectResponse":{"properties":{"tariff":{"type":"string","title":"Tariff"},"per_unit":{"type":"number","title":"Per Unit"},"message":{"type":"string","title":"Message"},"immediate":{"type":"boolean","title":"Immediate","description":"True — сразу, False — после окончания текущего периода","default":true},"balance_before":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance Before"},"balance_after":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance After"}},"type":"object","required":["tariff","per_unit","message"],"title":"TariffSelectResponse"},"TransactionItem":{"properties":{"id":{"type":"string","title":"Id"},"transaction_type":{"type":"string","title":"Transaction Type"},"amount":{"type":"number","title":"Amount"},"balance_before":{"type":"number","title":"Balance Before"},"balance_after":{"type":"number","title":"Balance After"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","transaction_type","amount","balance_before","balance_after","status","created_at"],"title":"TransactionItem"},"TransactionListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TransactionItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["items","total","page","limit"],"title":"TransactionListResponse"},"UnlimitedBuyRequest":{"properties":{"market":{"type":"string","title":"Market","description":"Код рынка"}},"type":"object","required":["market"],"title":"UnlimitedBuyRequest"},"UnlimitedBuyResponse":{"properties":{"market":{"type":"string","title":"Market"},"expires_at":{"type":"string","title":"Expires At"},"cost":{"type":"number","title":"Cost"},"period_days":{"type":"integer","title":"Period Days","default":30},"balance_before":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance Before"},"balance_after":{"type":"number","title":"Balance After"},"message":{"type":"string","title":"Message"}},"type":"object","required":["market","expires_at","cost","balance_after","message"],"title":"UnlimitedBuyResponse"},"UnlimitedInfo":{"properties":{"market":{"type":"string","title":"Market"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["market","expires_at"],"title":"UnlimitedInfo"},"UnlimitedListResponse":{"properties":{"unlimited":{"items":{"$ref":"#/components/schemas/UnlimitedPlan"},"type":"array","title":"Unlimited"}},"type":"object","required":["unlimited"],"title":"UnlimitedListResponse"},"UnlimitedPlan":{"properties":{"market":{"type":"string","title":"Market"},"label":{"type":"string","title":"Label","description":"Человекочитаемое название рынка"},"price":{"type":"number","title":"Price","description":"Стоимость периода в рублях"},"period_days":{"type":"integer","title":"Period Days","description":"Длительность периода в днях","default":30},"is_active":{"type":"boolean","title":"Is Active","description":"Безлимит уже активен; false без авторизации","default":false},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Действует до; заполнено только при is_active"}},"type":"object","required":["market","label","price"],"title":"UnlimitedPlan"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}