Spain Public Tenders Scraper
Pricing
Pay per event
Spain Public Tenders Scraper
Monitor official PLACSP public tenders and awards across Spain. Filter buyers, CPV codes, regions, values, dates, and notice status.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Track public procurement opportunities and contract awards across Spain from the official Plataforma de Contratación del Sector Público (PLACSP) syndication feed.
Spain Public Tenders Scraper turns namespace-heavy Atom/CODICE XML into clean JSON, CSV, Excel, XML, and RSS-ready dataset records. Find relevant tenders, monitor deadlines, identify contracting authorities, and study winning suppliers without maintaining your own XML pipeline.
- 🇪🇸 Nationwide official PLACSP coverage
- 🔎 Keyword, buyer, CPV, region, status, value, and date filters
- 💶 Estimated, tax-exclusive, total, and awarded EUR values
- 🏆 Award winners, tax IDs, bid counts, SME flags, and criteria
- 📄 Tender detail pages and procurement-document URLs
- ⚡ Direct HTTP extraction with no browser, login, or user-supplied proxy
What does Spain Public Tenders Scraper do?
The Actor downloads public Atom feeds published by Spain's official procurement platform and parses their embedded CODICE contract records.
Each output row represents one published tender lifecycle revision. It includes the contract folder, authority, project classification, dates, budget, procedure, award details, and source links available in that revision.
Use it for current opportunities or follow the official archive links with maxPages to inspect older publications.
Why use this PLACSP scraper?
PLACSP data is public and structured, but the source XML contains many namespaces, nested repeating blocks, raw code lists, and notice revisions.
This Actor removes that integration work:
- ✅ validates that custom feeds stay on official PLACSP hosts;
- ✅ handles singleton and repeated CODICE nodes;
- ✅ normalizes money and bid counts as numbers;
- ✅ preserves official status, notice, CPV, and procedure codes;
- ✅ keeps lifecycle revisions distinguishable;
- ✅ applies filters after parsing, with missing values failing closed;
- ✅ bounds records and archive pages for predictable runs.
Who is it for?
Spanish and EU suppliers
Schedule searches for products or services you sell. Send new matching opportunities to email, Slack, a CRM, or a bid-management queue.
B2G sales teams
Build territory lists from contracting-authority names, contacts, locations, CPV codes, and upcoming submission deadlines.
Bid-intelligence providers
Enrich an existing procurement product with official tender status, values, award winners, tax IDs, bids received, and source documents.
Procurement analysts
Compare buyers, categories, regions, procedures, awarded amounts, and SME participation using repeatable dataset exports.
Compliance and research teams
Retain source IDs, raw official codes, publication dates, and document URLs for auditable downstream review.
What Spanish tender data can I extract?
| Group | Example fields |
|---|---|
| Identity | entryId, contractFolderId, title, statusCode |
| Publication | updatedAt, noticeTypes, publicationDates |
| Authority | name, NIF, DIR3 ID, hierarchy, profile, website |
| Contact | address, city, postcode, contact name, email, phone |
| Classification | contract type/subtype, CPV codes, region, NUTS |
| Values | estimated, tax-exclusive, total, awarded EUR amounts |
| Schedule | planned dates, submission and document deadlines |
| Procedure | procedure, urgency, funding, notice codes |
| Award | reason/date, bids, winner, winner NIF, SME indicator |
| Evaluation | weighted criteria, notes, subtype codes |
| Sources | PLACSP detail page and procurement-document URLs |
Fields unavailable in a particular lifecycle revision are returned as null or an empty array rather than guessed.
How to scrape Spain public tenders
- Open the Actor input form.
- Enter a keyword such as
servicios informáticos. - Optionally add buyer, CPV, region, status, value, or date filters.
- Disable Include awarded contracts when you only want opportunities.
- Keep
maxItemsandmaxPageslow for your first test. - Click Start.
- Review the Overview table or export the dataset.
- Save the input as an Apify Task to run it on a schedule.
Input
All fields are optional. With no custom feed, the Actor uses the nationwide complete contracting-profile feed.
| Field | Type | Purpose |
|---|---|---|
query | string | Search title, folder ID, authority, and CPV text |
authority | string | Contracting-authority name contains this text |
statusCodes | string[] | Exact PLACSP folder status codes |
cpvPrefixes | string[] | One or more CPV prefixes, such as 72 |
regions | string[] | Region names or NUTS prefixes |
noticeTypes | string[] | Exact CODICE notice type codes |
minValueEur | number | Minimum comparable contract value |
maxValueEur | number | Maximum comparable contract value |
publicationDateFrom | date | Earliest publication, YYYY-MM-DD |
publicationDateTo | date | Latest publication, YYYY-MM-DD |
submissionDeadlineFrom | date | Earliest deadline, YYYY-MM-DD |
submissionDeadlineTo | date | Latest deadline, YYYY-MM-DD |
includeAwarded | boolean | Include records containing award data |
startUrls | URL[] | Official PLACSP HTTPS .atom feeds |
maxItems | integer | Maximum matching rows to save |
maxPages | integer | Maximum linked feed pages per seed |
Input examples
Find open-looking IT service opportunities in Madrid:
{"query": "servicios informáticos","regions": ["Madrid", "ES30"],"cpvPrefixes": ["72"],"includeAwarded": false,"maxItems": 100,"maxPages": 5}
Track award and formalization notices:
{"noticeTypes": ["DOC_ADJ", "DOC_FORM"],"includeAwarded": true,"maxItems": 250,"maxPages": 10}
Output example
{"contractFolderId": "2026/EA61/00000177E","title": "Servicios integrales de trabajos de apoyo","statusCode": "RES","authorityName": "Jefatura de la Sección Económico-Administrativa 61","authorityTaxId": "S0722001E","cpvCodes": ["98300000"],"region": "Illes Balears","nutsCode": "ES53","estimatedValueEur": 84509.62,"taxExclusiveValueEur": 70424.77,"submissionDeadline": "2026-04-14T06:00:00","noticeTypes": ["DOC_CAN_ADJ", "DOC_CN", "DOC_FORM"],"awards": [{"awardDate": "2026-05-04","bidsReceived": 2,"winnerName": "ONDA GAMA PLUS SL","winnerTaxId": "B57428757","awardedTaxExclusiveAmountEur": 69650,"winnerIsSme": true}]}
The exact fields depend on what PLACSP published for that revision.
Understanding PLACSP codes
The source uses official code lists for contract status, notice type, procedure, urgency, authority activity, and other classifications.
The Actor preserves those raw values instead of inventing translations. This makes scheduled data stable when labels or code-list versions change.
Common notice values include DOC_CN for a contract notice, DOC_ADJ for award material, and DOC_FORM for formalization material. Treat these examples as guidance and verify important workflows against current official code lists.
Tender lifecycle revisions and deduplication
A contract folder can be updated as it moves from publication through evaluation, award, resolution, and formalization.
Records are deduplicated by Atom entry identity plus update timestamp. Identical entries encountered through overlapping feed pages are emitted once, while a meaningful later revision can remain available as a separate row.
Use contractFolderId as the business key when building a latest-state table downstream.
How much does it cost to scrape Spanish public tenders?
The Actor uses pay-per-event pricing:
- $0.005 when a run starts;
- $0.000088546 per saved tender on the BRONZE plan;
- automatic lower per-tender rates on higher Apify plans.
A run saving 100 records costs about $0.0139 at the BRONZE rate, excluding your normal platform usage terms. Filters that save fewer records reduce result charges.
Check the live pricing panel before starting because Store pricing is authoritative.
Scheduling tender and award monitoring
Create an Apify Task with narrow filters, then schedule it hourly, daily, or weekly.
A practical daily workflow is:
- query a product or service phrase;
- limit regions and CPV prefixes;
- exclude awards for opportunity alerts;
- compare
entryIdandupdatedAtwith your stored keys; - notify account owners about unseen deadlines;
- run a separate award task for competitor intelligence.
The default feed is updated by the source, not by this Actor.
Integrations
Google Sheets
Export the dataset after each run or connect through Make to maintain a tender-review sheet.
Slack and Microsoft Teams
Trigger a webhook for rows with upcoming deadlines, large budgets, or target buyers.
Salesforce and HubSpot
Map authorityName, contact fields, CPV codes, and detailUrl into account and opportunity records.
BigQuery and data warehouses
Use contractFolderId plus updatedAt as a revision key and build latest-state or award-history tables.
Zapier and Make
Run a saved task on schedule and route qualifying records into alerts, documents, or enrichment steps.
Use with the Apify API
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/spain-public-tenders-scraper').call({query: 'ciberseguridad',includeAwarded: false,maxItems: 100,maxPages: 3,});const items = await client.dataset(run.defaultDatasetId).listItems();console.log(items.items);
Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/spain-public-tenders-scraper').call(run_input={'cpvPrefixes': ['72'],'includeAwarded': False,'maxItems': 100,'maxPages': 3,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
cURL
curl -X POST \'https://api.apify.com/v2/acts/automation-lab~spain-public-tenders-scraper/runs?token=YOUR_APIFY_TOKEN' \-H 'Content-Type: application/json' \-d '{"query":"ciberseguridad","maxItems":50,"maxPages":2}'
Use Spain Public Tenders Scraper with MCP
Connect Apify's MCP server to Claude Code:
claude mcp add --transport http apify \'https://mcp.apify.com/?tools=automation-lab/spain-public-tenders-scraper'
Claude Desktop configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?tools=automation-lab/spain-public-tenders-scraper"}}}
For Cursor, add the same URL as a remote MCP server in Cursor Settings → Tools & MCP. For VS Code, add it as an HTTP MCP server in your workspace MCP configuration.
Example prompts:
- “Find recent Spanish cybersecurity tenders and rank them by estimated value.”
- “Extract Madrid IT procurement opportunities with their authority contacts and deadlines.”
- “Monitor formalized contracts and summarize winning suppliers and awarded amounts.”
Tips for better results
- 🎯 Start with one filter family, then narrow further.
- 🧩 Use CPV prefixes rather than full codes when categories are broad.
- 🗺️ Combine a region name and NUTS prefix only when either match is acceptable.
- 📅 Use publication filters for notices and deadline filters for active bid windows.
- 🏆 Run opportunity and award monitoring as separate saved tasks.
- 💾 Store
entryId,contractFolderId, andupdatedAtfor incremental workflows. - 🔗 Retain
detailUrlanddocumentUrlsfor auditability. - 📉 Keep
maxPageslow when testing a new filter.
Limitations
- PLACSP controls source availability, freshness, field completeness, and archive links.
- Raw official codes are preserved; the Actor does not translate every code-list version.
- A notice may omit budgets, deadlines, contacts, winners, or documents.
- Keyword search is applied to parsed feed records, not a full-text index of attached PDFs.
maxPagesfollows the source's currentrel=nextchain and does not promise all historical procurement.- Custom start URLs must be official HTTPS
.atomsyndication paths. - This Actor does not submit bids or access private procurement workspaces.
Data quality and reliability
The extractor validates the Atom envelope and fails the run if PLACSP returns no parseable entries. It retries transient HTTP failures and rejects arbitrary start URLs.
Numeric filters exclude records lacking a comparable value. Date filters exclude records lacking the relevant date. This fail-closed behavior prevents missing source fields from silently passing strict buyer rules.
Always review critical procurement decisions against the linked official source.
Is scraping Spanish public tenders legal?
The Actor reads anonymous public procurement syndication data and does not bypass authentication or access controls.
Public availability does not remove every obligation. Users remain responsible for lawful processing, retention, redistribution, tender participation rules, personal-data handling, and compliance with applicable Spanish and EU law.
Do not use contact details for unlawful spam. Respect PLACSP availability and avoid unnecessarily aggressive schedules.
Troubleshooting
Why did my run return zero records?
Your filters may be stricter than the current feed page. Remove filters one at a time, increase maxPages, or test a broader Spanish keyword. Numeric and date filters intentionally reject missing values.
Why is a status or notice type unfamiliar?
PLACSP publishes raw CODICE codes and can evolve its code lists. Inspect the source detail page and current official documentation before hard-coding business decisions.
Why was my custom feed rejected?
Only official PLACSP HTTPS syndication URLs ending in .atom are accepted. Use the default feed unless you have a valid official alternative.
Why do I see the same contract folder more than once?
Those rows can represent different lifecycle revisions. Group by contractFolderId and select the newest updatedAt for a current-state view.
Frequently asked questions
Does the Actor need a PLACSP account?
No. It uses the public official Atom/CODICE syndication feed anonymously.
Does it use a browser or proxy?
No browser or user-supplied proxy is required for the official feed route.
Can it extract award winners?
Yes, when the source revision includes award data. Output can include winner name, NIF, bids, values, award reason, date, and SME indicators.
Can I scrape attached PDF text?
The Actor exports document names and URLs but does not download or OCR attachments.
Can I monitor one buyer?
Yes. Set authority to a distinctive part of the contracting authority's name and save the run as a scheduled task.
Related public procurement scrapers
- BOAMP Public Tenders Scraper — French public tender notices.
- UK Find a Tender Scraper — UK high-value procurement notices.
- TED Europa Tenders Scraper — EU-wide TED notices.
- Singapore GeBIZ Tender Opportunities Scraper — Singapore opportunities.
- CanadaBuys Tender Opportunities Scraper — Canadian procurement.
Support
For reproducible support, include the Actor run ID, the exact input, the expected contract folder or filter, and the relevant PLACSP source link.
Do not include private credentials or unrelated personal data. Run logs and a small input usually provide enough context to diagnose source or filter changes.