OpenMercantil Public Procurement API

Public procurement awards (PLACSP) and grants (BDNS)

Operations 13

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

GET /api/v1/company/{slug}/contracts List procurement notices linked to a company · Get PLACSP procurement notices linked to a legal entity #
Ask an LLM
“Which public procurement notices is a Spanish company linked to?”
“Does a company's PLACSP contract list prove it was actually paid?”
Tell an agent
List the PLACSP procurement notices for {company}.
Show the first {limit} public tenders linked to {company}.
GET /api/v1/company/{slug}/procurement Get a company's procurement via the alias route · Alias of /contracts #
Ask an LLM
“Is there a /procurement alias that returns the same payload as a company's contracts route?”
“Which canonical route does the company procurement alias point to?”
Tell an agent
Fetch {company}'s procurement notices through the /procurement alias.
Call the procurement alias route for {company}.
GET /api/v1/company/{slug}/grants List public grants awarded to a company · Get BDNS public grants #
Ask an LLM
“Which BDNS public subsidies has a Spanish company been awarded?”
“Are grant amounts reported as payments or as awarded amounts?”
Tell an agent
List the public grants awarded to {company}.
Show up to {limit} BDNS subsidies for {company}.
GET /api/v1/persona/{slug}/contracts Get procurement linked to a person · Person-to-procurement derivation (unavailable) #
Ask an LLM
“Can I see public contracts connected to a specific person?”
“Why is the person-to-procurement route unavailable?”
Tell an agent
Get the procurement contracts linked to person {person}.
Show public tenders connected to {person} through their companies.
GET /api/v1/company/{slug}/ted List EU TED notices linked to a company · Get TED notice records linked to this corporate NIF #
Ask an LLM
“Which EU Tenders Electronic Daily notices mention a Spanish company's NIF?”
“Do TED notice links prove the company won or was paid for the contract?”
Tell an agent
List the TED notices linked to {company}.
Show {limit} European tender notices for {company}.
GET /api/v1/contracts/top-companies Rank corporate suppliers via top-companies route · Corporate suppliers ranked by PLACSP award procedures #
Ask an LLM
“Which companies top the contracts top-companies ranking by award procedures?”
“Does the top-companies ranking include money totals or only award counts?”
Tell an agent
Get the top {limit} companies by PLACSP award procedures.
Show the top-companies contracts ranking.
GET /api/v1/contracts/top-persons Rank persons by procurement-signing companies · Top persons by PLACSP-signatory companies #
Ask an LLM
“Is there a ranking of people linked to companies that win public contracts?”
“Why does the top-persons contracts ranking always return 503?”
Tell an agent
Get the top persons contracts ranking.
Show which people rank highest by PLACSP-signatory companies.
GET /api/v1/contracts/top-companies.csv Download the top-companies ranking as CSV · Corporate suppliers by award procedures (CSV) #
Ask an LLM
“Can I download the ranking of top procurement suppliers as a CSV?”
“How many rows can the top-companies CSV contain?”
Tell an agent
Download the top {limit} companies by award procedures as CSV.
Export the top-companies contracts ranking to CSV.
GET /api/v1/contracts/top-persons.csv Download the top-persons ranking as CSV · Top persons by PLACSP-signatory companies (CSV) #
Ask an LLM
“Is there a CSV export of the top persons by public contracts?”
“Why does the top-persons CSV download fail with 503?”
Tell an agent
Download the top persons contracts ranking as CSV.
Export the persons-by-PLACSP-signatory ranking to a CSV file.
GET /api/v1/tenders Search public procurement notices · Search public procurement notices #
Ask an LLM
“How do I search Spanish public tenders by keyword or CPV code?”
“Can I only see tenders that are still open for bids?”
Tell an agent
Search public tenders for {q}.
Find open tenders with CPV code {cpv} in {province}.
GET /api/v1/tenders/{key} Get one procurement notice · Get a sanitized procurement notice #
Ask an LLM
“What are the lots, CPV codes and results of a specific tender?”
“Can I fetch a single procurement notice by its key?”
Tell an agent
Get tender {key}.
Show the lots and award results of procurement notice {key}.
GET /api/v1/tenders/stats Get procurement coverage metrics · Get non-personal procurement coverage metrics #
Ask an LLM
“How many procurement notices does the tender dataset cover and how fresh is it?”
“What share of tenders have geography or CODICE v3 data?”
Tell an agent
Get the procurement coverage stats.
Show how fresh and complete the tender data is.
GET /api/v1/tenders/suppliers List tender suppliers ranked by award count · List corporate suppliers by award count #
Ask an LLM
“Which corporate suppliers appear most often in awarded tenders?”
“Are individual people included in the tender suppliers list?”
Tell an agent
List the tender suppliers ranked by award count.
Show the top {limit} corporate tender suppliers.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/openmercantil:openmercantil-public-procurement-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API 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 Specification

