veldora-no Tenders API

The Tenders API from veldora-no — 2 operation(s) for tenders.

Operations 2

GET /v1/tenders Search public tenders #
GET /v1/tenders/{id} Get one 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/veldora-no:veldora-no-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

veldora-no-tenders-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Veldora No Tenders API
  version: 1.0.0
  contact:
    name: Veldora
    url: https://veldora.no/contact
  license:
    name: 'Data: NLOD 2.0 (Brreg, Lovdata), CC BY 4.0 (Doffin, Kartverket, PRH), Norges Bank (source named) and TED reuse terms; see description'
  x-deprecation-policy:
    url: https://veldora.no/docs#versioning
    noticeDays: 90
    headers:
    - Deprecation
    - Sunset
    - Link
  description: 'Operations tagged Tenders across 2 of this provider''s published API definitions: veldora-no-openapi.json, veldora-no-original.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://veldora.no
tags:
- name: Tenders
paths:
  /v1/tenders:
    get:
      operationId: tenders
      summary: Search public tenders
      description: 'Norwegian public procurement notices from Doffin and TED, filterable by CPV code, region (county or NUTS), deadline and buyer.


        Price: 0.01 USDC per successful call. Failed calls (4xx/5xx) are not charged.'
      parameters:
      - name: q
        in: query
        required: false
        description: Words in the title or description.
        schema:
          type: string
          minLength: 2
          maxLength: 100
      - name: cpv
        in: query
        required: false
        description: CPV code or prefix; up to 10, comma-separated. 72 matches all IT services.
        schema:
          type: string
          pattern: ^\d{2,8}(,\d{2,8}){0,9}$
      - name: region
        in: query
        required: false
        description: NUTS code (NO, NO08, NO081) or 2-digit county number (fylkesnummer).
        schema:
          type: string
          pattern: ^(NO[0-9A-Z]{0,3}|\d{2})$
      - name: deadline_from
        in: query
        required: false
        description: Deadline on or after this date (YYYY-MM-DD).
        schema:
          type: string
          format: date
      - name: deadline_to
        in: query
        required: false
        description: Deadline on or before this date (YYYY-MM-DD).
        schema:
          type: string
          format: date
      - name: buyer_orgnr
        in: query
        required: false
        description: 9-digit Norwegian organisation number (mod-11 checked).
        schema:
          type: string
          pattern: ^\d{9}$
      - name: open
        in: query
        required: false
        description: Only tenders whose deadline has not passed.
        schema:
          type: boolean
          default: true
      - name: page
        in: query
        required: false
        description: Zero-based page.
        schema:
          type: integer
          minimum: 0
          default: 0
      - name: size
        in: query
        required: false
        description: Results per page.
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 20
      - name: PAYMENT-SIGNATURE
        in: header
        required: false
        description: Base64-encoded x402 v2 PaymentPayload. Leave out to get the price.
        schema:
          type: string
      x-price:
        amount: '0.01'
        currency: USD
        asset: USDC
        atomic: '10000'
        network: eip155:8453
      responses:
        '200':
          description: Data. The PAYMENT-RESPONSE header holds the settlement receipt (base64 JSON).
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
            PAYMENT-RESPONSE:
              schema:
                type: string
            X-Data-Fetched-At:
              schema:
                type: string
                format: date-time
            X-Data-Stale:
              schema:
                type: string
                enum:
                - 'true'
                - 'false'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: {}
                  page:
                    type: object
                  meta:
                    type: object
        '400':
          description: Invalid input. Not charged; no payment is asked for.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: Payment required. The PAYMENT-REQUIRED header (base64 JSON, x402 v2) lists what to pay. Sign it with an x402 client and resend the request with the PAYMENT-SIGNATURE header. The body repeats the requirements, plus `error` when a payment was rejected.
          headers:
            PAYMENT-REQUIRED:
              schema:
                type: string
              description: Base64-encoded PaymentRequired (x402 v2).
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentRequired'
        '404':
          description: Not found. Not charged.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '405':
          description: Method not allowed.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: The same payment is being processed by another request. Retry with the same header.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited. Not charged. See Retry-After.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal error. Not charged.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: A data source answered with an error. Not charged; retry.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Upstream data source, facilitator or settlement unavailable. Not charged; retry.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Tenders
    servers:
    - url: https://veldora.no
  /v1/tenders/{id}:
    get:
      operationId: tender
      summary: Get one tender
      description: 'One procurement notice with buyer (linked to the company register), CPV codes, regions, deadline and source link.


        Price: 0.005 USDC per successful call. Failed calls (4xx/5xx) are not charged.'
      parameters:
      - name: id
        in: path
        required: true
        description: Tender id, e.g. ted:123456-2026 or doffin:2026-105234.
        schema:
          type: string
          pattern: ^(ted:\d{1,8}-\d{4}|doffin:[A-Za-z0-9-]{1,40})$
      - name: PAYMENT-SIGNATURE
        in: header
        required: false
        description: Base64-encoded x402 v2 PaymentPayload. Leave out to get the price.
        schema:
          type: string
      x-price:
        amount: '0.005'
        currency: USD
        asset: USDC
        atomic: '5000'
        network: eip155:8453
      responses:
        '200':
          description: Data. The PAYMENT-RESPONSE header holds the settlement receipt (base64 JSON).
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
            PAYMENT-RESPONSE:
              schema:
                type: string
            X-Data-Fetched-At:
              schema:
                type: string
                format: date-time
            X-Data-Stale:
              schema:
                type: string
                enum:
                - 'true'
                - 'false'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data: {}
                  page:
                    type: object
                  meta:
                    type: object
        '400':
          description: Invalid input. Not charged; no payment is asked for.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '402':
          description: Payment required. The PAYMENT-REQUIRED header (base64 JSON, x402 v2) lists what to pay. Sign it with an x402 client and resend the request with the PAYMENT-SIGNATURE header. The body repeats the requirements, plus `error` when a payment was rejected.
          headers:
            PAYMENT-REQUIRED:
              schema:
                type: string
              description: Base64-encoded PaymentRequired (x402 v2).
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentRequired'
        '404':
          description: Not found. Not charged.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '405':
          description: Method not allowed.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: The same payment is being processed by another request. Retry with the same header.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited. Not charged. See Retry-After.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal error. Not charged.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: A data source answered with an error. Not charged; retry.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Upstream data source, facilitator or settlement unavailable. Not charged; retry.
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimit-Limit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimit-Remaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimit-Reset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      tags:
      - Tenders
    servers:
    - url: https://veldora.no
