EU TED Tenders Scraper - Public Procurement Contracts API
Pricing
from $2.00 / 1,000 results
EU TED Tenders Scraper - Public Procurement Contracts API
Scrape EU public procurement notices from TED (Tenders Electronic Daily) with no API key. Filter tenders by country, CPV code, notice type, procedure, value and deadline. Get buyer and winner contacts, contract values, CPV and NUTS codes, award data and document links. Export JSON, CSV, Excel.
Pricing
from $2.00 / 1,000 results
Rating
5.0
(1)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
EU TED Tenders Scraper: Public Procurement Contracts API
Turn TED (Tenders Electronic Daily), the EU's official public procurement journal, into clean, structured data. This scraper pulls EU tenders and contract awards from every country that publishes to TED, with no API key, no XML parsing and no headless browser. Filter by country, CPV sector, notice type, procedure, value and deadline, and get one normalized row per notice, ready for a CRM, dashboard, Slack alert, lead pipeline or LLM context.
This is the most complete EU public procurement scraper on Apify: it returns every field a TED notice exposes, including buyer and winning-supplier contact details, estimated and awarded values, CPV and NUTS codes, deadlines, legal basis, framework flag, and the OJ S publication number, plus an optional full per-lot detail add-on and AI enrichment.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
What you can do with it
- Build a tender lead pipeline: find open contract notices by sector (CPV) and country, capture the buyer email, phone and website, and push them to your CRM.
- Track contract awards: see who won, the awarded value, number of tenders received, and the winning supplier's country, size and contact.
- Run market and competitor intelligence on European public spending by buyer, CPV, region (NUTS) or value band.
- Feed European government contracts into dashboards, alerts or an LLM as structured JSON.
- Monitor still-biddable tenders with a single
onlyOpenDeadlinesflag and a publication-date window.
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Full notice details add-on
- Example output record
- How it compares
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor queries TED (Tenders Electronic Daily), the EU's official public procurement journal at ted.europa.eu, applies the filters you pass as input, paginates through every matching notice, and writes one normalized record per notice to the run's dataset. Each record carries the notice title and description, the buyer name, national id and contact details, notice, procedure and contract type, legal basis and framework flag, estimated and awarded values, CPV and NUTS codes, publication, dispatch and deadline dates, document links, and, for award notices, the winning supplier with their value and contact details. Missing source values are returned as null and never invented.
Coverage spans all EU member states plus EEA and partner countries that publish to TED (around 700,000 notices per year). It reads only public data and needs no TED account or API key.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 10 open-procedure IT-services contract notices from Germany published in the last week that are still biddable.
{"maxTenders": 10,"buyerCountry": ["DEU"],"cpvCodes": "72000000","noticeType": ["cn-standard"],"onlyOpenDeadlines": true}
Every input field is optional. With an empty input the actor returns notices from the last 7 days (default maxTenders is 10, and free plans are capped at 10 per run).
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
maxTenders | integer | no | 10 | Max notices to collect. Aliases: maxItems, maxResults, limit, max, maxPages (1 page = 100). Free plans capped at 10 per run. |
publicationDateFrom | string | no | (last 7 days) | Include notices published on or after this date (YYYY-MM-DD). Alias: publishedAfter. |
publicationDateTo | string | no | (today) | Include notices published on or before this date (YYYY-MM-DD). Alias: publishedBefore. |
buyerCountry | string[] | no | (all) | ISO3 buyer country codes, for example DEU, FRA, ITA, ESP. Aliases: countries, country. |
cpvCodes | string | no | (all) | Comma-separated CPV codes, for example 45000000, 72000000. 45000000 construction, 72000000 IT, 33000000 medical, 79000000 business services. Alias: cpvCode. |
noticeType | string[] | no | (all) | Notice types, for example cn-standard (contract notice), can-standard (award notice), pin-only (prior information). Alias: noticeTypes. |
procedureType | string[] | no | (all) | Procedure types, for example open, restricted, comp-dial, neg-w-call. Alias: procedureTypes. |
contractNature | string[] | no | (all) | works (construction), supplies (goods) or services. Alias: contractNatures. |
nutsCodes | string | no | (all) | Comma-separated place-of-performance NUTS region codes, for example DE21, FR101, PL911. |
minValue | integer | no | (none) | Only notices whose estimated or awarded value is at least this amount (notice currency). |
maxValue | integer | no | (none) | Only notices whose estimated or awarded value is at most this amount (notice currency). |
onlyOpenDeadlines | boolean | no | false | When on, only return notices whose submission deadline is today or later (still biddable). |
buyerNameSearch | string | no | (empty) | Only notices whose buyer name contains this text, for example University, Ministry of Health. Alias: buyerName. |
freeText | string | no | (empty) | Full-text keyword search across the notice, for example solar panels, hospital catering. Alias: keywords. |
preferredLanguages | string[] | no | ["eng", ...] | ISO 639-3 language codes that set the priority for multilingual fields, for example ["fra", "deu"]. |
expertQuery | string | no | (empty) | Advanced: a full TED expert search query that overrides all filters above. Aliases: query, rawQuery. |
withDetails | boolean | no | false | Paid add-on. Adds the full per-lot detail, review body and winner enrichment. Billed as details. Requires a paid plan. |
withAiSummary | boolean | no | false | Paid AI add-on. Adds aiSummary. Billed only when produced. Requires a paid plan. |
withAiExtract | boolean | no | false | Paid AI add-on. Adds aiExtract (buyer, value, deadline, CPV, eligibility). Billed only on success. Requires a paid plan. |
withAiTranslate | boolean | no | false | Paid AI add-on. Adds English title/description translation for non-English notices. Billed only when produced. Requires a paid plan. |
Filters combine with logical AND. Leave every filter empty to return recent notices across all countries.
Output reference
One dataset item per procurement notice. Types: string, number, integer, boolean, string[], object, or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
title | string | Notice title (source language, prefixed with country and category). |
publicationNumber | string | TED publication number (also the notice id). |
ojsNumber | string | Official Journal (OJ S) issue number of the notice. |
tedUrl | string | Link to the notice on ted.europa.eu. |
buyerName | string | Name of the contracting authority (buyer). |
buyerCountry | string | ISO3 country code of the buyer. |
buyerNationalId | string | Buyer national registration identifier, else null. |
supplierName | string | Winning supplier name (award notices), else null. |
noticeType | string | Notice type code, for example cn-standard, can-standard. |
noticeSubtype | string | TED notice subtype code. |
formType | string | Form type, for example planning, competition, result. |
procedureType | string | Procurement procedure type, for example open, restricted. |
legalBasis | string | Legal basis reference, for example an EU directive number. |
frameworkAgreement | boolean | true if the contract uses a framework agreement, else false/null. |
value | number | Awarded or contract value, else null. |
currency | string | Currency of value. |
cpvCodes | string[] | Main CPV classification codes. |
place | string[] | Place-of-performance codes (NUTS and country). |
publicationDate | string | Publication date on TED (YYYY-MM-DD). |
deadlineDate | string | Tender submission deadline, or null. |
description | string | Notice description (source language). |
language | string | ISO language code of the notice text. |
buyerEmail | string | Buyer contact email. |
buyerPhone | string | Buyer contact phone. |
buyerWebsite | string | Buyer website. |
buyerCity | string | Buyer city. |
buyerPostcode | string | Buyer postal code. |
buyerActivity | string | Buyer activity classification, for example gen-pub. |
contractNature | string | works, supplies or services. |
additionalCpvCodes | string[] | Supplementary CPV codes. |
estimatedValue | number | Estimated contract value, else null. |
estimatedValueCurrency | string | Currency of estimatedValue. |
winnerCountry | string | Winning supplier country (award notices), else null. |
winnerCity | string | Winning supplier city. |
winnerEmail | string | Winning supplier email. |
winnerSize | string | Winning supplier size, for example sme, small, medium, large. |
awardDate | string | Award decision date, or null. |
contractConclusionDate | string | Contract conclusion date, or null. |
tendersReceived | integer | Number of tenders received, else null. |
nutsCodes | string[] | Place-of-performance NUTS codes. |
daysUntilDeadline | integer | Whole days from run time to the submission deadline, else null. |
dispatchDate | string | Date the notice was dispatched for publication (YYYY-MM-DD). |
funding | string | EU funding reference when present, else null. |
pdfUrl | string | Link to the notice PDF. |
xmlUrl | string | Link to the notice XML. |
documents | object[] | Every notice rendition link as { type, language, url } (PDF, XML, HTML per language). |
details | object | Full per-lot / review-body / winner enrichment. Present only with the withDetails add-on. |
aiSummary | string | Plain-English summary. Present only with withAiSummary. |
aiExtract | object | Extracted buyer, value, deadline, CPV and eligibility. Present only with withAiExtract. |
aiSourceLanguage | string | Detected source language. Present only with an AI add-on. |
aiTitleEn | string | English translation of the title. Present only with withAiTranslate. |
aiDescriptionEn | string | English translation of the description. Present only with withAiTranslate. |
aiTranslation | string | Combined English translation. Present only with withAiTranslate. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Full notice details add-on
Set withDetails to true (paid plan) to enrich each notice with a details object that carries the deeper, per-lot data TED exposes:
- Per-lot breakdown:
lotIdentifiers,lotTitles,lotCpvCodes,lotDurations,lotStartDates,lotEndDates,lotPlaceCities,lotPlaceCountries. - Deadlines:
submissionDeadlineDates,submissionDeadlineTimes,requestDeadlineDates. - Procurement flags:
gpaCovered,dpsUsed,recurring,strategicProcurement,subcontractingAllowed,awardCriteriaTypes,submissionLanguages,options. - Appeals:
reviewBodyName,reviewBodyEmail. - Winner enrichment:
winnerIdentifiers,winnerWebsites,winnerPostcodes,tenderValueHighest,tenderValueLowest,frameworkMaxValue.
Rows are billed as details only when extra data is actually present; otherwise they are billed as a standard result. The add-on is opt-in and skipped for free plans.
Example output record
Real record from a live run (input {"buyerCountry":["DEU"],"noticeType":["can-standard"]}), no add-ons. The long German description is trimmed for brevity; all values are unmodified.
{"title": "Germany - Heating, ventilation and air-conditioning installation work - HWK DO VE420","publicationNumber": "575419-2026","ojsNumber": "160/2026","tedUrl": "https://ted.europa.eu/en/notice/-/detail/575419-2026","buyerName": "Handwerkskammer Dortmund","buyerCountry": "DEU","buyerNationalId": "DE254718695","supplierName": "Leniger Sanitaer- Heizungstechnik GmbH; Hans Eckhoff GmbH","noticeType": "can-standard","noticeSubtype": "29","formType": "result","procedureType": "open","legalBasis": "32014L0024","frameworkAgreement": false,"value": 2273096.76,"currency": "EUR","cpvCodes": ["45331000", "45315000"],"place": ["DEA52", "DEU"],"publicationDate": "2026-08-20","buyerEmail": "info@hwk-do.de","buyerPhone": "0341 2188-0","buyerCity": "Dortmund","buyerPostcode": "44139","buyerActivity": "econ-aff","contractNature": "works","additionalCpvCodes": ["45315000", "45331000"],"winnerCountry": "DEU","winnerCity": "Paderborn; Gevelsberg","winnerEmail": "info@leniger-gmbh.de; l.steffen@eckhoffgmbh.de","winnerSize": "medium; small","awardDate": "2026-07-09","contractConclusionDate": "2026-07-20","tendersReceived": 12,"nutsCodes": ["DEA52"],"dispatchDate": "2026-08-19","pdfUrl": "https://ted.europa.eu/en/notice/575419-2026/pdf","xmlUrl": "https://ted.europa.eu/en/notice/575419-2026/xml","observedAt": "2026-09-06T06:41:43.207Z","error": null}
How it compares
| Capability | This actor | Typical TED actors |
|---|---|---|
| No API key, no XML parsing, no browser | Yes | Varies |
| Filters: country, CPV, notice type, procedure, contract nature | Yes | Partial |
| Filters: value band, NUTS region, buyer name, free text, expert query | Yes | Rare |
| Buyer contact (email, phone, website, national id) | Yes | Rare |
| Winner name, value, size, country and contact (awards) | Yes | Partial |
| Legal basis, framework flag, OJ S number, dispatch date | Yes | Rare |
| Per-lot breakdown, review body, GPA/DPS flags (details add-on) | Yes | No |
| Document links (PDF, XML, HTML per language) | Yes | Partial |
| Optional AI summary, structured extract and English translation | Yes | Rare |
Input aliases for drop-in migration (countries, cpvCode, query, maxPages...) | Yes | No |
The actor accepts the input names used by other TED scrapers on Apify, so you can point an existing configuration at it and get a strict superset of their output.
Run via API and CLI
Start a run and read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~eu-ted-tenders-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"buyerCountry":["DEU"],"cpvCodes":"72000000","onlyOpenDeadlines":true,"maxTenders":25}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~eu-ted-tenders-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"freeText":"solar panels","maxTenders":100}'
Apify CLI:
apify call scrapers_lat/eu-ted-tenders-scraper \--input '{"buyerCountry":["FRA"],"contractNature":["works"],"maxTenders":50}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object.
Billing and limits
- Pay per result. You are charged per notice returned (
resultevent). See the pricing tab for the current per-result price. - Details add-on. With
withDetails, enriched rows are billed as thedetailsevent instead ofresult, and only when extra data is present. Paid plans only. - AI add-ons billed separately.
withAiSummary,withAiExtractandwithAiTranslateeach charge their own event and only when the output is produced. Paid plans only. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 notices per run. Upgrade for higher
maxTenders.
FAQ and troubleshooting
Do I need a TED API key or account? No. The actor reads public TED data and needs no key, no login and no XML parsing.
A run returned 0 records. Why?
The filter combination matched nothing in the chosen date window. Widen publicationDateFrom/publicationDateTo, remove a country or CPV filter, or clear freeText. Zero-result runs are not charged.
How do I see only tenders I can still bid on?
Set onlyOpenDeadlines to true. Only notices with a submission deadline of today or later are returned.
How do I target a specific industry?
Use cpvCodes with the Common Procurement Vocabulary codes for that sector, optionally combined with contractNature.
What is the difference between the filters and expertQuery?
The individual filters are combined into a TED expert query for you. If you already know the TED expert query language, expertQuery lets you pass a full query that overrides every other filter.
Why is value or awardDate null?
Those fields exist mainly on award notices. Contract notices that are still open do not carry an awarded value or award date, so they are returned as null.
Is this an official EU tool? No. This actor is independent and has no affiliation with the European Union or the Publications Office. It reads only data that is publicly available on TED. Use it in accordance with the TED terms of use.
Scraper de Licitaciones TED de la UE: API de Contratacion Publica
Convierte TED (Tenders Electronic Daily), el diario oficial de contratacion publica de la UE, en datos limpios y estructurados. Este scraper extrae licitaciones y adjudicaciones de la UE de todos los paises que publican en TED, sin clave de API, sin analizar XML y sin navegador. Filtra por pais, sector CPV, tipo de anuncio, procedimiento, valor y fecha limite, y obten una fila normalizada por anuncio, lista para un CRM, un panel, una alerta de Slack, un flujo de generacion de leads o el contexto de un LLM.
Es el scraper de contratacion publica de la UE mas completo de Apify: devuelve todos los campos que expone un anuncio de TED, incluidos los datos de contacto del comprador y del proveedor adjudicatario, los valores estimados y adjudicados, los codigos CPV y NUTS, las fechas limite, la base juridica, el indicador de acuerdo marco y el numero de publicacion OJ S, mas un complemento opcional de detalle completo por lote y enriquecimiento con IA.
📥 Entrada · 📤 Salida · 💰 Precios · ▶️ Ejemplos
Para que sirve
- Crear un flujo de leads de licitaciones: encuentra anuncios de contrato abiertos por sector (CPV) y pais, captura el correo, telefono y sitio web del comprador y envialos a tu CRM.
- Seguir adjudicaciones de contratos: ve quien gano, el valor adjudicado, el numero de ofertas recibidas y el pais, tamano y contacto del proveedor ganador.
- Hacer inteligencia de mercado y de competencia sobre el gasto publico europeo por comprador, CPV, region (NUTS) o rango de valor.
- Alimentar contratos gubernamentales europeos en paneles, alertas o un LLM como JSON estructurado.
- Vigilar licitaciones aun abiertas con un solo indicador
onlyOpenDeadlinesy una ventana de fecha de publicacion.
Que hace
El actor consulta TED (Tenders Electronic Daily), el diario oficial de contratacion publica de la UE en ted.europa.eu, aplica los filtros que pasas como entrada, pagina por cada anuncio coincidente y escribe un registro normalizado por anuncio en el dataset de la ejecucion. Cada registro lleva el titulo y la descripcion del anuncio, el nombre, identificador nacional y datos de contacto del comprador, el tipo de anuncio, procedimiento y contrato, la base juridica y el indicador de acuerdo marco, los valores estimados y adjudicados, los codigos CPV y NUTS, las fechas de publicacion, envio y limite, los enlaces a documentos y, en los anuncios de adjudicacion, el proveedor ganador con su valor y sus datos de contacto. Los valores ausentes en la fuente se devuelven como null y nunca se inventan.
La cobertura abarca todos los estados miembros de la UE mas los paises del EEE y socios que publican en TED (unos 700.000 anuncios al ano). Solo lee datos publicos y no necesita cuenta de TED ni clave de API.
Inicio rapido
Abre el actor, pega esto en la entrada y pulsa Run. Devuelve hasta 10 anuncios de contrato de servicios de TI de Alemania por procedimiento abierto, publicados en la ultima semana y que aun admiten ofertas.
{"maxTenders": 10,"buyerCountry": ["DEU"],"cpvCodes": "72000000","noticeType": ["cn-standard"],"onlyOpenDeadlines": true}
Todos los campos de entrada son opcionales. Con una entrada vacia, el actor devuelve anuncios de los ultimos 7 dias (el valor por defecto de maxTenders es 10, y los planes gratuitos estan limitados a 10 por ejecucion).
Referencia de entrada
| Campo | Tipo | Obligatorio | Por defecto | Descripcion |
|---|---|---|---|---|
maxTenders | integer | no | 10 | Maximo de anuncios a recopilar. Alias: maxItems, maxResults, limit, max, maxPages (1 pagina = 100). Planes gratuitos limitados a 10 por ejecucion. |
publicationDateFrom | string | no | (ultimos 7 dias) | Incluir anuncios publicados en o despues de esta fecha (YYYY-MM-DD). Alias: publishedAfter. |
publicationDateTo | string | no | (hoy) | Incluir anuncios publicados en o antes de esta fecha (YYYY-MM-DD). Alias: publishedBefore. |
buyerCountry | string[] | no | (todos) | Codigos ISO3 de pais del comprador, por ejemplo DEU, FRA, ITA, ESP. Alias: countries, country. |
cpvCodes | string | no | (todos) | Codigos CPV separados por comas, por ejemplo 45000000, 72000000. 45000000 construccion, 72000000 TI, 33000000 material medico, 79000000 servicios a empresas. Alias: cpvCode. |
noticeType | string[] | no | (todos) | Tipos de anuncio, por ejemplo cn-standard (anuncio de contrato), can-standard (anuncio de adjudicacion), pin-only (informacion previa). Alias: noticeTypes. |
procedureType | string[] | no | (todos) | Tipos de procedimiento, por ejemplo open, restricted, comp-dial, neg-w-call. Alias: procedureTypes. |
contractNature | string[] | no | (todos) | works (obras), supplies (suministros) o services (servicios). Alias: contractNatures. |
nutsCodes | string | no | (todos) | Codigos de region NUTS del lugar de ejecucion, separados por comas, por ejemplo DE21, FR101, PL911. |
minValue | integer | no | (ninguno) | Solo anuncios cuyo valor estimado o adjudicado sea al menos esta cantidad (moneda del anuncio). |
maxValue | integer | no | (ninguno) | Solo anuncios cuyo valor estimado o adjudicado sea como maximo esta cantidad (moneda del anuncio). |
onlyOpenDeadlines | boolean | no | false | Si esta activo, solo devuelve anuncios cuya fecha limite de presentacion sea hoy o posterior (aun se puede ofertar). |
buyerNameSearch | string | no | (vacio) | Solo anuncios cuyo nombre de comprador contenga este texto, por ejemplo University, Ministry of Health. Alias: buyerName. |
freeText | string | no | (vacio) | Busqueda de texto completo en el anuncio, por ejemplo solar panels, hospital catering. Alias: keywords. |
preferredLanguages | string[] | no | ["eng", ...] | Codigos de idioma ISO 639-3 que fijan la prioridad de los campos multilingues, por ejemplo ["spa", "fra"]. |
expertQuery | string | no | (vacio) | Avanzado: una consulta experta completa de TED que anula todos los filtros anteriores. Alias: query, rawQuery. |
withDetails | boolean | no | false | Complemento de pago. Anade el detalle completo por lote, el organo de recurso y el enriquecimiento del ganador. Se factura como details. Requiere plan de pago. |
withAiSummary | boolean | no | false | Complemento de IA de pago. Anade aiSummary. Se factura solo cuando se produce. Requiere plan de pago. |
withAiExtract | boolean | no | false | Complemento de IA de pago. Anade aiExtract (comprador, valor, fecha limite, CPV, elegibilidad). Se factura solo si tiene exito. Requiere plan de pago. |
withAiTranslate | boolean | no | false | Complemento de IA de pago. Anade la traduccion al ingles del titulo y la descripcion de anuncios no ingleses. Se factura solo cuando se produce. Requiere plan de pago. |
Los filtros se combinan con AND logico. Deja todos los filtros vacios para devolver anuncios recientes de todos los paises.
Referencia de salida
Un elemento del dataset por anuncio de contratacion. Tipos: string, number, integer, boolean, string[], object, o null cuando el valor de origen esta ausente.
| Campo | Tipo | Descripcion |
|---|---|---|
title | string | Titulo del anuncio (idioma de origen, con prefijo de pais y categoria). |
publicationNumber | string | Numero de publicacion de TED (tambien el id del anuncio). |
ojsNumber | string | Numero del Diario Oficial (OJ S) del anuncio. |
tedUrl | string | Enlace al anuncio en ted.europa.eu. |
buyerName | string | Nombre del organo de contratacion (comprador). |
buyerCountry | string | Codigo ISO3 del pais del comprador. |
buyerNationalId | string | Identificador nacional de registro del comprador, o null. |
supplierName | string | Nombre del proveedor ganador (anuncios de adjudicacion), o null. |
noticeType | string | Codigo del tipo de anuncio, por ejemplo cn-standard, can-standard. |
noticeSubtype | string | Codigo de subtipo de anuncio de TED. |
formType | string | Tipo de formulario, por ejemplo planning, competition, result. |
procedureType | string | Tipo de procedimiento de contratacion, por ejemplo open, restricted. |
legalBasis | string | Referencia de la base juridica, por ejemplo un numero de directiva de la UE. |
frameworkAgreement | boolean | true si el contrato usa un acuerdo marco, o false/null. |
value | number | Valor adjudicado o del contrato, o null. |
currency | string | Moneda de value. |
cpvCodes | string[] | Codigos CPV de clasificacion principal. |
place | string[] | Codigos del lugar de ejecucion (NUTS y pais). |
publicationDate | string | Fecha de publicacion en TED (YYYY-MM-DD). |
deadlineDate | string | Fecha limite de presentacion de ofertas, o null. |
description | string | Descripcion del anuncio (idioma de origen). |
language | string | Codigo ISO del idioma del texto del anuncio. |
buyerEmail | string | Correo de contacto del comprador. |
buyerPhone | string | Telefono de contacto del comprador. |
buyerWebsite | string | Sitio web del comprador. |
buyerCity | string | Ciudad del comprador. |
buyerPostcode | string | Codigo postal del comprador. |
buyerActivity | string | Clasificacion de la actividad del comprador, por ejemplo gen-pub. |
contractNature | string | works, supplies o services. |
additionalCpvCodes | string[] | Codigos CPV complementarios. |
estimatedValue | number | Valor estimado del contrato, o null. |
estimatedValueCurrency | string | Moneda de estimatedValue. |
winnerCountry | string | Pais del proveedor ganador (anuncios de adjudicacion), o null. |
winnerCity | string | Ciudad del proveedor ganador. |
winnerEmail | string | Correo del proveedor ganador. |
winnerSize | string | Tamano del proveedor ganador, por ejemplo sme, small, medium, large. |
awardDate | string | Fecha de la decision de adjudicacion, o null. |
contractConclusionDate | string | Fecha de conclusion del contrato, o null. |
tendersReceived | integer | Numero de ofertas recibidas, o null. |
nutsCodes | string[] | Codigos NUTS del lugar de ejecucion. |
daysUntilDeadline | integer | Dias enteros desde la ejecucion hasta la fecha limite, o null. |
dispatchDate | string | Fecha de envio del anuncio para publicacion (YYYY-MM-DD). |
funding | string | Referencia de financiacion de la UE cuando existe, o null. |
pdfUrl | string | Enlace al PDF del anuncio. |
xmlUrl | string | Enlace al XML del anuncio. |
documents | object[] | Cada enlace de version del anuncio como { type, language, url } (PDF, XML, HTML por idioma). |
details | object | Enriquecimiento completo por lote / organo de recurso / ganador. Presente solo con el complemento withDetails. |
aiSummary | string | Resumen en ingles sencillo. Presente solo con withAiSummary. |
aiExtract | object | Comprador, valor, fecha limite, CPV y elegibilidad extraidos. Presente solo con withAiExtract. |
aiSourceLanguage | string | Idioma de origen detectado. Presente solo con un complemento de IA. |
aiTitleEn | string | Traduccion al ingles del titulo. Presente solo con withAiTranslate. |
aiDescriptionEn | string | Traduccion al ingles de la descripcion. Presente solo con withAiTranslate. |
aiTranslation | string | Traduccion combinada al ingles. Presente solo con withAiTranslate. |
observedAt | string | Marca de tiempo ISO 8601 de cuando se recopilo el registro. |
error | string | null si tiene exito. En una ejecucion fallida se escribe un unico elemento con el campo error relleno. |
Complemento de detalle completo del anuncio
Pon withDetails en true (plan de pago) para enriquecer cada anuncio con un objeto details que lleva los datos por lote mas profundos que expone TED:
- Desglose por lote:
lotIdentifiers,lotTitles,lotCpvCodes,lotDurations,lotStartDates,lotEndDates,lotPlaceCities,lotPlaceCountries. - Fechas limite:
submissionDeadlineDates,submissionDeadlineTimes,requestDeadlineDates. - Indicadores de contratacion:
gpaCovered,dpsUsed,recurring,strategicProcurement,subcontractingAllowed,awardCriteriaTypes,submissionLanguages,options. - Recursos:
reviewBodyName,reviewBodyEmail. - Enriquecimiento del ganador:
winnerIdentifiers,winnerWebsites,winnerPostcodes,tenderValueHighest,tenderValueLowest,frameworkMaxValue.
Las filas se facturan como details solo cuando hay datos adicionales presentes; en caso contrario se facturan como un result estandar. El complemento es opcional y se omite en los planes gratuitos.
Ejemplo de registro de salida
Registro real de una ejecucion (entrada {"buyerCountry":["DEU"],"noticeType":["can-standard"]}), sin complementos. La descripcion larga en aleman se recorta por brevedad; todos los valores estan sin modificar.
{"title": "Germany - Heating, ventilation and air-conditioning installation work - HWK DO VE420","publicationNumber": "575419-2026","ojsNumber": "160/2026","buyerName": "Handwerkskammer Dortmund","buyerCountry": "DEU","buyerNationalId": "DE254718695","supplierName": "Leniger Sanitaer- Heizungstechnik GmbH; Hans Eckhoff GmbH","noticeType": "can-standard","legalBasis": "32014L0024","value": 2273096.76,"currency": "EUR","cpvCodes": ["45331000", "45315000"],"buyerEmail": "info@hwk-do.de","contractNature": "works","winnerCountry": "DEU","winnerSize": "medium; small","awardDate": "2026-07-09","tendersReceived": 12,"nutsCodes": ["DEA52"],"error": null}
Como se compara
| Capacidad | Este actor | Actores TED tipicos |
|---|---|---|
| Sin clave de API, sin analizar XML, sin navegador | Si | Variable |
| Filtros: pais, CPV, tipo de anuncio, procedimiento, naturaleza | Si | Parcial |
| Filtros: rango de valor, region NUTS, nombre de comprador, texto libre, consulta experta | Si | Raro |
| Contacto del comprador (correo, telefono, web, id nacional) | Si | Raro |
| Nombre, valor, tamano, pais y contacto del ganador (adjudicaciones) | Si | Parcial |
| Base juridica, indicador de acuerdo marco, numero OJ S, fecha de envio | Si | Raro |
| Desglose por lote, organo de recurso, indicadores GPA/DPS (complemento details) | Si | No |
| Enlaces a documentos (PDF, XML, HTML por idioma) | Si | Parcial |
| Resumen, extraccion estructurada y traduccion al ingles con IA opcionales | Si | Raro |
Alias de entrada para migracion directa (countries, cpvCode, query, maxPages...) | Si | No |
El actor acepta los nombres de entrada que usan otros scrapers de TED en Apify, asi que puedes apuntar una configuracion existente a este y obtener un superconjunto estricto de su salida.
Ejecutar via API y CLI
Inicia una ejecucion y lee el dataset. Sustituye <TOKEN> por tu token de API de Apify.
Ejecucion sincrona que devuelve los elementos del dataset en una llamada:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~eu-ted-tenders-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"buyerCountry":["DEU"],"cpvCodes":"72000000","onlyOpenDeadlines":true,"maxTenders":25}'
Iniciar una ejecucion de forma asincrona:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~eu-ted-tenders-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"freeText":"solar panels","maxTenders":100}'
CLI de Apify:
apify call scrapers_lat/eu-ted-tenders-scraper \--input '{"buyerCountry":["FRA"],"contractNature":["works"],"maxTenders":50}'
Obtener resultados
Cada ejecucion escribe en un dataset. Obten los elementos como JSON, CSV o Excel cambiando format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginar datasets grandescurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> se devuelve como defaultDatasetId en el objeto de la ejecucion.
Facturacion y limites
- Pago por resultado. Se cobra por anuncio devuelto (evento
result). Consulta la pestana de precios para el precio por resultado actual. - Complemento de detalle. Con
withDetails, las filas enriquecidas se facturan como el eventodetailsen lugar deresult, y solo cuando hay datos adicionales. Solo planes de pago. - Complementos de IA facturados aparte.
withAiSummary,withAiExtractywithAiTranslatecobran su propio evento y solo cuando se produce la salida. Solo planes de pago. - Sin cargo si falla. Si una ejecucion falla, el actor escribe un unico elemento con el campo
errorrelleno y no lo cobra. Las ejecuciones vacias no cuestan nada. - Se respeta el limite de gasto. Ajusta
maxTotalChargeUsden la ejecucion; al alcanzarlo, el actor deja de emitir y de cobrar mas resultados facturables. - Los planes gratuitos de Apify estan limitados a 10 anuncios por ejecucion. Mejora tu plan para un
maxTendersmayor.
Preguntas frecuentes
Necesito una clave de API o cuenta de TED? No. El actor lee datos publicos de TED y no necesita clave, inicio de sesion ni analisis de XML.
Una ejecucion devolvio 0 registros. Por que?
La combinacion de filtros no coincidio con nada en la ventana de fechas elegida. Amplia publicationDateFrom/publicationDateTo, quita un filtro de pais o CPV, o borra freeText. Las ejecuciones sin resultados no se cobran.
Como veo solo licitaciones en las que aun puedo ofertar?
Pon onlyOpenDeadlines en true. Solo se devuelven anuncios con fecha limite de presentacion de hoy o posterior.
Como oriento hacia un sector concreto?
Usa cpvCodes con los codigos del Vocabulario Comun de Contratacion Publica de ese sector, opcionalmente combinado con contractNature.
Cual es la diferencia entre los filtros y expertQuery?
Los filtros individuales se combinan en una consulta experta de TED por ti. Si ya conoces el lenguaje de consulta experta de TED, expertQuery te permite pasar una consulta completa que anula los demas filtros.
Por que value o awardDate son null?
Esos campos existen principalmente en los anuncios de adjudicacion. Los anuncios de contrato aun abiertos no llevan valor adjudicado ni fecha de adjudicacion, asi que se devuelven como null.
Es una herramienta oficial de la UE? No. Este actor es independiente y no tiene afiliacion con la Union Europea ni con la Oficina de Publicaciones. Solo lee datos disponibles publicamente en TED. Usalo conforme a las condiciones de uso de TED.
Related scrapers
- EU Sanctions List Scraper: EU consolidated financial sanctions list of persons and entities.
- UK Contracts Finder Scraper: UK public sector contract opportunities.
- World Bank Procurement Scraper: World Bank contract awards and notices.
- SAM.gov Opportunities Scraper: US federal contract opportunities.
- Colombia SECOP Scraper: Colombian public procurement contracts.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US, European and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with the European Union or the Publications Office. Accesses only publicly available TED procurement data. Use in accordance with the TED terms of use.
