procuris

Datenmodell

Die Felder eines Datensatzes mit Typ, wie fehlende und geschätzte Werte aussehen und welcher Schlüssel eine Ausschreibung dauerhaft kennzeichnet.

Auf Anfrage

Diese Leistung erhalten Sie über ein individuelles Angebot.

Ein Datensatz je Ausschreibung ist das Ziel, keine Garantie. Erscheint eine Bekanntmachung auf mehreren Portalen, führt procuris sie zu einem Datensatz zusammen. Erkennt procuris eine Dublette erst später, archiviert es den jüngeren Datensatz mit archiveReason gleich merged und nennt in mergedInto die id des Datensatzes, der bestehen bleibt.

Berichtigungen ändern den bestehenden Datensatz, statt einen neuen anzulegen. Berichtigungen und Änderungsbekanntmachungen behalten die id und bekommen ein neues lastModified. procuris löscht keine Datensätze, sondern archiviert sie. Abgelaufene, aufgehobene, vergebene oder zusammengeführte Ausschreibungen bekommen den Status archived.

Liste, Einzelabruf und Webhooks liefern dieselben vollständigen Datensätze. Die Schlüssel sind in camelCase geschrieben (Wortanfänge ab dem zweiten Wort groß, zum Beispiel lastModified).

Vollständiges Beispiel

Das Beispiel zeigt den Musterdatensatz dieser Doku mit Stand 1. Oktober 2026. Die Vergabestelle veröffentlichte die Bekanntmachung am 17. September ohne Auftragswert. Bis zum 22. September stand darum eine Schätzung im Datensatz. Am 22. September nannte die Vergabestelle den Auftragswert von 351.000 Euro, und am 24. September verschob sie die Angebotsfrist.

{
  "id": "e9da30eb-50e6-47f1-887f-434016267b2f",
  "status": "open",
  "archiveReason": null,
  "mergedInto": null,
  "title": "Nordhausen - Sanierung Rolandbrunnen, Erneuerung Brunnentechnik",
  "description": "Erneuerung der Brunnentechnik des Rolandbrunnens in Nordhausen. Los 1 umfasst Pumpen und Steuerung, Los 2 die Beckenabdichtung.",
  "tenderNumber": "33/61/2026",
  "url": "https://www.procuris.eu/notices/nordhausen-sanierung-rolandbrunnen-erneuerung-brunnentechnik-e9da30eb",
  "publicationDate": "2026-09-17T13:32:56.000Z",
  "submissionDate": "2026-10-14T08:00:00.000Z",
  "participationDeadline": null,
  "lastModified": "2026-09-24T09:10:00.000Z",
  "checkedAt": "2026-10-01T06:00:00.000Z",
  "contractAmount": {
    "value": 351000,
    "currency": "EUR",
    "estimated": false
  },
  "procedureType": "open",
  "contractNature": "works",
  "legislation": null,
  "organizations": [
    {
      "id": "7c2a9e41-3d8b-4f6a-b1e2-5a0c9d4e8f17",
      "name": "Stadtverwaltung Nordhausen - Vergabestelle",
      "role": "contractingParty",
      "contactName": "Vergabestelle",
      "email": "vergabe@example.org",
      "phone": "+49 3631 000000",
      "address": {
        "street": "Musterstraße 1",
        "postalCode": "99734",
        "city": "Nordhausen",
        "countryCode": "DE"
      }
    }
  ],
  "cpvClassifications": [
    {
      "cpvCode": "45000000",
      "title": "Bauarbeiten"
    },
    {
      "cpvCode": "71000000",
      "title": "Architektur & Ingenieurwesen"
    }
  ],
  "regionCodes": ["DEG"],
  "realizedLocation": "Nordhausen",
  "lots": [
    {
      "lotNumber": "1",
      "title": "Pumpen und Steuerung",
      "description": "Lieferung und Einbau der Umwälzpumpen und der Brunnensteuerung.",
      "contractAmount": {
        "value": 212000,
        "currency": "EUR",
        "estimated": true
      },
      "submissionDate": null,
      "cpvClassifications": [
        {
          "cpvCode": "45232150",
          "title": "Arbeiten an Wasserleitungen"
        }
      ]
    },
    {
      "lotNumber": "2",
      "title": "Beckenabdichtung",
      "description": null,
      "contractAmount": null,
      "submissionDate": null,
      "cpvClassifications": []
    }
  ],
  "sources": [
    {
      "name": "TED",
      "url": "https://ted.europa.eu/de/notice/-/detail/000000-2026",
      "publishedAt": "2026-09-17T13:32:56.000Z"
    }
  ]
}

