Piloterr Mobile API
The Mobile API from Piloterr — 2 operation(s) for mobile.
The Mobile API from Piloterr — 2 operation(s) for mobile.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/piloterr-com:piloterr-com-mobile-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Piloterr API Reference Mobile API
description: Complete API reference documentation.
version: 1.0.0
servers:
- url: https://api.piloterr.com
description: API Server
tags:
- name: Mobile
paths:
/v2/mobile/search:
get:
summary: Mobile Search
description: 'Mobile Search API. Same mobile.de inventory for every locale. `locale` sets the language label and ad links, not which cars are returned. (3 credits)
**Credit cost:** 3 credits per call'
operationId: get-mobile-search
security:
- ApiKeyAuth: []
parameters:
- name: query
in: query
required: true
description: 'Search URL or make/model code (`ms=`).
**Examples:**
```
20100
```
```
https://www.mobile.de/fr/voiture/recherche.html?ms=20100&s=Car&vc=Car
```
```
https://suchen.mobile.de/fahrzeuge/search.html?s=Car&vc=Car
```
Use **Mobile Ad** on any result `url` or `ad_id` for full listing data.'
schema:
type: string
description: 'Search URL or make/model code (`ms=`).
**Examples:**
```
20100
```
```
https://www.mobile.de/fr/voiture/recherche.html?ms=20100&s=Car&vc=Car
```
```
https://suchen.mobile.de/fahrzeuge/search.html?s=Car&vc=Car
```
Use **Mobile Ad** on any result `url` or `ad_id` for full listing data.'
- name: locale
in: query
required: false
description: 'Locale label for the results. The cars themselves stay the same for de, fr, and en.
Examples: fr, de, en, es.
A suchen.mobile.de search URL is read as the French search, with the same filters.'
schema:
type: string
description: 'Locale label for the results. The cars themselves stay the same for de, fr, and en.
Examples: fr, de, en, es.
A suchen.mobile.de search URL is read as the French search, with the same filters.'
- name: page
in: query
required: false
description: 'Page number, starting at 1. Same effect as page or pageNumber in the Mobile.de URL.
The response next uses pageNumber for the following page: page 1 links to pageNumber=2, page 2 links to pageNumber=3.'
schema:
type: number
minimum: 1
maximum: 500
description: 'Page number, starting at 1. Same effect as page or pageNumber in the Mobile.de URL.
The response next uses pageNumber for the following page: page 1 links to pageNumber=2, page 2 links to pageNumber=3.'
- name: return_page_source
in: query
required: false
description: 'When `true`, return the raw HTML page source as `{"result": "..."}` instead of structured JSON. Defaults to `false`.'
schema:
type: boolean
description: 'When `true`, return the raw HTML page source as `{"result": "..."}` instead of structured JSON. Defaults to `false`.'
- $ref: '#/components/parameters/fields'
- $ref: '#/components/parameters/is_async'
- $ref: '#/components/parameters/soft_fail'
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
type: object
properties:
url:
type: string
make:
type: string
ad_id:
type: string
model:
type: string
power:
type: string
price:
type: integer
title:
type: string
locale:
type: string
mileage:
type: string
currency:
type: string
location:
type: string
fuel_type:
type: string
image_url:
type: string
price_rating:
type: string
transmission:
type: string
first_registration:
type: string
price_rating_label:
type: string
pagination:
type: object
properties:
next:
nullable: true
page:
type: integer
per_page:
type: integer
total_pages:
nullable: true
total_results:
nullable: true
examples:
Search Porsche (ms=20100) on mobile.de FR:
value:
results:
- url: https://www.mobile.de/fr/voiture/d%C3%A9tails.html?id=455007337&s=Car&vc=Car
make: Porsche
ad_id: '455007337'
model: Cayman
power: 265 kW (360 ch)
price: 54990
title: Porsche Cayman S PDK
locale: fr
mileage: 22.500 km
currency: EUR
location: München
fuel_type: Essence
image_url: https://img.classistatic.de/api/v1/mo-prod/images/jpg/normal/95/mt_mte247ax-wr.jpg
price_rating: GOOD_PRICE
transmission: Automatique
first_registration: 03/2021
price_rating_label: Bon prix
pagination:
next: null
page: 1
per_page: 50
total_pages: null
total_results: null
'400':
description: Bad Request — missing or invalid parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Bad Request
'401':
description: Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalidKey:
value:
error: Invalid API Key
planRateLimit:
value:
error: 'Rate limit exceeded: You''ve exceeded the per second rate limit on your subscription'
keyQuota:
value:
error: 'Rate limit exceeded for the API key: quota monthly'
'402':
description: Payment Required — your subscription or credit balance is insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Payment required
'500':
description: Internal Server Error — something went wrong on our side.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal Error
tags:
- Mobile
post:
summary: Mobile Search
description: 'Mobile Search API. Same mobile.de inventory for every locale. `locale` sets the language label and ad links, not which cars are returned. (3 credits)
**Credit cost:** 3 credits per call'
operationId: post-mobile-search
security:
- ApiKeyAuth: []
parameters:
- $ref: '#/components/parameters/fields'
- $ref: '#/components/parameters/is_async'
- $ref: '#/components/parameters/soft_fail'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
query:
type: string
description: 'Search URL or make/model code (`ms=`).
**Examples:**
```
20100
```
```
https://www.mobile.de/fr/voiture/recherche.html?ms=20100&s=Car&vc=Car
```
```
https://suchen.mobile.de/fahrzeuge/search.html?s=Car&vc=Car
```
Use **Mobile Ad** on any result `url` or `ad_id` for full listing data.'
locale:
type: string
description: 'Locale label for the results. The cars themselves stay the same for de, fr, and en.
Examples: fr, de, en, es.
A suchen.mobile.de search URL is read as the French search, with the same filters.'
page:
type: number
minimum: 1
maximum: 500
description: 'Page number, starting at 1. Same effect as page or pageNumber in the Mobile.de URL.
The response next uses pageNumber for the following page: page 1 links to pageNumber=2, page 2 links to pageNumber=3.'
return_page_source:
type: boolean
description: 'When `true`, return the raw HTML page source as `{"result": "..."}` instead of structured JSON. Defaults to `false`.'
required:
- query
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
type: object
properties:
url:
type: string
make:
type: string
ad_id:
type: string
model:
type: string
power:
type: string
price:
type: integer
title:
type: string
locale:
type: string
mileage:
type: string
currency:
type: string
location:
type: string
fuel_type:
type: string
image_url:
type: string
price_rating:
type: string
transmission:
type: string
first_registration:
type: string
price_rating_label:
type: string
pagination:
type: object
properties:
next:
nullable: true
page:
type: integer
per_page:
type: integer
total_pages:
nullable: true
total_results:
nullable: true
examples:
Search Porsche (ms=20100) on mobile.de FR:
value:
results:
- url: https://www.mobile.de/fr/voiture/d%C3%A9tails.html?id=455007337&s=Car&vc=Car
make: Porsche
ad_id: '455007337'
model: Cayman
power: 265 kW (360 ch)
price: 54990
title: Porsche Cayman S PDK
locale: fr
mileage: 22.500 km
currency: EUR
location: München
fuel_type: Essence
image_url: https://img.classistatic.de/api/v1/mo-prod/images/jpg/normal/95/mt_mte247ax-wr.jpg
price_rating: GOOD_PRICE
transmission: Automatique
first_registration: 03/2021
price_rating_label: Bon prix
pagination:
next: null
page: 1
per_page: 50
total_pages: null
total_results: null
'400':
description: Bad Request — missing or invalid parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Bad Request
'401':
description: Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalidKey:
value:
error: Invalid API Key
planRateLimit:
value:
error: 'Rate limit exceeded: You''ve exceeded the per second rate limit on your subscription'
keyQuota:
value:
error: 'Rate limit exceeded for the API key: quota monthly'
'402':
description: Payment Required — your subscription or credit balance is insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Payment required
'500':
description: Internal Server Error — something went wrong on our side.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal Error
tags:
- Mobile
/v2/mobile/ad:
get:
summary: Mobile Ad
description: 'Mobile Ad API. Fetch full car listing data from a mobile.de ad URL or numeric id. Returns pricing, specs, images and features via webunlocker.
**Credit cost:** 3 credits per call'
operationId: get-mobile-ad
security:
- ApiKeyAuth: []
parameters:
- name: query
in: query
required: true
description: 'Mobile ad URL or numeric ad id.
**Examples:**
```
455111824
```
```
https://www.mobile.de/fr/voiture/d%C3%A9tails.html?id=455111824
```
Region/locale is auto-detected from full URLs; pass `locale` with numeric ids.'
schema:
type: string
description: 'Mobile ad URL or numeric ad id.
**Examples:**
```
455111824
```
```
https://www.mobile.de/fr/voiture/d%C3%A9tails.html?id=455111824
```
Region/locale is auto-detected from full URLs; pass `locale` with numeric ids.'
- name: locale
in: query
required: false
description: 'Language for this ad. The same numeric id stays reachable for fr, es, de, and en.
A full ad URL is reread in the requested locale.'
schema:
type: string
description: 'Language for this ad. The same numeric id stays reachable for fr, es, de, and en.
A full ad URL is reread in the requested locale.'
- name: return_page_source
in: query
required: false
description: 'When `true`, return the raw HTML page source as `{"result": "..."}` instead of structured JSON. Defaults to `false`.'
schema:
type: boolean
description: 'When `true`, return the raw HTML page source as `{"result": "..."}` instead of structured JSON. Defaults to `false`.'
- $ref: '#/components/parameters/fields'
- $ref: '#/components/parameters/is_async'
- $ref: '#/components/parameters/soft_fail'
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
url:
type: string
make:
type: string
ad_id:
type: string
model:
type: string
power:
type: string
price:
type: integer
title:
type: string
locale:
type: string
mileage:
type: string
category:
type: string
currency:
type: string
features:
type: array
items:
type: string
fuel_type:
type: string
image_url:
type: string
transmission:
type: string
first_registration:
type: string
examples:
Porsche Taycan 4S (455111824) on mobile.de FR:
value:
url: https://www.mobile.de/fr/voiture/d%C3%A9tails.html?id=455111824
make: Porsche
ad_id: '455111824'
model: Taycan
power: 390 kW (530 ch)
price: 80990
title: Porsche Taycan 4S
locale: fr
mileage: 22.000 km
category: Berline
currency: EUR
features:
- ABS
- Airbags
fuel_type: Électrique
image_url: https://img.classistatic.de/api/v1/mo-prod/images/jpg/normal/95/taycan_main.jpg
transmission: Automatique
first_registration: 05/2021
'400':
description: Bad Request — missing or invalid parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Bad Request
'401':
description: Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalidKey:
value:
error: Invalid API Key
planRateLimit:
value:
error: 'Rate limit exceeded: You''ve exceeded the per second rate limit on your subscription'
keyQuota:
value:
error: 'Rate limit exceeded for the API key: quota monthly'
'402':
description: Payment Required — your subscription or credit balance is insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Payment required
'500':
description: Internal Server Error — something went wrong on our side.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal Error
tags:
- Mobile
post:
summary: Mobile Ad
description: 'Mobile Ad API. Fetch full car listing data from a mobile.de ad URL or numeric id. Returns pricing, specs, images and features via webunlocker.
**Credit cost:** 3 credits per call'
operationId: post-mobile-ad
security:
- ApiKeyAuth: []
parameters:
- $ref: '#/components/parameters/fields'
- $ref: '#/components/parameters/is_async'
- $ref: '#/components/parameters/soft_fail'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
query:
type: string
description: 'Mobile ad URL or numeric ad id.
**Examples:**
```
455111824
```
```
https://www.mobile.de/fr/voiture/d%C3%A9tails.html?id=455111824
```
Region/locale is auto-detected from full URLs; pass `locale` with numeric ids.'
locale:
type: string
description: 'Language for this ad. The same numeric id stays reachable for fr, es, de, and en.
A full ad URL is reread in the requested locale.'
return_page_source:
type: boolean
description: 'When `true`, return the raw HTML page source as `{"result": "..."}` instead of structured JSON. Defaults to `false`.'
required:
- query
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
url:
type: string
make:
type: string
ad_id:
type: string
model:
type: string
power:
type: string
price:
type: integer
title:
type: string
locale:
type: string
mileage:
type: string
category:
type: string
currency:
type: string
features:
type: array
items:
type: string
fuel_type:
type: string
image_url:
type: string
transmission:
type: string
first_registration:
type: string
examples:
Porsche Taycan 4S (455111824) on mobile.de FR:
value:
url: https://www.mobile.de/fr/voiture/d%C3%A9tails.html?id=455111824
make: Porsche
ad_id: '455111824'
model: Taycan
power: 390 kW (530 ch)
price: 80990
title: Porsche Taycan 4S
locale: fr
mileage: 22.000 km
category: Berline
currency: EUR
features:
- ABS
- Airbags
fuel_type: Électrique
image_url: https://img.classistatic.de/api/v1/mo-prod/images/jpg/normal/95/taycan_main.jpg
transmission: Automatique
first_registration: 05/2021
'400':
description: Bad Request — missing or invalid parameters.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Bad Request
'401':
description: Unauthorized — the API key is missing, invalid, inactive, or expired, or a rate limit was exceeded (`Rate limit exceeded…` message).
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
examples:
invalidKey:
value:
error: Invalid API Key
planRateLimit:
value:
error: 'Rate limit exceeded: You''ve exceeded the per second rate limit on your subscription'
keyQuota:
value:
error: 'Rate limit exceeded for the API key: quota monthly'
'402':
description: Payment Required — your subscription or credit balance is insufficient.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Payment required
'500':
description: Internal Server Error — something went wrong on our side.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error: Internal Error
tags:
- Mobile
components:
parameters:
fields:
name: fields
in: query
required: false
description: Comma-separated list of response fields to return, with dot notation for nested fields (e.g. `name,location.city`).
schema:
type: string
is_async:
name: is_async
in: query
required: false
description: 'Run the request as a background job: the API answers `202` with a `job_id` to poll on `GET /v1/jobs/{id}`.'
schema:
type: boolean
default: false
soft_fail:
name: soft_fail
in: query
required: false
description: Return HTTP 200 even when the request fails; the error is in the `error` field of the body.
schema:
type: boolean
default: false
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: string
description: Human-readable error message.
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: x-api-key
description: Your API key. Include it in the x-api-key header for every request.