components:
  headers:
    RateLimit-Limit:
      description: Requests allowed per window.
      schema:
        type: integer
    RateLimit:
      description: Remaining quota and seconds to reset, structured (draft-ietf-httpapi-ratelimit-headers), e.g. "per-ip";r=119;t=60.
      schema:
        type: string
    Retry-After:
      description: Seconds to wait before retrying.
      schema:
        type: integer
    RateLimit-Reset:
      description: Seconds until the window resets.
      schema:
        type: integer
    RateLimit-Remaining:
      description: Requests left in the current window.
      schema:
        type: integer
    RateLimit-Policy:
      description: 'Quota policy: 120 requests per 60 seconds per IP, e.g. "per-ip";q=120;w=60.'
      schema:
        type: string
  schemas:
    Error:
      type: object
      description: Every error from the API has this shape. Branch on `error.code`; `retryable` says whether the same request can succeed later.
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Machine-readable error code.
              examples:
              - invalid_orgnr
              - invalid_id
              - invalid_parameter
              - unknown_parameter
              - missing_filter
              - paging_limit
              - enk_name_search
              - not_found
              - method_not_allowed
              - rate_limited
              - payment_in_progress
              - settlement_pending
              - payments_unavailable
              - facilitator_unavailable
              - data_unavailable
              - upstream_unavailable
              - temporarily_unavailable
              - internal_error
            message:
              type: string
              description: What went wrong and what to do next, in English.
            retryable:
              type: boolean
              description: 'True for 429, 502, 503 and 504: try again later with the same request.'
            docs:
              type: string
              format: uri
              description: Link to the error reference.
          required:
          - code
          - message
          - retryable
          - docs
          additionalProperties: true
      required:
      - error
    PaymentRequired:
      type: object
      description: x402 v2 PaymentRequired. The same object is base64-encoded in the PAYMENT-REQUIRED header.
      properties:
        x402Version:
          type: integer
          const: 2
        error:
          type: string
          description: Why a sent payment was refused (absent on the first 402).
        resource:
          type: object
          properties:
            url:
              type: string
              format: uri
            description:
              type: string
            mimeType:
              type: string
        accepts:
          type: array
          items:
            type: object
            properties:
              scheme:
                type: string
                const: exact
              network:
                type: string
                description: CAIP-2 chain id, e.g. eip155:8453.
              amount:
                type: string
                description: Price in USDC atomic units (6 decimals).
              asset:
                type: string
                description: USDC contract address.
              payTo:
                type: string
              maxTimeoutSeconds:
                type: integer
              extra:
                type: object
            required:
            - scheme
            - network
            - amount
            - asset
            - payTo
        extensions:
          type: object
      required:
      - x402Version
      - accepts
externalDocs:
  description: Docs, pricing and examples
  url: https://veldora.no/docs
x-refined-from:
- veldora-no-openapi.json
- veldora-no-original.json
x-mcp:
  url: https://veldora.no/mcp
  transport: streamable-http