Titel, Vergabenummer, Termine und CPV-Codes stammen aus einer echten Bekanntmachung. Kontakt, Lose, Region und Quelle sind zur Veranschaulichung ergänzt. Die Kontaktdaten sind Platzhalter.

Grundregeln

  • Fehlende Werte stehen als null, nicht als fehlender Schlüssel. „oder null“ in den Tabellen heißt: der Schlüssel steht im Datensatz, ohne Wert. Bei Angaben aus der Bekanntmachung hat die Vergabestelle den Wert meist nicht veröffentlicht. Bei archiveReason, mergedInto, contractAmount und den Feldern der Lose sagt die Tabelle, was null dort bedeutet. Eine leere Liste [] heißt dasselbe für Listen.
  • Zeitpunkte stehen in UTC nach ISO 8601, zum Beispiel 2026-10-14T08:00:00.000Z.
  • lastModified ist der Zeitpunkt der letzten inhaltlichen Änderung bei procuris. Gemeint ist nicht der Zeitpunkt bei der Vergabestelle. Der Wert steigt nur.
  • checkedAt ist der Datenstand, also wann procuris den Datensatz zuletzt geprüft hat. Ein neues checkedAt allein ist keine inhaltliche Änderung. Es ändert lastModified nicht und löst kein Ereignis aus.
  • Unbekannte Felder und Werte übergehen. Neue Felder und Werte können dazukommen, zum Beispiel ein neuer Wert für archiveReason. Lassen Sie Ihr System beides übergehen, statt abzubrechen, weil ein Abbruch den Abgleich bis zur nächsten Anpassung anhält.

Felder der Ausschreibung

FeldTypBedeutung
idText (UUID)fester Schlüssel der Ausschreibung, bleibt auch bei Berichtigungen gleich. Nutzen Sie ihn für Änderungen und, zusammen mit mergedInto, gegen Dubletten.
statusopen oder archivedopen: läuft. archived: beendet, siehe archiveReason.
archiveReasonText oder nullexpired (Frist abgelaufen), cancelled (aufgehoben), awarded (vergeben), merged (mit einem anderen Datensatz zusammengeführt). Bei open ist der Wert null.
mergedIntoText (UUID) oder nullbei merged die id des Datensatzes, der bestehen bleibt. Sonst null.
titleTextTitel der Bekanntmachung
descriptionText oder nullBeschreibung der Leistung
tenderNumberText oder nullVergabenummer der Vergabestelle
urlTextöffentliche Seite der Bekanntmachung bei procuris
publicationDateZeitpunkterste Veröffentlichung
submissionDateZeitpunkt oder nullAngebotsfrist
participationDeadlineZeitpunkt oder nullTeilnahmefrist bei zweistufigen Verfahren
lastModifiedZeitpunktletzte inhaltliche Änderung bei procuris, siehe oben
checkedAtZeitpunktDatenstand, siehe oben
contractAmountObjekt oder nullAuftragswert, siehe unten
procedureTypeText oder nullVerfahrensart nach der eForms-Codeliste procurement-procedure-type, zum Beispiel open (offenes Verfahren) oder restricted (nicht offenes Verfahren)
contractNatureText oder nullworks (Bauleistung), supplies (Lieferung), services (Dienstleistung)
legislationText oder nullRechtsgrundlage, soweit veröffentlicht
organizationsListebeteiligte Organisationen, siehe unten
cpvClassificationsListeCPV-Codes mit cpvCode (Text, acht Ziffern) und title (Text). CPV ist das europäische Verzeichnis der Leistungsarten. Kann leer sein.
regionCodesListe von TextRegionen nach NUTS, der europäischen Einteilung in Gebiete, zum Beispiel DEG für Thüringen. Kann leer sein.
realizedLocationText oder nullAusführungsort als Freitext
lotsListeLose, siehe unten. Leer, wenn die Ausschreibung nicht in Lose geteilt ist.
sourcesListeOriginalquellen, siehe unten. Mindestens ein Eintrag.

eForms ist das EU-Format für Bekanntmachungen. Die Codelisten veröffentlicht das Amt für Veröffentlichungen der EU.