openmercantil-public-procurement-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: OpenMercantil Public Procurement API
  version: 1.9.3
  summary: Versioned public-read, browser-account, billing, support and provider-callback contracts.
  description: Public JSON API for Spanish company information derived from BORME and other public sources.
  termsOfService: https://openmercantil.es/terminos-de-uso
  contact:
    name: OpenMercantil
    url: https://openmercantil.es/soporte
    email: social@openmercantil.es
  license:
    name: Source-specific upstream terms; see response catalog metadata
    url: https://openmercantil.es/terminos-de-uso
  x-publisher:
    name: OpenMercantil
    url: https://openmercantil.es/
    email: social@openmercantil.es
  x-spatial: http://publications.europa.eu/resource/authority/country/ESP
  x-temporal: 2009-01-01/..
  x-language: es
  x-dcat-catalog: https://openmercantil.es/catalog.rdf
  x-rate-limit:
    free:
      per_min: 60
      per_day: 200
      kind: anonymous-ip
    profesional:
      per_min: 120
      per_day: 5000
      kind: api-key
    max:
      per_min: 600
      per_day: 50000
      kind: api-key
    enterprise:
      per_min: 1200
      per_day: 500000
      kind: contract
  x-methodology: https://openmercantil.es/metodologia
  x-sources: https://openmercantil.es/fuentes
  x-corrections: https://openmercantil.es/correcciones
  x-contract-status: Public read, browser-account and provider-callback surfaces are explicitly separated in this contract. Operator/admin routes are excluded. The public MCP consumes only the allowlisted GET read plane.
  x-account-segment-contract:
    projection: company_public_v2 immutable corporate sidecar
    synchronous_row_cap: 500
    bounded_count_cap: 50001
    count_semantics: The segment run response count is the number of rows returned, never a global total. Dataset preview uses total_is_lower_bound=true and total_lower_bound when the bounded count reaches 50001.
    related_web_dataset_surface:
      preview_path: /mi-cuenta/datasets/preview
      export_path: /mi-cuenta/datasets/export.csv
      synchronous_export_max_rows: 500
      overflow_status: 503
      overflow_error: async_export_required
  x-company-identity-contract:
    version: '1.0'
    projection: company_public_v2 immutable generation-bound corporate sidecar
    applies_to: Every /api/v1/company/{slug}*, /api/v1/empresa/{slug}* and /api/v1/grafo/{slug} read before any report, cache, graph or dataset lookup. /api/v1/companies/compare resolves both requested subjects in one bounded company_public_v2 batch before either row is exposed; MCP company tools inherit these preflights through REST.
    resolution:
      published: canonical corporate slug admitted
      safe_alias: internally canonicalized and Content-Location emitted
      withheld: neutral 404; includes absent, personal and ambiguous/quarantined identities
      unavailable: 503 with no-store; clients must not infer absence
    search: Exact corporate CIF, exact canonical/safe-alias slug, or bounded name_prefix2 pool scored in application code. DNI/NIE and ambiguous CIFs return zero items.
    public_company_count: company_public_projection_state.row_count
servers:
- url: https://openmercantil.es
  description: Production
tags:


# --- truncated at 32 KB (72 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/openmercantil/refs/heads/main/openapi/openmercantil-public-procurement-api-openapi.yml