tenderapi-eu Tenders API

The Tenders API from tenderapi-eu — 2 operation(s) for tenders.

Operations 2

POST /tenders/search Search tenders #
GET /tenders/{id} Get tender #

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/tenderapi-eu:tenderapi-eu-tenders-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

tenderapi-eu-tenders-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Tenders API
  version: '1.0'
  description: 'REST API for European public tenders from TED and national procurement portals.


    New values can be added to enums in responses (for example new portals), so handle unknown values.


    Guides, code examples and plan limits: https://docs.tenderapi.eu'
  contact:
    url: https://tenderapi.eu
  termsOfService: https://tenderapi.eu/terms/
servers:
- url: https://api.tenderapi.eu/api/v1
security:
- apiKey: []
tags:
- name: Tenders
paths:
  /tenders/search:
    post:
      tags:
      - Tenders
      operationId: searchTenders
      summary: Search tenders
      description: 'Search and filter tenders from all connected portals. Every filter is optional and filters are combined,

        so a tender must match all of them. An empty body `{}` returns the newest tenders.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchTendersRequest'
            example:
              buyerCountries:
              - DEU
              cpvCodes:
              - '45000000'
              statuses:
              - open
              sortBy: deadline
              limit: 10
      responses:
        '200':
          description: One page of matching tenders.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            X-Quota-Limit:
              $ref: '#/components/headers/X-Quota-Limit'
            X-Quota-Remaining:
              $ref: '#/components/headers/X-Quota-Remaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenderList'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
  /tenders/{id}:
    get:
      tags:
      - Tenders
      operationId: getTender
      summary: Get tender
      description: Fetch one tender by id, including the organisations it was awarded to.
      parameters:
      - $ref: '#/components/parameters/TenderID'
      responses:
        '200':
          description: The tender.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            X-Quota-Limit:
              $ref: '#/components/headers/X-Quota-Limit'
            X-Quota-Remaining:
              $ref: '#/components/headers/X-Quota-Remaining'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenderDetail'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    TenderID:
      name: id
      in: path
      required: true
      schema:
        type: string
        format: uuid
      example: 0195f1c2-7b3e-7a10-9c4d-3f2a8e6b1d05
  responses:
    InternalError:
      description: Server error.
    BadRequest:
      description: Invalid request.
    Unauthorized:
      description: Missing or invalid API key.
    TooManyRequests:
      description: Rate limit exceeded.
    NotFound:
      description: Resource not found.
  headers:
    X-RateLimit-Limit:
      description: Requests allowed per minute.
      schema:
        type: integer
    X-Quota-Limit:
      description: Total quota for the month.
      schema:
        type: integer
    X-RateLimit-Remaining:
      description: Remaining requests in the current minute.
      schema:
        type: integer
    X-Quota-Remaining:
      description: Remaining quota for the month.
      schema:
        type: integer
    X-RateLimit-Reset:
      description: Seconds until the rate limit resets.
      schema:
        type: integer
  schemas:
    SearchTendersRequest:
      type: object
      properties:
        buyerCountries:
          type: array
          items:
            type: string
        cpvCodes:
          type: array
          items:
            type: string
        statuses:
          type: array
          items:
            type: string
        sortBy:
          type: string
        limit:
          type: integer
      additionalProperties: false
    EstimatedValue:
      type: object
      properties:
        value:
          type: number
        currency:
          type: string
        valueEur:
          type: number
      required:
      - value
      - currency
      - valueEur
    TenderDetail:
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        abstract:
          type: string
        status:
          type: string
        serviceType:
          type: string
        source:
          type: string
        publicationDate:
          type: string
        deadline:
          type: string
        deadlineHasTime:
          type: boolean
        buyer:
          $ref: '#/components/schemas/Organisation'
        cpvCodes:
          type: array
          items:
            type: string
        estimatedValue:
          $ref: '#/components/schemas/EstimatedValue'
        link:
          type: string
        winners:
          type: array
          items:
            $ref: '#/components/schemas/Organisation'
      required:
      - id
      - title
      - status
      - serviceType
      - source
      - publicationDate
      - deadline
      - deadlineHasTime
      - buyer
      - cpvCodes
      - estimatedValue
      - link
    TenderList:
      type: object
      properties:
        tenders:
          type: array
          items:
            $ref: '#/components/schemas/TenderDetail'
        page:
          $ref: '#/components/schemas/PageInfo'
      required:
      - tenders
      - page
    PageInfo:
      type: object
      properties:
        nextCursor:
          type: string
        total:
          type: object
          properties:
            count:
              type: integer
            capped:
              type: boolean
          required:
          - count
          - capped
      required:
      - nextCursor
      - total
    Organisation:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        country:
          type: string
      required:
      - id
      - name
      - country
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: 'API key from the dashboard (https://dash.tenderapi.eu/api-keys), sent as `Authorization: Bearer tapi_...`.'