Auftragswert

FeldTypBedeutung
valueZahlBetrag ohne Umsatzsteuer, zum Beispiel 351000
currencyTextWährung nach ISO 4217, meist EUR. procuris rechnet andere Währungen nicht in Euro um.
estimatedWahrheitswerttrue: geschätzt, weil die Vergabestelle keinen Wert veröffentlicht hat. false: veröffentlichter Wert.

Geschätzt sein kann nur der Auftragswert. Das gilt für die Ausschreibung und für die Lose. Gibt es weder einen veröffentlichten noch einen geschätzten Wert, ist contractAmount gleich null.

Organisationen

FeldTypBedeutung
idText (UUID)fester Schlüssel der Organisation. Erkennt procuris dieselbe Stadtverwaltung in mehreren Ausschreibungen, trägt sie dort dieselbe id. Zwei verschiedene id schließen nicht aus, dass es dieselbe Stelle ist.
nameTextName
roleTextcontractingParty (Auftraggeber), procurementOffice (Vergabestelle, wenn sie nicht der Auftraggeber selbst ist), reviewBody (Vergabekammer, zuständig für Nachprüfungen)
contactNameText oder nullAnsprechperson oder Stelle
emailText oder nullE-Mail-Adresse
phoneText oder nullTelefonnummer
addressObjekt oder nullAnschrift, siehe unten

address hat diese Felder:

FeldTypBedeutung
streetText oder nullStraße und Hausnummer
postalCodeText oder nullPostleitzahl
cityText oder nullOrt
countryCodeText oder nullLand als Zweibuchstaben-Code nach ISO 3166-1 alpha-2, zum Beispiel DE

Lose

Lose sind Teile einer Ausschreibung, auf die Sie einzeln bieten können.

FeldTypBedeutung
lotNumberTextLosnummer, wie die Vergabestelle sie vergibt, zum Beispiel 1 oder LOT-0002
titleTextTitel des Loses
descriptionText oder nullBeschreibung
contractAmountObjekt oder nullWert des Loses, gleicher Aufbau wie oben
submissionDateZeitpunkt oder nulleigene Frist des Loses. null: es gilt die Frist der Ausschreibung.
cpvClassificationsListeCPV-Codes des Loses. Leer: es gelten die Codes der Ausschreibung.

Quellen

Erscheint eine Ausschreibung auf mehreren Portalen, hat sie mehrere Einträge in sources.

FeldTypBedeutung
nameTextName des Portals, zum Beispiel TED
urlText oder nullAdresse der Bekanntmachung auf dem Portal
publishedAtZeitpunkt oder nullVeröffentlichung auf diesem Portal

So verarbeiten Sie die Felder

  • Legen Sie Datensätze über id an und aktualisieren Sie sie über dieselbe id. So entsteht in Ihrem System je id ein Eintrag. Dubletten, die procuris erst später erkennt, lösen Sie über merged auf (übernächster Punkt).
  • Überschreiben Sie einen Datensatz nur, wenn das neue lastModified größer ist als das gespeicherte. Sonst überschreibt eine verspätet zugestellte Webhook-Nachricht einen neueren Stand.
  • Kommt ein Datensatz mit archiveReason gleich merged, führen Sie ihn in Ihrem System mit dem Datensatz aus mergedInto zusammen. Fehlt der bleibende Datensatz in Ihrem System, holen Sie ihn mit API-Zugang per GET /v1/tenders/{mergedInto}. Ohne API-Zugang, wenn Ihr System nur Webhooks empfängt (Variante B unter CRM und ERP), schließen Sie den alten Eintrag und vermerken mergedInto an ihm. Die bleibende Ausschreibung kommt erst in Ihr System, wenn ein Ereignis zu ihr kommt. In Variante B ist das der Fall, wenn sie Treffer eines gewählten Suchauftrags ist oder als früherer Treffer ein Änderungsereignis bekommt.
  • Zeigen Sie bei estimated: true den Auftragswert als Schätzung an, damit niemand mit dem Betrag rechnet, als wäre er veröffentlicht.

Verwandte Seiten

Angebot anfordern

Schildern Sie uns, was Sie nutzen oder anbinden möchten. Ihr Angebot richtet sich nach diesem Umfang.

Angebot anfordern

Auf dieser Seite