Record Field Reference

Every field of the PSM-Anwendungsdatensatz: what it means, what constrains it, what a valid value looks like, and the behaviour you cannot see in the schema.

urn:psm:anwendung-datensatz:1.0.0 JSON Schema draft 2020-12 69 documented fields

Press / to focus search · Esc to clear

Looking for the data standard or example exports? Go to downloads

Fields by section

Grouped as the schema groups them. The seven location variants are listed separately, since only one of them applies to any given entry.

Identity, creation timestamp and format version. The app assigns all three itself; on import they are filled in when absent.

  • datensatz_idstring (uuid) required
    datensatz_id

    Globally unique record ID. The app generates UUIDv7 — timestamp-ordered, so sorting by ID matches creation order.

    Constraints format: uuid
    Example
    "019e7271-637f-7412-87be-4073c257db12"

    Note: An import with a blank ID column gets a fresh UUID per row. Importing the same file twice therefore yields different IDs; duplicate detection falls back to the content fingerprint rather than the ID.

  • datensatz_erstellung_zeitpunktstring (date-time) required
    datensatz_erstellung_zeitpunkt

    When the record was created, not when the application happened. The application time lives in anwendung_zeitpunkt.

    Constraints format: date-time
    Example
    "2026-05-27T14:32:00Z"

    Note: Saving several records in one pass (tank mix, batch entry) stamps them with synthetic timestamps 10 ms apart from one shared base value. That shared base plus a shared application date is exactly how the app recognises a tank mix afterwards.

  • datensatz_format_versionstring (const) required
    datensatz_format_version

    Version of the record format. Frozen as a const in the schema: every valid record carries exactly "1.0.0".

    Constraints const: "1.0.0"
    Example
    "1.0.0"

    Note: Do not confuse this with the app’s IndexedDB version. Three independent numbers exist: this frozen format version, an informal schema counter in comments and the changelog, and the IndexedDB DB_VERSION.

Array with at least one entry. Each entry is a natural person who actually applied the product.

  • anwenderarray<object> required
    anwender

    The people who applied the plant protection product. Several entries describe one jointly executed application, not several separate ones.

    Constraints minItems: 1

    Note: For drones, field robots or remotely piloted equipment the operator is the person operating, programming, configuring or supervising the machine. The machine itself does not belong in this field; model or serial number belong in notizen.

  • nachnamestring required
    anwender[].nachname

    Operator’s surname.

    Example
    "Mustermann"
  • vornamestring required
    anwender[].vorname

    Operator’s given name.

    Example
    "Max"
  • zusatzstring optional
    anwender[].zusatz

    Additional detail about the person, typically their role on the holding: farm manager, employee, contractor.

    Constraints maxLength: 50
    Example
    "Betriebsleiter"

    Note: zusatz is part of a saved operator template’s identity. Two entries with the same name but a different zusatz are two templates, not one duplicate.

Exactly one product per record. Several products in one spray pass produce several records; see the tank-mix note under system fields.

  • handelsnamestring required
    pflanzenschutzmittel.handelsname

    Product name as held in the BVL authorization database. The only required product field; a product without an authorization number is still valid.

    Example
    "Abran"
  • zulassungsnummerstring optional
    pflanzenschutzmittel.zulassungsnummer

    Authorization number as held in the BVL authorization database.

    Example
    "00A657-63"

    Note: Two cases where this field does not hold the obvious value. For a parallel import it carries the import’s own permit number (e.g. 005314-00/013), not the reference product’s number. For an Art. 53 emergency authorization it stays empty, because such a product has no authorization number at all.

A numeric value plus a unit code. The unit is a closed list, not free text.

  • einheit_wertnumber required
    aufwandmenge.einheit_wert

    Numeric value of the application rate. The app additionally enforces a value greater than zero; the schema itself does not.

    Example
    0.8
  • einheit_kodestring (enum) required
    aufwandmenge.einheit_kode

    Unit of the application rate as used in the BVL PPP database, for example l/ha, kg/ha, ml/100 m² or g per plant.

    Constraints enum: 284 values

    Allowed values: Closed list of 284 values, a deliberately trimmed subset of BVL Kodeliste 25. The full list is in the downloadable schema under properties.aufwandmenge.properties.einheit_kode.enum; the app’s Excel workbook carries it on a dedicated reference sheet.

    Example
    "l/ha"

    Note: Not every code in BVL Kodeliste 25 is accepted: 74 codes are deliberately excluded. An imported value outside the list is invalid and the record is rejected.

