Piloterr Ted API
The Ted API from Piloterr — 2 operation(s) for ted.
The Ted API from Piloterr — 2 operation(s) for ted.
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-ted-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 Ted API
description: Complete API reference documentation.
version: 1.0.0
servers:
- url: https://api.piloterr.com
description: API Server
tags:
- name: Ted
paths:
/v2/ted/search:
get:
summary: TED Search
description: 'Search TED procurement notices by keyword or filters. Returns notice cards and pagination (1 credit).
**Credit cost:** 1 credit per call'
operationId: get-ted-search
security:
- ApiKeyAuth: []
parameters:
- name: query
in: query
required: false
description: "Keyword, publication number, or a TED search URL.\n\n**Example (keyword):**\n\n software\n\n**Example (publication number):**\n\n 30-2026\n\n**Example (search URL):**\n\n https://ted.europa.eu/en/search/result?query=software\n\n**Notes:**\n- A notice URL (`/notice/`) returns 400. Use the notice endpoint.\n- Filters (`country=FR`, `cpv`, `buyer`, …) can be set with or without `query`.\n- `page` starts at 1. Pass the next page yourself."
schema:
type: string
description: "Keyword, publication number, or a TED search URL.\n\n**Example (keyword):**\n\n software\n\n**Example (publication number):**\n\n 30-2026\n\n**Example (search URL):**\n\n https://ted.europa.eu/en/search/result?query=software\n\n**Notes:**\n- A notice URL (`/notice/`) returns 400. Use the notice endpoint.\n- Filters (`country=FR`, `cpv`, `buyer`, …) can be set with or without `query`.\n- `page` starts at 1. Pass the next page yourself."
- name: notice_type
in: query
required: false
description: Notice code such as cn-standard or can-standard. Combined with AND.
schema:
type: string
description: Notice code such as cn-standard or can-standard. Combined with AND.
- name: country
in: query
required: false
description: Buyer country, ISO alpha-2 or alpha-3. FR becomes FRA. A country name returns 400.
schema:
type: string
description: Buyer country, ISO alpha-2 or alpha-3. FR becomes FRA. A country name returns 400.
- name: place
in: query
required: false
description: 'Place of performance: country code or NUTS code such as FRK24.'
schema:
type: string
description: 'Place of performance: country code or NUTS code such as FRK24.'
- name: cpv
in: query
required: false
description: CPV code or prefix. Digits and an optional star, for example 72000000 or 30*.
schema:
type: string
description: CPV code or prefix. Digits and an optional star, for example 72000000 or 30*.
- name: buyer
in: query
required: false
description: Buyer name, matched as a phrase.
schema:
type: string
description: Buyer name, matched as a phrase.
- name: page
in: query
required: false
description: 'Page from 1. next is always null: pass page + 1. A page past the last one returns 404.'
schema:
type: number
description: 'Page from 1. next is always null: pass page + 1. A page past the last one returns 404.'
- $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:
cpv:
type: array
items:
type: string
url:
type: string
place:
type: string
title:
type: string
currency:
nullable: true
deadline:
type: string
buyer_name:
type: string
notice_type:
type: string
buyer_country:
type: string
value_display:
nullable: true
estimated_value:
nullable: true
publication_date:
type: string
publication_number:
type: string
pagination:
type: object
properties:
next:
nullable: true
page:
type: integer
per_page:
type: integer
total_pages:
type: integer
total_results:
type: integer
examples:
Notice 30-2026:
value:
results:
- cpv:
- '50312610'
- '35125100'
url: https://ted.europa.eu/en/notice/-/detail/30-2026
place: FRK24
title: France – Maintenance of information technology equipment – OBSERVATOIRE DES MOBILITES. FOURNITURE, INSTALLATION D'INFRASTRUCTURES DE MATERIELS DE COMPTAGES DES MODES ACTIFS ET MAINTENANCE
currency: null
deadline: '2026-02-02'
buyer_name: SMMAG, Syndicat Mixte des Mobilités de l'Aire Grenobloise, Grenoble-Alpes Métropole
notice_type: cn-standard
buyer_country: FRA
value_display: null
estimated_value: null
publication_date: '2026-01-02'
publication_number: 30-2026
pagination:
next: null
page: 1
per_page: 20
total_pages: 1
total_results: 1
'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:
- Ted
post:
summary: TED Search
description: 'Search TED procurement notices by keyword or filters. Returns notice cards and pagination (1 credit).
**Credit cost:** 1 credit per call'
operationId: post-ted-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: "Keyword, publication number, or a TED search URL.\n\n**Example (keyword):**\n\n software\n\n**Example (publication number):**\n\n 30-2026\n\n**Example (search URL):**\n\n https://ted.europa.eu/en/search/result?query=software\n\n**Notes:**\n- A notice URL (`/notice/`) returns 400. Use the notice endpoint.\n- Filters (`country=FR`, `cpv`, `buyer`, …) can be set with or without `query`.\n- `page` starts at 1. Pass the next page yourself."
notice_type:
type: string
description: Notice code such as cn-standard or can-standard. Combined with AND.
country:
type: string
description: Buyer country, ISO alpha-2 or alpha-3. FR becomes FRA. A country name returns 400.
place:
type: string
description: 'Place of performance: country code or NUTS code such as FRK24.'
cpv:
type: string
description: CPV code or prefix. Digits and an optional star, for example 72000000 or 30*.
buyer:
type: string
description: Buyer name, matched as a phrase.
page:
type: number
description: 'Page from 1. next is always null: pass page + 1. A page past the last one returns 404.'
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
type: object
properties:
cpv:
type: array
items:
type: string
url:
type: string
place:
type: string
title:
type: string
currency:
nullable: true
deadline:
type: string
buyer_name:
type: string
notice_type:
type: string
buyer_country:
type: string
value_display:
nullable: true
estimated_value:
nullable: true
publication_date:
type: string
publication_number:
type: string
pagination:
type: object
properties:
next:
nullable: true
page:
type: integer
per_page:
type: integer
total_pages:
type: integer
total_results:
type: integer
examples:
Notice 30-2026:
value:
results:
- cpv:
- '50312610'
- '35125100'
url: https://ted.europa.eu/en/notice/-/detail/30-2026
place: FRK24
title: France – Maintenance of information technology equipment – OBSERVATOIRE DES MOBILITES. FOURNITURE, INSTALLATION D'INFRASTRUCTURES DE MATERIELS DE COMPTAGES DES MODES ACTIFS ET MAINTENANCE
currency: null
deadline: '2026-02-02'
buyer_name: SMMAG, Syndicat Mixte des Mobilités de l'Aire Grenobloise, Grenoble-Alpes Métropole
notice_type: cn-standard
buyer_country: FRA
value_display: null
estimated_value: null
publication_date: '2026-01-02'
publication_number: 30-2026
pagination:
next: null
page: 1
per_page: 20
total_pages: 1
total_results: 1
'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:
- Ted
/v2/ted/notice:
get:
summary: TED Notice
description: 'TED notice profile: buyer, lots, deadline, value and documents (1 credit).
**Credit cost:** 1 credit per call'
operationId: get-ted-notice
security:
- ApiKeyAuth: []
parameters:
- name: query
in: query
required: true
description: "Publication number, or a TED notice URL.\n\n**Example (publication number):**\n\n 30-2026\n\n**Example (notice URL):**\n\n https://ted.europa.eu/en/notice/-/detail/30-2026\n\n**Notes:**\n- The number is 1 to 8 digits, a hyphen, then a 4-digit year.\n- A keyword or a search URL returns 400."
schema:
type: string
description: "Publication number, or a TED notice URL.\n\n**Example (publication number):**\n\n 30-2026\n\n**Example (notice URL):**\n\n https://ted.europa.eu/en/notice/-/detail/30-2026\n\n**Notes:**\n- The number is 1 to 8 digits, a hyphen, then a 4-digit year.\n- A keyword or a search URL returns 400."
- $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:
cpv:
type: array
items:
type: string
url:
type: string
lots:
type: array
items:
type: object
properties:
title:
type: string
description:
type: string
oj_s:
type: string
place:
type: string
title:
type: string
awards:
type: array
items: {}
currency:
nullable: true
deadline:
type: string
documents:
type: array
items:
type: string
languages:
type: array
items:
type: string
procedure:
type: string
buyer_name:
type: string
description:
type: string
legal_basis:
type: string
notice_type:
type: string
buyer_country:
type: string
dispatch_date:
type: string
value_display:
nullable: true
estimated_value:
nullable: true
publication_date:
type: string
publication_number:
type: string
examples:
Notice 30-2026:
value:
cpv:
- '50312610'
- '35125100'
url: https://ted.europa.eu/en/notice/-/detail/30-2026
lots:
- title: Analyse, télétransmission des données, maintenance des matériels existants
description: Analyse, télétransmission des données, maintenance des matériels existants
- title: Maintenance, télétransmission, acquisition et installation de nouveaux matériels de comptages
description: Maintenance, télétransmission, acquisition et installation de nouveaux matériels de comptages
oj_s: 1/2026
place: FRK24
title: France – Maintenance of information technology equipment – OBSERVATOIRE DES MOBILITES. FOURNITURE, INSTALLATION D'INFRASTRUCTURES DE MATERIELS DE COMPTAGES DES MODES ACTIFS ET MAINTENANCE
awards: []
currency: null
deadline: '2026-02-02'
documents:
- https://www.marches-publics.info/mpiaws/index.cfm?fuseaction=dematEnt.login&type=DCE&IDM=1760411
languages:
- bul
- ces
- dan
- deu
- ell
- eng
- est
- fin
- fra
- gle
- hrv
- hun
- ita
- lav
- lit
- mlt
- nld
- pol
- por
- ron
- slk
- slv
- spa
- swe
procedure: open
buyer_name: SMMAG, Syndicat Mixte des Mobilités de l'Aire Grenobloise, Grenoble-Alpes Métropole
description: 'Le syndicat Mixte des Mobilités de l''Aire Grenobloise souhaite lancer en groupement de commandes avec Grenoble-Alpes Métropole, une consultation relative à la Fourniture, l''installation d''infrastructures de matériels de comptages des modes actifs et maintenance. Le ou les futurs prestataires auront en charge de fournir des compteurs, réaliser l''installation, et entretenir les matériels de comptages (existants et futurs). Cette consultation se divise en deux lots : - Lot 1 : Analyse, télétransmission des données et maintenance des matériels existants - Lot 2 : Maintenance, télétransmission, acquisition et installation de nouveaux matériels de comptage L''accord-cadre sera exécuté par l''émission de bons de commande. Chaque lot fera l''objet d''une attribution séparée. Les prestations sont réglées par des prix unitaires. L''accord-cadre est conclu pour une période initiale de 2 ans, reconductible 1 fois 2 ans (4 ans au total). La date de démarrage des prestations est purement indicative'
legal_basis: 32014L0024
notice_type: cn-standard
buyer_country: FRA
dispatch_date: '2025-12-31'
value_display: null
estimated_value: null
publication_date: '2026-01-02'
publication_number: 30-2026
'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:
- Ted
post:
summary: TED Notice
description: 'TED notice profile: buyer, lots, deadline, value and documents (1 credit).
**Credit cost:** 1 credit per call'
operationId: post-ted-notice
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: "Publication number, or a TED notice URL.\n\n**Example (publication number):**\n\n 30-2026\n\n**Example (notice URL):**\n\n https://ted.europa.eu/en/notice/-/detail/30-2026\n\n**Notes:**\n- The number is 1 to 8 digits, a hyphen, then a 4-digit year.\n- A keyword or a search URL returns 400."
required:
- query
responses:
'200':
description: Successful response
content:
application/json:
schema:
type: object
properties:
cpv:
type: array
items:
type: string
url:
type: string
lots:
type: array
items:
type: object
properties:
title:
type: string
description:
type: string
oj_s:
type: string
place:
type: string
title:
type: string
awards:
type: array
items: {}
currency:
nullable: true
deadline:
type: string
documents:
type: array
items:
type: string
languages:
type: array
items:
type: string
procedure:
type: string
buyer_name:
type: string
description:
type: string
legal_basis:
type: string
notice_type:
type: string
buyer_country:
type: string
dispatch_date:
type: string
value_display:
nullable: true
estimated_value:
nullable: true
publication_date:
type: string
publication_number:
type: string
examples:
Notice 30-2026:
value:
cpv:
- '50312610'
- '35125100'
url: https://ted.europa.eu/en/notice/-/detail/30-2026
lots:
- title: Analyse, télétransmission des données, maintenance des matériels existants
description: Analyse, télétransmission des données, maintenance des matériels existants
- title: Maintenance, télétransmission, acquisition et installation de nouveaux matériels de comptages
description: Maintenance, télétransmission, acquisition et installation de nouveaux matériels de comptages
oj_s: 1/2026
place: FRK24
title: France – Maintenance of information technology equipment – OBSERVATOIRE DES MOBILITES. FOURNITURE, INSTALLATION D'INFRASTRUCTURES DE MATERIELS DE COMPTAGES DES MODES ACTIFS ET MAINTENANCE
awards: []
currency: null
deadline: '2026-02-02'
documents:
- https://www.marches-publics.info/mpiaws/index.cfm?fuseaction=dematEnt.login&type=DCE&IDM=1760411
languages:
- bul
- ces
- dan
- deu
- ell
- eng
- est
- fin
- fra
- gle
- hrv
- hun
- ita
- lav
- lit
- mlt
- nld
- pol
- por
- ron
- slk
- slv
- spa
- swe
procedure: open
buyer_name: SMMAG, Syndicat Mixte des Mobilités de l'Aire Grenobloise, Grenoble-Alpes Métropole
description: 'Le syndicat Mixte des Mobilités de l''Aire Grenobloise souhaite lancer en groupement de commandes avec Grenoble-Alpes Métropole, une consultation relative à la Fourniture, l''installation d''infrastructures de matériels de comptages des modes actifs et maintenance. Le ou les futurs prestataires auront en charge de fournir des compteurs, réaliser l''installation, et entretenir les matériels de comptages (existants et futurs). Cette consultation se divise en deux lots : - Lot 1 : Analyse, télétransmission des données et maintenance des matériels existants - Lot 2 : Maintenance, télétransmission, acquisition et installation de nouveaux matériels de comptage L''accord-cadre sera exécuté par l''émission de bons de commande. Chaque lot fera l''objet d''une attribution séparée. Les prestations sont réglées par des prix unitaires. L''accord-cadre est conclu pour une période initiale de 2 ans, reconductible 1 fois 2 ans (4 ans au total). La date de démarrage des prestations est purement indicative'
legal_basis: 32014L0024
notice_type: cn-standard
buyer_country: FRA
dispatch_date: '2025-12-31'
value_display: null
estimated_value: null
publication_date: '2026-01-02'
publication_number: 30-2026
'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:
- Ted
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.