Datenmodell
Die Felder eines Datensatzes mit Typ, wie fehlende und geschätzte Werte aussehen und welcher Schlüssel eine Ausschreibung dauerhaft kennzeichnet.
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. „odernull“ 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. BeiarchiveReason,mergedInto,contractAmountund den Feldern der Lose sagt die Tabelle, wasnulldort 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. lastModifiedist der Zeitpunkt der letzten inhaltlichen Änderung bei procuris. Gemeint ist nicht der Zeitpunkt bei der Vergabestelle. Der Wert steigt nur.checkedAtist der Datenstand, also wann procuris den Datensatz zuletzt geprüft hat. Ein neuescheckedAtallein ist keine inhaltliche Änderung. Es ändertlastModifiednicht 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
| Feld | Typ | Bedeutung |
|---|---|---|
id | Text (UUID) | fester Schlüssel der Ausschreibung, bleibt auch bei Berichtigungen gleich. Nutzen Sie ihn für Änderungen und, zusammen mit mergedInto, gegen Dubletten. |
status | open oder archived | open: läuft. archived: beendet, siehe archiveReason. |
archiveReason | Text oder null | expired (Frist abgelaufen), cancelled (aufgehoben), awarded (vergeben), merged (mit einem anderen Datensatz zusammengeführt). Bei open ist der Wert null. |
mergedInto | Text (UUID) oder null | bei merged die id des Datensatzes, der bestehen bleibt. Sonst null. |
title | Text | Titel der Bekanntmachung |
description | Text oder null | Beschreibung der Leistung |
tenderNumber | Text oder null | Vergabenummer der Vergabestelle |
url | Text | öffentliche Seite der Bekanntmachung bei procuris |
publicationDate | Zeitpunkt | erste Veröffentlichung |
submissionDate | Zeitpunkt oder null | Angebotsfrist |
participationDeadline | Zeitpunkt oder null | Teilnahmefrist bei zweistufigen Verfahren |
lastModified | Zeitpunkt | letzte inhaltliche Änderung bei procuris, siehe oben |
checkedAt | Zeitpunkt | Datenstand, siehe oben |
contractAmount | Objekt oder null | Auftragswert, siehe unten |
procedureType | Text oder null | Verfahrensart nach der eForms-Codeliste procurement-procedure-type, zum Beispiel open (offenes Verfahren) oder restricted (nicht offenes Verfahren) |
contractNature | Text oder null | works (Bauleistung), supplies (Lieferung), services (Dienstleistung) |
legislation | Text oder null | Rechtsgrundlage, soweit veröffentlicht |
organizations | Liste | beteiligte Organisationen, siehe unten |
cpvClassifications | Liste | CPV-Codes mit cpvCode (Text, acht Ziffern) und title (Text). CPV ist das europäische Verzeichnis der Leistungsarten. Kann leer sein. |
regionCodes | Liste von Text | Regionen nach NUTS, der europäischen Einteilung in Gebiete, zum Beispiel DEG für Thüringen. Kann leer sein. |
realizedLocation | Text oder null | Ausführungsort als Freitext |
lots | Liste | Lose, siehe unten. Leer, wenn die Ausschreibung nicht in Lose geteilt ist. |
sources | Liste | Originalquellen, 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
| Feld | Typ | Bedeutung |
|---|---|---|
value | Zahl | Betrag ohne Umsatzsteuer, zum Beispiel 351000 |
currency | Text | Währung nach ISO 4217, meist EUR. procuris rechnet andere Währungen nicht in Euro um. |
estimated | Wahrheitswert | true: 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
| Feld | Typ | Bedeutung |
|---|---|---|
id | Text (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. |
name | Text | Name |
role | Text | contractingParty (Auftraggeber), procurementOffice (Vergabestelle, wenn sie nicht der Auftraggeber selbst ist), reviewBody (Vergabekammer, zuständig für Nachprüfungen) |
contactName | Text oder null | Ansprechperson oder Stelle |
email | Text oder null | E-Mail-Adresse |
phone | Text oder null | Telefonnummer |
address | Objekt oder null | Anschrift, siehe unten |
address hat diese Felder:
| Feld | Typ | Bedeutung |
|---|---|---|
street | Text oder null | Straße und Hausnummer |
postalCode | Text oder null | Postleitzahl |
city | Text oder null | Ort |
countryCode | Text oder null | Land 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.
| Feld | Typ | Bedeutung |
|---|---|---|
lotNumber | Text | Losnummer, wie die Vergabestelle sie vergibt, zum Beispiel 1 oder LOT-0002 |
title | Text | Titel des Loses |
description | Text oder null | Beschreibung |
contractAmount | Objekt oder null | Wert des Loses, gleicher Aufbau wie oben |
submissionDate | Zeitpunkt oder null | eigene Frist des Loses. null: es gilt die Frist der Ausschreibung. |
cpvClassifications | Liste | CPV-Codes des Loses. Leer: es gelten die Codes der Ausschreibung. |
Quellen
Erscheint eine Ausschreibung auf mehreren Portalen, hat sie mehrere Einträge in sources.
| Feld | Typ | Bedeutung |
|---|---|---|
name | Text | Name des Portals, zum Beispiel TED |
url | Text oder null | Adresse der Bekanntmachung auf dem Portal |
publishedAt | Zeitpunkt oder null | Veröffentlichung auf diesem Portal |
So verarbeiten Sie die Felder
- Legen Sie Datensätze über
idan und aktualisieren Sie sie über dieselbeid. So entsteht in Ihrem System jeidein Eintrag. Dubletten, die procuris erst später erkennt, lösen Sie übermergedauf (übernächster Punkt). - Überschreiben Sie einen Datensatz nur, wenn das neue
lastModifiedgrößer ist als das gespeicherte. Sonst überschreibt eine verspätet zugestellte Webhook-Nachricht einen neueren Stand. - Kommt ein Datensatz mit
archiveReasongleichmerged, führen Sie ihn in Ihrem System mit dem Datensatz ausmergedIntozusammen. Fehlt der bleibende Datensatz in Ihrem System, holen Sie ihn mit API-Zugang perGET /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 vermerkenmergedIntoan 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: trueden 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.