Date required, time optional, unless the chosen product carries a bee-hazard classification.

  • datumstring (date) required
    anwendung_zeitpunkt.datum

    Date of the application, in YYYY-MM-DD form.

    Constraints format: date
    Example
    "2026-05-27"

    Note: CSV and Excel-workbook imports recognise the German DD.MM.YYYY form and convert it. What is stored is always the ISO form.

  • uhrzeitstring (time) optional
    anwendung_zeitpunkt.uhrzeit

    Time of the application, including seconds and a timezone offset.

    Constraints format: timeoffset required (e.g. Z)
    Example
    "06:15:00Z"

    Note: Two traps. First the offset: format time means the RFC 3339 full-time production, so an offset is mandatory. "06:15:00" fails a strict validator, "06:15:00Z" passes — and the schema’s own examples entry happens to show the offset-less form. Records the app produces do carry the offset. Second the requiredness: the schema marks the field optional, the app makes it conditionally required — if the chosen product carries a bee-hazard classification, the form demands a time. That rule lives only in application code; an externally produced record without a time still validates.

Name and EPPO code are both required; the BBCH stage is optional and never written by the app itself.

  • namestring required
    kulturart.name

    Crop name as held in the BVL authorization database. The app syncs the crop list per language, so the stored name is the label in whichever language the record was entered in.

    Example
    "Winterweichweizen"
  • eppo_codestring required
    kulturart.eppo_code

    EPPO code of the crop. The language-independent key; when matching across languages this is the field to compare on, not name.

    Example
    "TRZAW"

    Note: In the form the EPPO code is the gate to the product section: until a valid code is set, the entire plant protection product section stays locked.

  • bbchobject optional
    kulturart.bbch

    BBCH growth stage of the crop per the authorization and the BBCH monograph, modelled as a von–bis range.

    Note: The app never writes BBCH on its own. It derives the authorized windows from the indications and offers them for selection; the value always comes from a deliberate entry.

  • vonstring optional
    kulturart.bbch.von

    Starting or current BBCH stage, as a number or in the official long form.

    Example
    "55"

    Note: Form entry is capped at three characters; imported long forms are accepted up to 300 characters. Both forms validate.

  • bisstring optional
    kulturart.bbch.bis

    Ending BBCH stage when a range is being recorded. For a single stage, bis equals von.

    Example
    "59"

    Note: A reversed range (von greater than bis) surfaces as a warning only and never blocks saving. The check is numeric-only and does not fire on long-form entries.

A single field whose meaning depends on the area of use.

  • jahrstring required
    jahr

    For agricultural crops the harvest year; for non-agricultural use (forestry, non-cultivated land) the year of application. A string, not a number.

    Constraints 4 digits, 1990–2100 (enforced by the app)
    Example
    "2026"

    Note: When the year is missing on import the app derives it from the application date. That is a fallback only: an existing value is never overwritten, even when it disagrees with the date. Where they disagree, the form shows a non-blocking warning.

A pair of area and kind, where the area determines which kinds are permitted at all.

  • bereichstring (enum) required
    art_der_verwendung.bereich

    Area of use: open field, enclosed space, or seed treatment.

    Allowed values freilandraumbeizung
    Example
    "freiland"
  • artstring (conditional enum) optional
    art_der_verwendung.art

    Specific kind of use. Which values are permitted depends on bereich.

    Allowed values: Permitted values depend on bereich: under freiland kulturland, nicht_kulturland or flaechen_allgemeinheit; under raum lager, gewaechshaus or innenraum; under beizung beizung_saatgut or beizung_pflanzgut.

    Example
    "kulturland"

    Note: This mapping lives in the schema itself, as an if/then chain under allOf — so a mispaired value is rejected by a generic validator, not only by the app. The field is also optional: with art absent, none of the conditions bite and the record stays valid.

