Skip to main content

Party Register

List contract partners with their roles and open problems, create and edit parties, and read one party with its letters, contracts, documents and duplicates.

GET /v1/parties lists the parties the key's minting user may see: a party holding a role on a visible row, or one that user created and that has no role yet. By default the register lists contract partners, meaning parties holding the partner or our_party role, or no role yet. Every other entity (a Verwalter, a tenant, an owner, a contact) appears with scope=all. The list is sorted by display name.

Each entry is a party with three additions: contracts (the contract rows the party holds a non-rejected role on), roles (the role names it holds) and issues (the problems that name the party, plus one when the party has a duplicate candidate). total counts the parties matching the filters before limit, and needs_attention counts the parties in scope, before the other filters, that need a person. attention=true (or 1) keeps only those; any other value applies no filter.

GET/v1/parties

Query parameters

product_idstring (uuid)Only the parties of this data product.
qstringCase-insensitive substring over name, street, postcode, town and e-mail; also matches the normalized name key.
kindstringperson, company, owners_association or unknown.
attentionstringtrue or 1 keeps only parties that need a person (a problem names them, or they have a duplicate candidate).
limitinteger1 to 5000. Default: 200
scopestringpartners or all. Default: partners

cURL: Companies that need attention

curl "https://api.talonic.com/v1/parties?kind=company&attention=true&limit=50" \
  -H "Authorization: Bearer $TALONIC_API_KEY"

Response: Register entry

{
  "total": 1,
  "needs_attention": 37,
  "data": [
    {
      "id": "e5a3c7b1-2d94-4f08-b6a2-81c0d9e47f35",
      "kind": "company",
      "display_name": "Stadtwerke Musterstadt GmbH",
      "name_key": "stadtwerke musterstadt gmbh",
      "legal_form": "GmbH",
      "street": "Hauptstrasse 12",
      "postcode": "12345",
      "town": "Musterstadt",
      "status": "active",
      "source": "capture",
      "contracts": 14,
      "roles": ["partner"],
      "issues": 1
    }
  ]
}

Creating and Editing Parties

POST /v1/parties creates a party from the given details. display_name is required; when kind is omitted it is inferred from the name (a legal form makes a company, WEG an owners' association). A party created this way is visible only to its creator until it holds a role on a contract the reader may see. PATCH /v1/parties/{id} changes the given details; every field is optional on an edit.

Changing display_name recomputes name_key, the normalized name used to match documents, the register and duplicates. A party renamed by hand stops matching its old spelling, so the next sync can create a duplicate candidate for the old spelling. Rename deliberately, and merge the duplicate afterwards if one appears.

POST/v1/parties

Body fields

display_name*string1 to 300 characters. Required to create a party.
kindstringperson, company, owners_association or unknown. Inferred from the name when omitted.
salutationstring | nullherr, frau, eheleute, firma or weg.
title, first_name, last_namestring | nullUp to 60, 120 and 120 characters.
company_name, legal_formstring | nullUp to 300 and 60 characters.
street, postcode, town, countrystring | nullUp to 200, 12, 120 and 60 characters.
email, phonestring | nullA valid e-mail address; a phone number of up to 60 characters.
preferred_channelstring | nullpost or email.
external_refsobjectIds in other systems, as string values.
PATCH/v1/parties/{id}

One Party in Full

GET /v1/parties/{id} returns the party with letters (where its letters go and why), contracts (its rows, each with the party's own roles, the other parties' roles, the computed view and the row's problems), documents (with the quotes that support its roles), members and member_of (contacts), duplicates (merge candidates) and issues. product_id restricts the contracts to one data product.

letters.reason_code explains the address: self (the party is written to directly), manager (through its Verwalter), owner_while_tenant, or is_manager. letters.assumption is weg_via_manager when the platform assumed an owners' association is written to through its Verwalter. A party that was merged into another answers with merged_into and empty lists when the reader may see the survivor.

GET/v1/parties/{id}

Query parameters

product_idstring (uuid)Restrict the contracts to one data product.

Response: Where a party's letters go (excerpt)

{
  "party": { "id": "e5a3c7b1-2d94-4f08-b6a2-81c0d9e47f35", "display_name": "Eigentuemergemeinschaft Gartenweg 4", "kind": "owners_association" },
  "letters": {
    "party_id": "e5a3c7b1-2d94-4f08-b6a2-81c0d9e47f35",
    "display_name": "Eigentuemergemeinschaft Gartenweg 4",
    "address_lines": ["Hausverwaltung Nord GmbH", "Marktplatz 1", "12345 Musterstadt"],
    "reason_code": "manager",
    "reason": "Letters go to the Verwalter of the owners' association.",
    "via": "Hausverwaltung Nord GmbH",
    "assumption": "weg_via_manager"
  },
  "duplicates": [],
  "issues": []
}
Problems on a party and on a row use a fixed code vocabulary: no_partner, several_partners, reference_disagrees, kind_unknown, address_missing, manager_without_party, tenant_without_period, owner_change_open, weg_without_manager, cost_unit_disagrees, cost_unit_missing and read_failed. Each issue carries an English detail, params with the facts behind it, and the role_ids and party_ids it concerns.

Frequently asked questions

Why does the register not list a Verwalter or a tenant?+
By default the register lists contract partners: parties holding the partner or our_party role, or no role yet. Every other entity appears with scope=all.
Who can see a party I created?+
Only its creator, until the party holds a role on a contract the reader may see. A party is visible when it holds a role on a visible row, or when the reader created it and it has no role yet.
What happens to matching when I rename a party?+
Changing display_name recomputes the normalized name key. A party renamed by hand stops matching its old spelling, and the next sync can create a duplicate candidate that you can merge.
What does needs_attention count?+
The parties in scope, before the other filters, that need a person: a problem names them, or they have a duplicate candidate. attention=true restricts the list to the same parties.