Utviklerdokumentasjon

Tenderen API (v1)

Tenderen-API-et er et JSON REST-API for å søke i anbud, administrere lagrede anbud, tilbud, varsler, team og dokumenter, og kjøre KI-analyse. Det er tilgjengelig på Enterprise-planen og autentiseres med API-nøkler.

Basis-URL

Alle endepunkter er versjonert under /api/v1. Forespørsler og svar er JSON over HTTPS.

https://api.tenderen.com/api/v1

Autentisering

Send API-nøkkelen som Bearer-token i Authorization-headeren. Nøkler opprettes i appen under Utviklere → API-nøkler av en eier eller administrator i en bedrift på Enterprise-planen. Hele nøkkelen vises én gang; Tenderen lagrer bare en SHA-256-hash av den. Nøkler kan ha utløpsdato og kan trekkes tilbake når som helst.

curl "https://api.tenderen.com/api/v1/tenders?q=software&cpvCodes=72000000&limit=20" \
  -H "Authorization: Bearer $TENDEREN_API_KEY"

Tilganger (scopes)

Hver nøkkel har en liste med tilganger. Nye nøkler er skrivebeskyttet som standard (tenders:read). Kall til et endepunkt nøkkelen mangler tilgang til, gir 403 INSUFFICIENT_SCOPE.

Endepunkter

Stiene er relative til basis-URL-en. Kolonnen for tilgang viser hva nøkkelen må ha.

Anbud

MetodeStiTilgangHva den gjør
GET/tenderstenders:readSøk i anbud med filtre og paginering.
GET/tenders/:idtenders:readHent ett anbud.
GET/tenders/:id/documentstenders:readList dokumentene til et anbud.
GET/tenders/:id/requirementstenders:readList kravene hentet ut av et anbud.
GET/tenders/savedtenders:readList bedriftens lagrede anbud.
POST/tenders/savedtenders:writeLagre et anbud.
PATCH/tenders/saved/:idtenders:writeOppdater et lagret anbud.

Tilbud

MetodeStiTilgangHva den gjør
POST/bidsbids:writeOpprett et tilbud på et anbud.
GET/bidsbids:readList tilbud.
GET/bids/:idbids:readHent ett tilbud.
PATCH/bids/:idbids:writeOppdater et tilbud.
POST/bids/:id/submitbids:writeMarker et tilbud som levert.

KI-analyse

MetodeStiTilgangHva den gjør
POST/analysis/tender/:idanalysis:writeKjør KI-analyse av et anbud.
POST/analysis/risk/:idanalysis:writeKjør KI-risikoanalyse av et anbud.
POST/analysis/match/:idanalysis:writeBeregn hvor godt et anbud passer bedriften.
POST/analysis/gaps/:idanalysis:writeFinn hull mellom kravene og bedriftsprofilen.

Markedsdata

MetodeStiTilgangHva den gjør
GET/market/insightsmarket:readMarkedsstatistikk.
GET/market/awardsmarket:readSøk i kontraktstildelinger.
GET/market/competitorsmarket:readKonkurrenter i kontraktstildelinger.

Varsler og varslinger

MetodeStiTilgangHva den gjør
GET/alertsalerts:readList varsler.
POST/alertsalerts:writeOpprett et varsel.
GET/alerts/:idalerts:readHent ett varsel.
PATCH/alerts/:idalerts:writeOppdater et varsel.
DELETE/alerts/:idalerts:writeSlett et varsel.
GET/alerts/notifications/listalerts:readList varslinger.
PATCH/alerts/notifications/:id/readalerts:writeMarker en varsling som lest.

Team

MetodeStiTilgangHva den gjør
GET/teamsteams:readList team.
POST/teamsteams:writeOpprett et team.
GET/teams/:idteams:readHent ett team.
PATCH/teams/:idteams:writeOppdater et team.
GET/teams/:id/membersteams:readList teammedlemmer.
POST/teams/:id/membersteams:writeLegg til et teammedlem.
DELETE/teams/:id/members/:memberIdteams:writeFjern et teammedlem.

Konsortier

MetodeStiTilgangHva den gjør
GET/consortiumstenders:readList konsortier.
POST/consortiumstenders:writeOpprett et konsortium på et anbud.
GET/consortiums/:idtenders:readHent ett konsortium.
GET/consortiums/:id/memberstenders:readList konsortiemedlemmer.
POST/consortiums/:id/memberstenders:writeInviter en partnerbedrift.
GET/consortiums/:id/responsibilitiestenders:readList hvem som har ansvar for hva.

Dokumenter

MetodeStiTilgangHva den gjør
GET/assetsassets:readList dokumenter i biblioteket.
POST/assetsassets:writeOpprett en dokumentpost.
GET/assets/:idassets:readHent ett dokument.
DELETE/assets/:idassets:writeSlett et dokument.
POST/assets/:id/uploadassets:writeLast opp en fil til en dokumentpost.
GET/assets/:id/downloadassets:readLast ned et dokument.

Etterlevelse

MetodeStiTilgangHva den gjør
GET/compliance/:tenderIdcompliance:readEtterlevelsesmatrise for et anbud.
POST/compliance/espdcompliance:readGenerer et ESPD-svar.
GET/compliance/certifications/listcompliance:readList bedriftens sertifiseringer.

Chat med et anbud

MetodeStiTilgangHva den gjør
POST/chatchat:writeStill et spørsmål om et anbud.
GET/chat/:sessionId/messageschat:readHent meldingene i en chatøkt.

Webhooks