What was actually treated, as a type plus a size. Not to be confused with the size of the site, which is a separate field under behandlungsort.

  • typstring (enum) required
    behandeltes_objekt.typ

    Kind of treated object: treated area, treated quantity, or treated volume.

    Allowed values behandelte_flaechebehandelte_mengebehandeltes_volumen
    Example
    "behandelte_flaeche"

    Note: Via if/then in the schema, the type determines which unit codes are permitted in groesse_einheit: behandelte_flaeche allows m² or ha, behandelte_menge g, kg, dt or t, behandeltes_volumen m³ or l.

  • einheit_wertnumber required
    behandeltes_objekt.groesse_einheit.einheit_wert

    Numeric value of the object size.

    Example
    4.25

    Note: This is the extent actually treated — area or volume — not a plant’s height or growth stage. Ornamental horticulture confuses the two regularly, because authorization conditions there are often phrased in terms of plant size. Such conditions belong in kulturart.bbch or notizen.

  • einheit_kodestring (conditional enum) required
    behandeltes_objekt.groesse_einheit.einheit_kode

    Unit of the object size. Unlike aufwandmenge.einheit_kode this value does not come from the BVL code list but from a very short, type-dependent list.

    Allowed values: Depends on typ: under behandelte_flaeche m² or ha, under behandelte_menge g, kg, dt or t, under behandeltes_volumen m³ or l.

    Example
    "ha"
  • beschreibungstring optional
    behandeltes_objekt.beschreibung

    Free-text description of the treated object.

    Constraints maxLength: 50
    Example
    "Schlag Nordfeld"

    Note: Removed by the anonymized export, because it can identify a holding.

Array with at least one entry. Several entries describe the same site through different reference kinds, not several sites.

  • behandlungsortarray<object> required
    behandlungsort

    Treatment sites of the application. Several entries let the same site be described through different location references — for instance as a polygon and additionally as an InVeKoS reference.

    Constraints minItems: 1

    Note: The app caps the number of references at seven, one per identification kind. Picking a field in the geometry picker writes two entries: the polygon itself and an automatically added second reference.

  • standort_kennung_artstring (enum) required
    behandlungsort[].standort_kennung_art

    Kind of location reference. The discriminator that fixes the shape of standort_kennung_wert.

    Allowed values standort_koordinatenflurstueckskennzeicheninvekos_idflaechengeometriegleiseforstwege
    Example
    "standort_koordinaten"

    Note: Expressed in the schema as a chain of if/then conditions under allOf, not as a named union. If you write your own validation you must reproduce that branching: the value alone cannot be checked without the kind.

  • standort_kennung_wertoneOf<7 variants> required
    behandlungsort[].standort_kennung_wert

    Value of the location reference. Its shape follows standort_kennung_art; the seven variants are documented individually below.

  • standort_anbauartstring (enum) optional
    behandlungsort[].standort_anbauart

    Management regime of the object where the application took place: conventional or organic.

    Allowed values konventionelloekologisch
    Example
    "konventionell"
  • standort_groesse_artstring (enum) optional
    behandlungsort[].standort_groesse_art

    Kind of site extent: area or volume.

    Allowed values flaechevolumen
    Example
    "flaeche"

    Note: This field narrows the permitted unit codes via if/then in the schema: with flaeche only m² or ha, with volumen only m³ or l. Without this field the narrowing does not apply.

  • einheit_wertnumber required
    behandlungsort[].standort_groesse_einheit.einheit_wert

    Numeric value of the site extent — the size of the whole site, not of the treated portion.

    Example
    4.25

    Note: If the treated object size exceeds the site extent the form warns (converting units first) but does not block saving.

  • einheit_kodestring required
    behandlungsort[].standort_groesse_einheit.einheit_kode

    Unit of the site extent. Narrowed to m²/ha or m³/l when standort_groesse_art is set.

    Example
    "ha"
  • bezeichnungstring optional
    behandlungsort[].bezeichnung

    Additional detail about the treatment site, for example the field name or the greenhouse compartment.

    Constraints maxLength: 50
    Example
    "Nordfeld"

    Note: Deliberately excluded from a location reference’s identity: two entries differing only in bezeichnung count as the same site. The anonymized export strips the field.

A single WGS84 point. Watch the bounds — they are deliberately not the usual ±90/±180.

  • breitengradnumber required
    standort_kennung_wert.breitengrad

    Latitude (WGS84) in decimal degrees.

    Constraints minimum: -100maximum: 100
    Example
    52.52

    Note: The ±100 bound is not sloppiness but a deliberate product decision, and it is duplicated in two places: the schema and a TypeScript constant. Changing one requires changing the other — JSON cannot import TypeScript.

  • laengengradnumber required
    standort_kennung_wert.laengengrad

    Longitude (WGS84) in decimal degrees.

    Constraints minimum: -50maximum: 50
    Example
    13.405

    Note: Bound ±50, again deliberately narrower than the WGS84 range. Coordinates outside Europe are rejected as a result.

The only variant whose value is a string rather than an object.

  • standort_kennung_wertstring required
    standort_kennung_wert

    Official ALKIS cadastral parcel identifier, exactly 20 characters of digits and underscores. Underscores pad unused positions.

    Constraints pattern: ^[0-9_]{20}$
    Example
    "071411006000570099__"

    Note: Leading zeros are significant. Spreadsheet imports must treat the column as text, otherwise numeric interpretation eats the zeros and the value fails the pattern.

Field-block and parcel reference. Only the FLIK is required.

  • flikstring required
    standort_kennung_wert.flik

    FLIK, the field-block identifier under InVeKoS.

    Example
    "DETHLIAL50333H11"
  • schlag_nummerstring optional
    standort_kennung_wert.schlag_nummer

    The holding’s parcel number within the field block. Identifies the specific sub-area cropped with one culture.

    Example
    "42"
  • teilschlag_nummerstring optional
    standort_kennung_wert.teilschlag_nummer

    Sub-parcel number, when the parcel is subdivided further.

    Example
    "1"

GeoJSON-like geometry. The type determines how deeply the coordinates are nested.

  • typstring (enum) required
    standort_kennung_wert.typ

    Geometry type, named as in GeoJSON.

    Allowed values PointMultiPointLineStringMultiLineStringPolygonMultiPolygonGeometryCollection
    Example
    "Polygon"
  • koordinatenarray required
    standort_kennung_wert.koordinaten

    Coordinates as nested arrays. The nesting depth depends on the geometry type: a Polygon carries rings, a MultiPolygon rings of rings.

    Example
    [[[10.52,49.81],[10.53,49.81],[10.53,49.82],[10.52,49.81]]]

    Note: The schema does not check the depth — it only demands an array. The type-against-nesting-depth check lives in the app’s validation code. On export the full coordinates survive into JSON, XML, CSV and backups; only the PDF summary replaces them with type, vertex count and centroid.

A section of a railway line. All six fields are required.

  • streckennummerstring required
    standort_kennung_wert.streckennummer

    VzG line number of the railway line.

    Example
    "2981"
  • richtungskennzahlnumber (enum) required
    standort_kennung_wert.richtungskennzahl

    Direction code of the line, 0 or 1. A number, not a string.

    Allowed values 01
    Example
    0
  • km_vonnumber required
    standort_kennung_wert.km_von

    Line kilometre where the section starts, in steps of 0.1.

    Constraints minimum: 0multipleOf: 0.1
    Example
    12

    Note: multipleOf: 0.1 does not behave the way you expect under floating-point arithmetic. Common validators check whether value / 0.1 is an integer — and 0.3 / 0.1 in IEEE 754 yields 2.9999999999999996, not 3. The value 0.3, which the schema itself carries as an example, therefore fails. Affected values include 0.3, 1.2 and 3.7; whole numbers plus 0.1, 0.2, 0.4, 0.5, 0.8 and 1.5 are fine. If you must record fractional kilometres, configure your validator with a tolerance.

  • km_bisnumber required
    standort_kennung_wert.km_bis

    Line kilometre where the section ends, in steps of 0.1.

    Constraints minimum: 0multipleOf: 0.1
    Example
    14
  • m_vonnumber required
    standort_kennung_wert.m_von

    Metre offset within the starting kilometre, 0 to 99.

    Constraints minimum: 0maximum: 99
    Example
    15
  • m_bisnumber required
    standort_kennung_wert.m_bis

    Metre offset within the ending kilometre, 0 to 99.

    Constraints minimum: 0maximum: 99
    Example
    21

A forestry site address. Four required fields, three more for finer detail.

  • bundeslandstring required
    standort_kennung_wert.bundesland

    Federal state of the forestry site, as the state abbreviation.

    Example
    "SN"
  • forstamt_betriebstring required
    standort_kennung_wert.forstamt_betrieb

    Responsible forestry office or enterprise, as a name or a number.

    Example
    "FOB Baerenfels bzw. 1509"
  • revierstring required
    standort_kennung_wert.revier

    Forest district.

    Example
    "Tharandt"
  • abteilungstring required
    standort_kennung_wert.abteilung

    Forest compartment.

    Example
    "503"
  • unterabteilungstring optional
    standort_kennung_wert.unterabteilung

    Forest sub-compartment.

    Example
    "a"
  • teilflaechestring optional
    standort_kennung_wert.teilflaeche

    Sub-area within the sub-compartment.

    Example
    "4"
  • behandlungseinheitstring optional
    standort_kennung_wert.behandlungseinheit

    Designation of the treatment unit.

    Example
    "BE 12"