MetodeStiTilgangHva den gjør
POST/webhookswebhooks:manageRegistrer et webhook-endepunkt.
GET/webhookswebhooks:manageList webhook-endepunkter.
DELETE/webhooks/:idwebhooks:manageSlett et webhook-endepunkt.
GET/webhooks/:id/deliverieswebhooks:manageLeveringshistorikk for en webhook.

Konto

MetodeStiTilgangHva den gjør
GET/meaccount:readBrukeren og bedriften nøkkelen tilhører.
GET/me/usageaccount:readAPI-bruk for nøkkelen.
GET/healthingenHelsesjekk (uten autentisering).

Paginering og filtrering

Listeendepunkter tar page (fra 1) og limit (1–100, standard 20) og returnerer et pagination-objekt med page, limit, total og pages. GET /tenders tar i tillegg q, cpvCodes og regions (kommaseparert), status, source, minValue, maxValue, deadlineBefore, deadlineAfter, sort (publishedAt, deadline eller estimatedValue) og order (asc eller desc).

{
  "success": true,
  "data": [ { "id": "…", "title": "…", "deadline": "…" } ],
  "pagination": { "page": 1, "limit": 20, "total": 412, "pages": 21 }
}

Feil

Feil returnerer success: false med en lesbar error og en maskinlesbar code.

{
  "success": false,
  "error": "Insufficient permissions. Required scope: bids:write",
  "code": "INSUFFICIENT_SCOPE"
}
KodeHTTP-statusBetydning
INVALID_AUTH401API-nøkkel mangler, er feilformatert eller ukjent.
KEY_INACTIVE401Nøkkelen er trukket tilbake.
KEY_EXPIRED401Nøkkelen har passert utløpsdatoen.
INSUFFICIENT_SCOPE403Nøkkelen mangler tilgangen endepunktet krever.
INVALID_DATA400Forespørselskroppen feilet validering; se details.
INVALID_PARAMS400En spørrings- eller stiparameter er ugyldig.
FORBIDDEN403Du har ikke lov til å endre denne ressursen.
NOT_FOUND404Ressursen finnes ikke eller tilhører en annen bedrift.
RATE_LIMIT_EXCEEDED429For mange forespørsler i inneværende time.
INTERNAL_ERROR500Noe feilet hos oss; prøv igjen senere.

Bruksgrenser

Hver API-nøkkel kan som standard gjøre 1 000 forespørsler per time (grensen lagres per nøkkel). Går du over, får du 429 RATE_LIMIT_EXCEEDED; vent til timevinduet nullstilles. MCP-endepunktet har en egen grense på 1 000 forespørsler per time per token.

Webhooks

Status: du kan registrere, liste og slette webhook-endepunkter i dag, men levering av hendelser er ikke i drift ennå — det sendes foreløpig ingen hendelser til registrerte endepunkter. Formatet under er det leveringene vil bruke. Hent data fra REST-API-et (for eksempel GET /alerts/notifications/list) til levering er på plass.

Registrer et HTTPS-endepunkt med POST /webhooks og velg hendelsene du vil ha. Svaret inneholder en signeringsnøkkel som bare vises én gang.

Hendelser

  • tender.new — Et nytt anbud passer ett av varslene dine.
  • tender.deadline — Fristen for et anbud du følger nærmer seg.
  • tender.awarded — Et anbud du følger er tildelt.
  • bid.submitted — Et tilbud ble markert som levert.
  • bid.status_changed — Et tilbud endret status.
  • alert.triggered — Et varsel ga nye treff.

Verifisere signaturer

Hver levering er en POST med JSON-kroppen {event, data, timestamp, webhookId} og headerne X-Tenderen-Event, X-Tenderen-Delivery og X-Tenderen-Signature. Signaturen er sha256= etterfulgt av heksadesimal HMAC-SHA256 av den rå forespørselskroppen, med signeringsnøkkelen som nøkkel. Sammenlign i konstant tid før du stoler på innholdet.

import crypto from 'node:crypto';

function isValidTenderenSignature(rawBody, signatureHeader, secret) {
  const expected =
    'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  const a = Buffer.from(signatureHeader ?? '');
  const b = Buffer.from(expected);
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

En levering som feiler, eller ikke svarer med 2xx-status innen 10 sekunder, forsøkes opptil to ganger til: etter 1 minutt og etter 5 minutter. Leveringshistorikken hentes fra GET /webhooks/:id/deliveries.

MCP-kobling for KI-assistenter

Tenderen kjører en ekstern Model Context Protocol-server, slik at KI-assistenter som Claude, ChatGPT og Cursor kan søke i anbud, vurdere egnethet, følge opp pipelinen, skrive tilbudsutkast og spørre anbudsdokumentene på dine vegne — 18 verktøy, med lesetilgang som standard og skriving, innsending og sletting som egne valg på samtykkeskjermen. Koble til med OAuth (autorisasjonskode med PKCE; dynamisk klientregistrering støttes) eller med en API-nøkkel som Bearer-token. Verktøy som ikke kan angres, forhåndsvises først og krever bekreftelse. Hvert kall vises under Utviklere → AI-koblinger, der koblinger kan testes og trekkes tilbake.

MCP-endepunkt (Streamable HTTP)

https://tenderen.com/api/mcp

Eldre endepunkt (HTTP+SSE)

https://tenderen.com/api/mcp/sse

OAuth-oppdagelse

https://tenderen.com/.well-known/oauth-authorization-server
https://tenderen.com/.well-known/oauth-protected-resource

Støtte

Spørsmål om API-et eller en bestemt integrasjon: [email protected].

Sist gjennomgått 4. oktober 2026