The deepest variant: a union inside a union. The road name branches once more into coordinates or a route section.

  • referenz_typstring (enum) required
    standort_kennung_wert.referenz_typ

    Kind of road reference: by road/path designation or by a house-number range. The discriminator for referenz_wert.

    Allowed values strassen_wegebezeichnunghausnummernbereich
    Example
    "strassen_wegebezeichnung"
  • bezeichnung_nummerstring required
    referenz_wert.bezeichnung_nummer

    Designation or number of the road or path. Only for referenz_typ = strassen_wegebezeichnung.

    Example
    "B22"
  • raeumliche_eingrenzungstring (enum) optional
    referenz_wert.raeumliche_eingrenzung

    How the road is delimited in space. The second discriminator of this variant; it fixes the shape of eingrenzung_wert.

    Allowed values koordinatenstreckenabschnitt
    Example
    "streckenabschnitt"
  • von.breitengradnumber required
    eingrenzung_wert.von.breitengrad

    Latitude of the section’s start coordinate. Only for raeumliche_eingrenzung = koordinaten.

    Constraints minimum: -100maximum: 100
    Example
    49.812
  • von.laengengradnumber required
    eingrenzung_wert.von.laengengrad

    Longitude of the section’s start coordinate.

    Constraints minimum: -50maximum: 50
    Example
    10.523
  • bis.breitengradnumber required
    eingrenzung_wert.bis.breitengrad

    Latitude of the section’s end coordinate.

    Constraints minimum: -100maximum: 100
    Example
    49.815
  • bis.laengengradnumber required
    eingrenzung_wert.bis.laengengrad

    Longitude of the section’s end coordinate.

    Constraints minimum: -50maximum: 50
    Example
    10.531
  • von (Streckenabschnitt)number required
    eingrenzung_wert.von

    Start value of the route section. Only for raeumliche_eingrenzung = streckenabschnitt; here von is a number, whereas in the coordinate variant it is an object.

    Example
    0
  • bis (Streckenabschnitt)number required
    eingrenzung_wert.bis

    End value of the route section.

    Example
    250
  • einheitstring (enum) required
    eingrenzung_wert.einheit

    Unit of the route section, metres or kilometres.

    Allowed values mkm
    Example
    "m"
  • von.ort / bis.ortstring required
    referenz_wert.von.ort

    Town of the start or end address. Only for referenz_typ = hausnummernbereich; the von and bis addresses carry the same four fields.

    Example
    "Musterstadt"
  • von.postleitzahl / bis.postleitzahlstring required
    referenz_wert.von.postleitzahl

    Postal code of the start or end address.

    Example
    "12049"
  • von.strasse / bis.strassestring required
    referenz_wert.von.strasse

    Street name of the start or end address.

    Example
    "Hauptstrasse"
  • von.hausnummer / bis.hausnummerstring required
    referenz_wert.von.hausnummer

    House number of the start or end address. A string, so that suffixes such as 15a remain possible.

    Example
    "15"

A single free-text field — and also where the app parks machine-readable markers.

  • notizenstring optional
    notizen

    Free-text notes about the application, at most 500 characters.

    Constraints maxLength: 500
    Example
    "Indikation: Blattlaeuse. Es wurde lediglich die Haelfte des Feldes behandelt."

    Note: This field is not only free text. An Art. 53 emergency authorization has no field of its own in the schema; the app marks it instead with language-independent codes inside notizen (PPS_EA, PPS_NZ, ŚOR_ZN) and reads them back on edit and on import. The selected indication and application timing are appended here too. Overwriting notizen programmatically may therefore erase the only durable trace of an emergency authorization. The anonymized export strips the field entirely.

Need the wider technical picture? Back to the developer docs

Get started immediately

Use DiPAgE directly in your browser. No registration and free of charge.

Open the application and start documenting your plant protection product applications right away. No installation is required, but on supported devices DiPAgE can additionally be installed and used offline.

Directly in browser
No installation required. Open the application and get started immediately.
No registration
DiPAgE can be used without a user account or registration.
Stored locally
Your documentation data remains on the device you use.
Usable offline
On supported devices, DiPAgE can be installed and used without an internet connection.