API-Methoden
Partner-API-Dokumentation
Diese Referenz beschreibt, wie Ihre Integration im Namen Ihrer Organisation mit Animal-ID kommuniziert: Authentifizierung, erforderliche Header und die zentralen MVP-Endpunkte (Halter, Tiere, Behandlungen, Fotos, Wörterbücher).
SDKs & Client-Bibliotheken
Offizielle Open-Source-SDKs, die die Request-Signierung und die Endpunkte unten kapseln — einfach einbinden, statt Requests manuell zu signieren.
PHP · Composer
Serverseitiges PHP-SDK: HMAC-Request-Signierung und typisierte Clients für jeden Endpunkt.
composer require animal-id/aid-partner-sdk
JavaScript · npm
Framework-Pakete für Node und den Browser, auf einem gemeinsamen Kern aufgebaut.
npm i @animal-id/partner-core
- @animal-id/partner-coreFramework-unabhängiger Kern: Signierung + typisierter Client.
- @animal-id/partner-reactReact-Hooks & -Helfer.
- @animal-id/partner-vueVue-Composables.
- @animal-id/partner-angularAngular-Services.
- @animal-id/partner-nestjsNestJS-Modul für serverseitige Integrationen.
Authentifizierung & Signatur
Basis-URL: https://gw.animal-id.net · alle Pfade werden vorangestellt mit /v1/partner.
Jede signierte Anfrage trägt vier Header. Die Signatur ist ein HMAC-SHA256 (hex) einer kanonischen Zeichenkette, signiert mit Ihrem privaten Schlüssel:
stringToSign = METHOD + "\n" + path[?query] + "\n" + sha256_hex(rawBody) + "\n" + timestamp signature = hex( hmac_sha256(stringToSign, privateKey) )
| Header | Wert |
|---|---|
X-Eternity-App-Id | Ihre Anwendungs-ID. |
X-Eternity-Public-Key | Ihr öffentlicher Schlüssel. |
X-Eternity-Timestamp | Unix-Sekunden; muss innerhalb von ±300s der Serverzeit liegen. |
X-Eternity-Signature | Der oben berechnete HMAC-SHA256-Hex-Wert. |
X-Eternity-Idempotency-Key | UUID, erforderlich bei jedem POST/PATCH/DELETE. Wiederholungen geben die erste Antwort zurück; gleicher Schlüssel + anderer Body → 409. |
X-Eternity-Animal-ID-Version | Optionale Datumsversion (YYYY-MM-DD). Standard ist die bei der Ausstellung Ihrer App festgelegte Version; ab 2026-07-04 hängt die Tierregistrierung vorhandene Besitzer per public_id statt user_gid an. |
X-Eternity-Expand | Optional. JSON-Array von Expand-Schlüsseln, um zusätzliche Daten an unterstützten Endpunkten einzubetten (z. B. ["owners"]). Siehe den Abschnitt „Erweiterung“ eines Endpunkts für die zulässigen Schlüssel; unbekannte Schlüssel → 422. |
X-Eternity-Lang-Code | Optional. Sprachcode (uk, en, ru, de, es) für die von der API gelieferten Namen — z. B. species_name und breed_name auf der Tierkarte sowie die Bezeichnungen in den Wörterbüchern. Ohne Angabe gilt die Standardsprache der Region. |
Signieren und senden Sie exakt dieselben Body-Bytes. Bei GET/DELETE ist der Body leer (sein sha256 ist der Hash einer leeren Zeichenkette). path enthält die Query-Zeichenkette, sofern vorhanden. Bei multipart/form-data-Uploads (Fotos) ist der Roh-Body ebenfalls nicht Teil der Signatur — signieren Sie mit dem sha256 eines leeren Bodys.
Jede erfolgreiche Antwort verpackt die Ergebnisse in einem payload-Array. Endpunkte zum Erstellen/Abrufen einer einzelnen Ressource geben ein einelementiges Array zurück (z. B. { "payload": [ { … } ] }); die Beispiele pro Endpunkt unten zeigen der Kürze halber das einzelne Objekt.
APP_ID="aid_app_xxx"; PUBLIC_KEY="pk_xxx"; PRIVATE_KEY="sk_xxx"
METHOD="POST"
PATH_Q="/v1/partner/owners" # path (+ "?query" if any), exactly as sent
BODY='{"email":"jane@example.com","consent":{"account_creation":true}}'
TS=$(date +%s)
BODY_HASH=$(printf '%s' "$BODY" | openssl dgst -sha256 | awk '{print $2}')
STRING_TO_SIGN=$(printf '%s\n%s\n%s\n%s' "$METHOD" "$PATH_Q" "$BODY_HASH" "$TS")
SIG=$(printf '%s' "$STRING_TO_SIGN" | openssl dgst -sha256 -hmac "$PRIVATE_KEY" | awk '{print $2}')
curl -X "$METHOD" "https://gw.animal-id.net$PATH_Q" \
-H "X-Eternity-App-Id: $APP_ID" \
-H "X-Eternity-Public-Key: $PUBLIC_KEY" \
-H "X-Eternity-Timestamp: $TS" \
-H "X-Eternity-Signature: $SIG" \
-H "X-Eternity-Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d "$BODY"const crypto = require('crypto');
function sign({ method, pathQ, body = '', privateKey }) {
const ts = Math.floor(Date.now() / 1000).toString();
const bodyHash = crypto.createHash('sha256').update(body).digest('hex');
const stringToSign = [method, pathQ, bodyHash, ts].join('\n');
const signature = crypto.createHmac('sha256', privateKey).update(stringToSign).digest('hex');
return { ts, signature };
}
const body = JSON.stringify({ email: 'jane@example.com' });
const { ts, signature } = sign({ method: 'POST', pathQ: '/v1/partner/owners', body, privateKey: 'sk_xxx' });
await fetch('https://gw.animal-id.net/v1/partner/owners', {
method: 'POST',
headers: {
'X-Eternity-App-Id': 'aid_app_xxx',
'X-Eternity-Public-Key': 'pk_xxx',
'X-Eternity-Timestamp': ts,
'X-Eternity-Signature': signature,
'X-Eternity-Idempotency-Key': crypto.randomUUID(),
'Content-Type': 'application/json',
},
body, // sign and send the SAME bytes
});import hashlib, hmac, time, json, uuid, requests
def sign(method, path_q, body, private_key):
ts = str(int(time.time()))
body_hash = hashlib.sha256(body.encode()).hexdigest()
string_to_sign = "\n".join([method, path_q, body_hash, ts])
signature = hmac.new(private_key.encode(), string_to_sign.encode(), hashlib.sha256).hexdigest()
return ts, signature
body = json.dumps({"email": "jane@example.com"}, separators=(",", ":"))
ts, signature = sign("POST", "/v1/partner/owners", body, "sk_xxx")
requests.post(
"https://gw.animal-id.net/v1/partner/owners",
data=body, # send the SAME bytes you signed
headers={
"X-Eternity-App-Id": "aid_app_xxx",
"X-Eternity-Public-Key": "pk_xxx",
"X-Eternity-Timestamp": ts,
"X-Eternity-Signature": signature,
"X-Eternity-Idempotency-Key": str(uuid.uuid4()),
"Content-Type": "application/json",
},
)<?php
function signRequest(string $method, string $pathQ, string $body, string $privateKey): array {
$ts = (string) time();
$bodyHash = hash('sha256', $body);
$stringToSign = implode("\n", [$method, $pathQ, $bodyHash, $ts]);
$signature = hash_hmac('sha256', $stringToSign, $privateKey);
return [$ts, $signature];
}
$body = json_encode(['email' => 'jane@example.com']);
[$ts, $signature] = signRequest('POST', '/v1/partner/owners', $body, 'sk_xxx');
$ch = curl_init('https://gw.animal-id.net/v1/partner/owners');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body, // send the SAME bytes you signed
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Eternity-App-Id: aid_app_xxx",
"X-Eternity-Public-Key: pk_xxx",
"X-Eternity-Timestamp: $ts",
"X-Eternity-Signature: $signature",
'X-Eternity-Idempotency-Key: ' . bin2hex(random_bytes(16)),
'Content-Type: application/json',
],
]);
$response = curl_exec($ch);Webhooks
Empfangen Sie aufgeschobene Ereignisse — etwa wenn ein Besitzer die Zugriffsanfrage eines Tierarztes genehmigt — als signierte POST-Anfragen an Ihren Server. Legen Sie die URL fest und finden Sie Ihr Signatur-Geheimnis im Tab „API-Schlüssel“.
Signierte Webhook-ZustellungWebhook-Signatur & Nutzdaten▸Wir senden jedes Ereignis per POST an Ihre konfigurierte Webhook-URL, signiert mit Ihrem app-spezifischen Webhook-Geheimnis (wird bei der Erzeugung einmalig angezeigt). Überprüfen Sie die Signatur, bevor Sie einer Zustellung vertrauen, indem Sie den HMAC über die kanonische Zeichenkette neu berechnen und in konstanter Zeit vergleichen:
canonical = "POST" + "\n" + path[?query] + "\n" + sha256_hex(rawBody) + "\n" + timestamp signature = hex( hmac_sha256(canonical, webhookSecret) )
| Header | Wert |
|---|---|
X-Eternity-Webhook-Id | Eindeutige Zustellungs-ID (UUID); bleibt bei erneutem Senden desselben Ereignisses gleich. |
X-Eternity-Webhook-Event | Der Ereignisschlüssel, z. B. animal_access.approved. |
X-Eternity-Webhook-Timestamp | Unix-Sekunden, zu denen die Zustellung signiert wurde; weisen Sie Zustellungen mit abweichendem Zeitstempel zurück. |
X-Eternity-Webhook-Signature | HMAC-SHA256 (hex) der kanonischen Zeichenkette, mit Ihrem Webhook-Geheimnis als Schlüssel (nicht Ihrem API-Privatschlüssel). |
Zustellungsinhalt (JSON)
{
"id": "5f1c0b8e-3a2d-4c7b-9b1a-2e6f0d4c8a91",
"event": "animal_access.approved",
"occurred_at": "2026-06-24T09:15:00+00:00",
"result": {
"animal_id": "8xK3pQzVnB7rL2qF",
"requester_user_gid": 90231,
"status": "granted",
"requested_at": "2026-06-23T09:00:00+00:00",
"expires_at": "2026-06-30T09:00:00+00:00",
"retry_after_seconds": 0,
"decided_at": "2026-06-24T09:15:00+00:00"
}
}| Feld | Beschreibung |
|---|---|
id | Die eindeutige Ereignis-ID (entspricht dem Header X-Eternity-Webhook-Id). |
event | Der Ereignisschlüssel, z. B. animal_access.approved. |
occurred_at | Wann das Ereignis eintrat (ISO 8601). |
result | Die Zugriffsentscheidung. Entspricht GET /v1/partner/animals/{id}/access-request und ergänzt animal_id, requester_user_gid und decided_at. |
Ereignisse
| Schlüssel | Bedeutung |
|---|---|
animal_access.approved | Ein Besitzer hat Ihre ausstehende Zugriffsanfrage genehmigt — Sie können das Tier nun bearbeiten. |
animal_access.denied | Ein Besitzer hat Ihre Zugriffsanfrage abgelehnt — Sie können nach Ablauf erneut anfragen. |
Bestätigen Sie mit einer beliebigen 2xx-Antwort. Ein Status ungleich 2xx oder ein Timeout wird als fehlgeschlagene Zustellung erfasst, die Sie aus dem Webhook-Zustellprotokoll in Ihrem Konto erneut senden können.
const crypto = require('crypto');
// Express: mount with a raw-body parser so you verify the EXACT bytes received.
// app.post('/animal-id/webhook', express.raw({ type: 'application/json' }), handler)
function verify(req, webhookSecret) {
const ts = req.header('X-Eternity-Webhook-Timestamp');
const sig = req.header('X-Eternity-Webhook-Signature');
const path = req.originalUrl; // path (+ ?query) exactly as received
const raw = req.body; // Buffer of the raw request body
const bodyHash = crypto.createHash('sha256').update(raw).digest('hex');
const canonical = ['POST', path, bodyHash, ts].join('\n');
const expected = crypto.createHmac('sha256', webhookSecret).update(canonical).digest('hex');
return sig && crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}<?php
// Verify a webhook delivery from Animal ID before trusting it.
function verifyWebhook(string $rawBody, string $path, string $webhookSecret): bool {
$ts = $_SERVER['HTTP_X_ETERNITY_WEBHOOK_TIMESTAMP'] ?? '';
$sig = $_SERVER['HTTP_X_ETERNITY_WEBHOOK_SIGNATURE'] ?? '';
$canonical = implode("\n", ['POST', $path, hash('sha256', $rawBody), $ts]);
$expected = hash_hmac('sha256', $canonical, $webhookSecret);
return $sig !== '' && hash_equals($expected, $sig);
}
$rawBody = file_get_contents('php://input'); // verify the EXACT bytes received
if (!verifyWebhook($rawBody, $_SERVER['REQUEST_URI'], getenv('AID_WEBHOOK_SECRET'))) {
http_response_code(401);
exit;
}
$event = json_decode($rawBody, true); // ['id' => …, 'event' => …, 'result' => …]
http_response_code(204); // acknowledge with any 2xxAPI-Methoden
Tippen Sie — Abschnitte werden nach Stichwort gefiltert.
/v1/partner/dictionariesWörterbücher (mehrsprachig, filterbar).▸Authentifizierung: Öffentlich (keine Signatur erforderlich). Über ETag im CDN cachebar.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
include | nein | string (csv) | — | Comma-separated dictionary keys to return; empty → all. Keys: species, pet_species_featured, sex, sizes, lost_statuses, other_identifiers, procedure_types, countries, languages, cites. `pet_species_featured` is the canonical popular-species list keyed by a UUID public_id — pass its code into POST /animals as species_public_id. |
q | nein | string | — | Einträge nach lokalisiertem Namen in einer beliebigen aktiven Sprache filtern. |
lang | nein | string | languages | Namen auf eine einzelne Sprache projizieren (uk, en, ru, de, es). Standard: alle aktiven. |
Beispielantwort
{
"payload": [
{
"key": "species",
"items": [
{ "code": 3, "names": { "uk": "Собаки", "en": "Dogs", "ru": "Собаки", "de": "Dogs" } },
{ "code": 4, "names": { "uk": "Коти", "en": "Cats" } }
]
},
{
"key": "pet_species_featured",
"items": [
{ "code": "1b289672-0a74-48d2-9600-7104bedacd8c", "names": { "uk": "Собака", "en": "Dog" } },
{ "code": "b0dd3c3a-4d35-4479-91f9-616ae072c400", "names": { "uk": "Домашні коти", "en": "Domestic cats" } }
]
},
{
"key": "countries",
"items": [
{ "code": "804", "alpha2": "UA", "alpha3": "UKR",
"names": { "uk": "Україна", "en": "Ukraine", "ru": "Украина", "de": "Ukraine", "es": "Ukraine" } }
]
},
{
"key": "languages",
"items": [
{ "code": "uk", "native": "Українська",
"names": { "uk": "Українська", "en": "Ukrainian", "ru": "Украинский", "de": "Ukrainian", "es": "Ukrainian" } }
]
}
],
"metadata": { "etag": "W/\"dict-…\"", "generated_at": "2026-05-30T08:00:00+00:00", "languages": ["uk","en","ru","de","es"] },
"links": [],
"message": null
}| Feld | Beschreibung |
|---|---|
payload[].key | Wörterbuchschlüssel. |
payload[].items[].code | Stable id used as the value in write endpoints. Numeric for most dictionaries (species, sex, …); for pet_species_featured it is the canonical species public_id (a UUID) → pass it as species_public_id on POST /animals; for countries it is the zero-padded ISO 3166-1 numeric code as a string (e.g. "004", "804"); for languages it is the ISO 639-1 code (e.g. "uk"). |
payload[].items[].names | Zuordnung Sprache → lokalisierter Name. Sprachen ohne Übersetzung fallen auf Englisch zurück. |
payload[].items[].alpha2 / alpha3 | Nur Länder: ISO 3166-1 alpha-2 / alpha-3 Codes für bequeme Zuordnung. |
payload[].items[].native | Nur Sprachen: der Eigenname der Sprache (Endonym), praktisch für Sprachauswahlen. |
metadata.etag | Geben Sie ihn in If-None-Match zurück, um bei unveränderten Daten 304 zu erhalten. |
metadata.languages | Aktive Sprachen, die in diesem Build tatsächlich vorhanden sind. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK — Wörterbücher zurückgegeben. |
304 | Not Modified — Ihr If-None-Match stimmt überein; verwenden Sie die zwischengespeicherte Kopie erneut. |
/v1/partner/dictionaries/speciesArtensuche (kanonisch, per public_id).▸Authentifizierung: Public (no signature required).
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
q | nein | string | — | Species search term (any taxonomic rank, substring + typo-tolerant). Omit to browse the top matches. Complements the popular-only pet_species_featured dictionary. |
Beispielantwort
{
"payload": [
{ "public_id": "1b289672-0a74-48d2-9600-7104bedacd8c", "name": "Dog", "rank": "species", "has_breeds": true },
{ "public_id": "9cd7d2a1-4e45-4922-8f9e-fb84c61ca6ae", "name": "Cats", "rank": "genus", "has_breeds": false }
]
}| Feld | Beschreibung |
|---|---|
payload[].public_id | Species public_id — pass it as species_public_id on POST /animals, or into /dictionaries/species/{species_public_id}/breeds. |
payload[].name | Localized species name (request locale, English fallback). |
payload[].rank | Taxonomic rank (species, genus, family, …). |
payload[].has_breeds | Whether the species carries a breed list. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK — matching species. |
/v1/partner/dictionaries/species/{species_public_id}/breedsRassen für eine Art (kanonisch, per public_id).▸Authentifizierung: Public (no signature required).
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
species_public_id | ja | string | — | Path segment: the species public_id (a UUID). Discover it via pet_species_featured or /dictionaries/species. |
q | nein | string | — | Optional breed-name filter (substring, typo-tolerant). |
Beispielantwort
{
"payload": [
{ "public_id": "6bb37956-d7fb-426d-8045-9d2fb854ee43", "name": "Belgian Shepherd Dog", "kind": "purebred" },
{ "public_id": "d1f2a0c8-7b3e-4a1d-9c22-0f5e6b7a8c90", "name": "Mixed breed", "kind": "mixed" }
]
}| Feld | Beschreibung |
|---|---|
payload[].public_id | Canonical breed public_id — pass it as breed_public_id on POST /animals. |
payload[].name | Localized breed name (request locale, English fallback). |
payload[].kind | purebred | mixed | unknown | crossbreed | variety. mixed/unknown/crossbreed are the special sentinel options. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK — breeds for the species (an empty list for a species with no breeds). |
404 | species_public_id is not a valid UUID (the route did not match). |
/v1/partner/ownersHalter anlegen (oder finden); gibt die globale Benutzer-ID zurück.▸Authentifizierung: HMAC. Beliebiger Partnerschlüssel. · X-Eternity-Idempotency-Key erforderlich
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
email | bedingt | string | — | E-Mail-Adresse des Eigentümers. E-Mail oder Telefon ist erforderlich — darüber wird der Eigentümer später erreicht/authentifiziert. |
phone | bedingt | string | — | Telefonnummer des Eigentümers (E.164). E-Mail oder Telefon ist erforderlich. |
first_name | nein | string | — | Vorname. |
last_name | nein | string | — | Nachname. |
language | nein | string | languages | Bevorzugte Sprache. |
country | nein | string | countries | Mit Nullen aufgefüllter numerischer ISO 3166-1-Code als Zeichenkette (z. B. "804") — entspricht dem Code im countries-Wörterbuch. |
consent | ja | object | — | Einwilligungsblock (unveränderlicher Audit). |
consent.account_creation | ja | bool | — | Muss true sein — der Eigentümer hat der account_creation zugestimmt. Der Zeitpunkt der Erfassung wird serverseitig aufgezeichnet. |
Anfrage-Body (JSON)
{
"email": "jane@example.com",
"phone": "+380681234567",
"first_name": "Jane",
"last_name": "Doe",
"language": "uk",
"country": "804",
"consent": {
"account_creation": true
}
}Beispielantwort
{
"payload": {
"user_gid": 90231,
"public_id": "V1StGXR8Z5jd",
"has_account": true,
"email": "jane@example.com",
"phone": null,
"display_hint": "Ол*** К.",
"language": "uk",
"country_id": 804
}
}| Feld | Beschreibung |
|---|---|
public_id | Stabile öffentliche Besitzer-ID — übergeben Sie sie an POST /animals owners[].public_id (API-Version >= 2026-07-04). |
user_gid | Veraltete numerische Besitzer-ID (Besitzer-Anhängen in älteren API-Versionen). |
has_account | Ob der Eigentümer bereits ein nutzbares Konto hat. |
email | Hinterlegte E-Mail-Adresse für diesen Eigentümer (null, falls unbekannt). |
phone | Hinterlegte Telefonnummer für diesen Eigentümer (null, falls unbekannt). |
display_hint | Maskierter Anzeigename (keine personenbezogenen Daten). |
Antwortstatus
| Status | Bedeutung |
|---|---|
201 | Erstellt (oder einen vorhandenen Eigentümer aufgelöst — idempotent nach E-Mail/Telefon). |
409 | X-Eternity-Idempotency-Key mit einem anderen Body wiederverwendet oder wird noch verarbeitet. |
422 | Validierungsfehler (fehlende E-Mail/Telefon oder consent.account_creation nicht akzeptiert). |
/v1/partner/owners/searchHalter anhand exakter E-Mail oder Telefonnummer finden.▸Authentifizierung: HMAC. Beliebiger Partnerschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
email_or_phone | ja | string | — | Exakte E-Mail oder Telefon (einzelnes Feld; E-Mail wird am Format erkannt). |
Beispielantwort
{
"payload": { "user_gid": 90231, "public_id": "V1StGXR8Z5jd", "has_account": true, "email": "jane@example.com", "phone": null, "display_hint": "Ол*** К.", "language": "uk", "country_id": 804 }
}| Feld | Beschreibung |
|---|---|
public_id | Stabile öffentliche Besitzer-ID — übergeben Sie sie an POST /animals owners[].public_id (API-Version >= 2026-07-04). |
user_gid | Veraltete numerische Besitzer-ID (Besitzer-Anhängen in älteren API-Versionen). |
email | Hinterlegte E-Mail-Adresse für diesen Eigentümer (null, falls unbekannt). |
phone | Hinterlegte Telefonnummer für diesen Eigentümer (null, falls unbekannt). |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | Eigentümer gefunden. |
404 | Kein Eigentümer mit dieser email_or_phone. |
422 | email_or_phone ist erforderlich. |
/v1/partner/animalsTier registrieren (chip-basiert).▸Authentifizierung: HMAC. Tierarzt-/Organisationsschlüssel. · X-Eternity-Idempotency-Key erforderlich
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
species | bedingt | int | species | Legacy species dictionary id. Exactly one of species / species_public_id is required. |
species_public_id | bedingt | string | pet_species_featured | Canonical species public_id (a UUID) from the pet_species_featured dictionary. Exactly one of species / species_public_id is required; when present it wins over species. |
is_microchip | ja | bool | — | Ob das Tier gechippt ist. true → microchip ist erforderlich; false → microchip wird ignoriert und das Register vergibt eine temporäre WC-Nummer. |
microchip | bedingt | string | — | Mikrochip (Transponder). Nur erforderlich, wenn is_microchip = true. |
nickname | ja | string | — | Name des Tieres. |
qr_tag | nein | string | — | Seriennummer des QR-Passes, die bei der Registrierung angehängt werden soll. |
owners | nein | array | — | Eigentümer; der erste wird zum main_owner, die übrigen zu owners (dedupliziert). Jeder Eintrag hängt entweder einen vorhandenen Eigentümer an ODER registriert inline einen neuen. |
owners[].public_id | bedingt | string | — | Anhäng-Modus (API-Version >= 2026-07-04): public_id eines vorhandenen Besitzers aus POST/GET owners. Weglassen, um inline zu registrieren. |
owners[].user_gid | bedingt | int | — | Anhäng-Modus (API-Versionen vor 2026-07-04): veraltete numerische Besitzer-ID. Weglassen, um inline zu registrieren. |
owners[].email | bedingt | string | — | Inline-Modus: E-Mail des Besitzers. Eine von E-Mail/Telefon ist erforderlich, wenn keine public_id/user_gid vorhanden ist (Upsert — keine Duplikate). |
owners[].phone | bedingt | string | — | Inline-Modus: Telefonnummer des Eigentümers (E.164). |
owners[].first_name | nein | string | — | Inline-Modus: Vorname. |
owners[].last_name | nein | string | — | Inline-Modus: Nachname. |
owners[].language | nein | string | languages | Inline-Modus: bevorzugte Sprache. |
owners[].country | nein | string | countries | Inline-Modus: mit Nullen aufgefüllter numerischer ISO 3166-1-Code als Zeichenkette (z. B. "804") — entspricht dem Code im countries-Wörterbuch. |
owners[].consent.account_creation | bedingt | bool | — | Inline-Modus: muss true sein — der Eigentümer hat der account_creation zugestimmt. Nur bei Inline-Registrierung erforderlich. |
breed | nein | string | — | Breed (free text). Used only when breed_public_id is absent. |
breed_public_id | nein | string | — | Canonical breed public_id (a UUID) from GET /breeds?species_public_id=. Must belong to the species; when present it wins over the free-text breed. |
color | nein | string | — | Farbe (Freitext — kein Wörterbuch). |
gender_id | nein | int | sex | Wörterbuch-ID des Geschlechts. |
dob | nein | date | — | Geburtsdatum (ISO 8601). |
microchip_date | nein | date | — | Wann der Chip implantiert wurde (ISO 8601). |
sterilization | nein | bool | — | Sterilisiert-Flag. |
size | nein | int | sizes | Wörterbuch-ID der Größe. |
identifiers | nein | array | — | Zusätzliche Kennungen neben microchip/qr. |
identifiers[].type | ja | int | other_identifiers | Kennungstyp-ID aus dem other_identifiers-Wörterbuch (tattoo, ring, …). |
identifiers[].value | ja | string | — | Wert der Kennung. |
identifiers[].added_at | nein | date | — | Wann die Kennung zugewiesen wurde (ISO 8601). |
Anfrage-Body (JSON)
{
"species": 3,
"is_microchip": true,
"microchip": "900263000123456",
"nickname": "Барсік",
"qr_tag": null,
"gender_id": 1,
"breed": "Labrador",
"color": "black",
"dob": "2022-03-01T00:00:00+00:00",
"microchip_date": "2022-11-20T00:00:00+00:00",
"sterilization": true,
"size": 2,
"owners": [
{ "public_id": "V1StGXR8Z5jd" },
{
"email": "jane@example.com",
"phone": "+380681234567",
"first_name": "Jane",
"last_name": "Doe",
"consent": { "account_creation": true }
}
],
"identifiers": [
{ "type": 3, "value": "TAT-001", "added_at": "2026-05-01T00:00:00+00:00" }
]
}Beispielantwort
{ "payload": { "id": "8xK3pQzVnB7rL2qF" } }| Feld | Beschreibung |
|---|---|
id | Nicht erratbare öffentliche Tier-ID (NanoID). Verwenden Sie sie in allen nachfolgenden Tieraufrufen. |
Antwortstatus
| Status | Bedeutung |
|---|---|
201 | Tier registriert. |
409 | X-Eternity-Idempotency-Key-Konflikt (gleicher Schlüssel, anderer Body). |
422 | Validation error: missing nickname/is_microchip, or neither species nor species_public_id; an unknown species_public_id/breed_public_id or a breed_public_id that does not belong to the species; is_microchip=true without a valid microchip; a duplicate microchip (transponder already registered, field "transponder"); or an inline owner without email/phone or without consent.account_creation. |
/v1/partner/animals/by-identifier/{type}/{value}Suche nach einem bestimmten Kennzeichnungstyp. Immer ein Array.▸Authentifizierung: HMAC. Beliebiger Partnerschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
type | ja | path enum | — | microchip oder qr_tag. |
value | ja | path string | — | Nachzuschlagender Kennungswert. |
Beispielantwort
{
"payload": [
{ "id": "8xK3pQzVnB7rL2qF", "species": 3,
"species_public_id": "d49c523a-d7ff-41b4-9ab6-0d1d2ce20939", "species_name": "Собака",
"breed": "Labrador", "breed_public_id": null, "breed_name": null,
"color": "black", "gender_id": 1,
"nickname": "Барсік", "microchip": "900263000123456", "qr_tag": null,
"dob": "2022-03-01", "register_date": "2026-05-30", "sterilization_status": true,
"lost_status": null, "deceased": false, "died_at": null, "status": 1,
"abilities": { "can_edit": true } }
]
}| Feld | Beschreibung |
|---|---|
payload | Array von Tierkarten — üblicherweise eine, aber ein Wert kann mehrere ergeben. |
species_public_id | Canonical species public_id — the same key you pass back as species_public_id on POST /animals. |
species_name | Species name in the request language (falls back to English, then to the Latin name). |
breed_public_id | Canonical breed public_id, or null when the animal carries only the free-text breed. |
breed_name | Canonical breed name in the request language; null when breed_public_id is null — read `breed` then. |
microchip / qr_tag | Aktive Kennungen. |
lost_status | "active", wenn als vermisst gemeldet, andernfalls null. |
deceased | True, sobald Euthanasie/Tod erfasst ist. |
Berechtigungen
Jedes Tierobjekt enthält ein abilities-Objekt, das beschreibt, was der authentifizierte Partnerbenutzer mit diesem Tier tun darf. Dies ist das erste Zugriffsflag; im Laufe der Zeit werden weitere hinzugefügt.
| Feld | Beschreibung |
|---|---|
abilities.can_edit | Ob der authentifizierte Partnerbenutzer dieses Tier bearbeiten darf — seine Daten aktualisieren, Verfahren hinzufügen und Fotos verwalten. True, wenn der Benutzer das Tier registriert hat, eine Beziehung zu ihm hat (animal_user_relation) oder aktives Mitglied einer Organisation ist, deren Register es führt (org_animals). |
Erweiterung (X-Eternity-Expand)
Optionaler Header, der ein JSON-Array von Expand-Schlüsseln enthält (z. B. ["owners"]). Jeder angeforderte Schlüssel bettet ein zusätzliches Feld in jedes Tierobjekt der Antwort ein; lassen Sie den Header weg, um die einfache Karte zu erhalten. Unbekannte Schlüssel werden mit 422 abgelehnt.
| Schlüssel | Fügt hinzu | Beschreibung |
|---|---|---|
owners | owners[] | Die Eigentümer des Tieres — der Haupteigentümer plus etwaige Miteigentümer — jeweils mit Kontaktdaten und einem is_main_owner-Flag. Nur auf dieser Partneroberfläche verfügbar. |
"owners": [
{
"user_gid": 90231,
"public_id": "V1StGXR8Z5jd",
"has_account": true,
"email": "jane@example.com",
"phone": "+380681234567",
"display_hint": "Ja*** D.",
"language": "uk",
"country_id": "804",
"is_main_owner": true
}
]| Feld | Beschreibung |
|---|---|
owners[].public_id | Stabile öffentliche Besitzer-ID — übergeben Sie sie an POST /animals owners[].public_id (API-Version >= 2026-07-04). |
owners[].user_gid | Veraltete numerische Besitzer-ID (Besitzer-Anhängen in älteren API-Versionen). |
owners[].has_account | Ob der Eigentümer bereits ein nutzbares Konto hat. |
owners[].email | Hinterlegte E-Mail-Adresse für diesen Eigentümer (null, falls unbekannt). |
owners[].phone | Hinterlegte Telefonnummer für diesen Eigentümer (null, falls unbekannt). |
owners[].display_hint | Maskierter Anzeigename (keine personenbezogenen Daten). |
owners[].language | Bevorzugte Sprache. |
owners[].country_id | Mit Nullen aufgefüllter numerischer ISO 3166-1-Code als Zeichenkette (z. B. "804"). |
owners[].is_main_owner | true für den Haupteigentümer (animal_user_relation-Typ main_owner); false für Miteigentümer. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK — Array (möglicherweise leer). |
/v1/partner/animals/by-identifier/{value}Suche über alle Kennzeichnungstypen gleichzeitig. Immer ein Array.▸Authentifizierung: HMAC. Beliebiger Partnerschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
value | ja | path string | — | Kennungswert; durchsucht über microchip und qr_tag. |
Beispielantwort
{ "payload": [ { "id": "8xK3pQzVnB7rL2qF", "nickname": "Барсік", "microchip": "900263000123456",
"species": 3, "species_public_id": "d49c523a-d7ff-41b4-9ab6-0d1d2ce20939",
"species_name": "Собака", "breed": "Labrador",
"breed_public_id": null, "breed_name": null } ] }| Feld | Beschreibung |
|---|---|
species_public_id / breed_public_id | Canonical keys — the same ones POST /animals accepts. breed_public_id is null while the animal carries only the free-text breed. |
species_name / breed_name | Names in the request language (falling back to English, then to the Latin/canonical name). |
Berechtigungen
Jedes Tierobjekt enthält ein abilities-Objekt, das beschreibt, was der authentifizierte Partnerbenutzer mit diesem Tier tun darf. Dies ist das erste Zugriffsflag; im Laufe der Zeit werden weitere hinzugefügt.
| Feld | Beschreibung |
|---|---|
abilities.can_edit | Ob der authentifizierte Partnerbenutzer dieses Tier bearbeiten darf — seine Daten aktualisieren, Verfahren hinzufügen und Fotos verwalten. True, wenn der Benutzer das Tier registriert hat, eine Beziehung zu ihm hat (animal_user_relation) oder aktives Mitglied einer Organisation ist, deren Register es führt (org_animals). |
Erweiterung (X-Eternity-Expand)
Optionaler Header, der ein JSON-Array von Expand-Schlüsseln enthält (z. B. ["owners"]). Jeder angeforderte Schlüssel bettet ein zusätzliches Feld in jedes Tierobjekt der Antwort ein; lassen Sie den Header weg, um die einfache Karte zu erhalten. Unbekannte Schlüssel werden mit 422 abgelehnt.
| Schlüssel | Fügt hinzu | Beschreibung |
|---|---|---|
owners | owners[] | Die Eigentümer des Tieres — der Haupteigentümer plus etwaige Miteigentümer — jeweils mit Kontaktdaten und einem is_main_owner-Flag. Nur auf dieser Partneroberfläche verfügbar. |
"owners": [
{
"user_gid": 90231,
"public_id": "V1StGXR8Z5jd",
"has_account": true,
"email": "jane@example.com",
"phone": "+380681234567",
"display_hint": "Ja*** D.",
"language": "uk",
"country_id": "804",
"is_main_owner": true
}
]| Feld | Beschreibung |
|---|---|
owners[].public_id | Stabile öffentliche Besitzer-ID — übergeben Sie sie an POST /animals owners[].public_id (API-Version >= 2026-07-04). |
owners[].user_gid | Veraltete numerische Besitzer-ID (Besitzer-Anhängen in älteren API-Versionen). |
owners[].has_account | Ob der Eigentümer bereits ein nutzbares Konto hat. |
owners[].email | Hinterlegte E-Mail-Adresse für diesen Eigentümer (null, falls unbekannt). |
owners[].phone | Hinterlegte Telefonnummer für diesen Eigentümer (null, falls unbekannt). |
owners[].display_hint | Maskierter Anzeigename (keine personenbezogenen Daten). |
owners[].language | Bevorzugte Sprache. |
owners[].country_id | Mit Nullen aufgefüllter numerischer ISO 3166-1-Code als Zeichenkette (z. B. "804"). |
owners[].is_main_owner | true für den Haupteigentümer (animal_user_relation-Typ main_owner); false für Miteigentümer. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK — Array (möglicherweise leer). |
/v1/partner/animals/by-ownerTiere anhand des Halterkontakts suchen. Immer ein Array.▸Authentifizierung: HMAC. Beliebiger Partnerschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
email_or_phone | ja | string | — | Exakte E-Mail oder Telefon des Eigentümers (einzelnes Feld; E-Mail wird am Format erkannt). Eine Telefonnummer wird zuerst zum Eigentümer aufgelöst. |
Beispielantwort
{ "payload": [ { "id": "8xK3pQzVnB7rL2qF", "nickname": "Барсік", "species": 3,
"species_public_id": "d49c523a-d7ff-41b4-9ab6-0d1d2ce20939",
"species_name": "Собака", "breed": "Labrador",
"breed_public_id": null, "breed_name": null } ] }| Feld | Beschreibung |
|---|---|
species_public_id / breed_public_id | Canonical keys — the same ones POST /animals accepts. breed_public_id is null while the animal carries only the free-text breed. |
species_name / breed_name | Names in the request language (falling back to English, then to the Latin/canonical name). |
Berechtigungen
Jedes Tierobjekt enthält ein abilities-Objekt, das beschreibt, was der authentifizierte Partnerbenutzer mit diesem Tier tun darf. Dies ist das erste Zugriffsflag; im Laufe der Zeit werden weitere hinzugefügt.
| Feld | Beschreibung |
|---|---|
abilities.can_edit | Ob der authentifizierte Partnerbenutzer dieses Tier bearbeiten darf — seine Daten aktualisieren, Verfahren hinzufügen und Fotos verwalten. True, wenn der Benutzer das Tier registriert hat, eine Beziehung zu ihm hat (animal_user_relation) oder aktives Mitglied einer Organisation ist, deren Register es führt (org_animals). |
Erweiterung (X-Eternity-Expand)
Optionaler Header, der ein JSON-Array von Expand-Schlüsseln enthält (z. B. ["owners"]). Jeder angeforderte Schlüssel bettet ein zusätzliches Feld in jedes Tierobjekt der Antwort ein; lassen Sie den Header weg, um die einfache Karte zu erhalten. Unbekannte Schlüssel werden mit 422 abgelehnt.
| Schlüssel | Fügt hinzu | Beschreibung |
|---|---|---|
owners | owners[] | Die Eigentümer des Tieres — der Haupteigentümer plus etwaige Miteigentümer — jeweils mit Kontaktdaten und einem is_main_owner-Flag. Nur auf dieser Partneroberfläche verfügbar. |
"owners": [
{
"user_gid": 90231,
"public_id": "V1StGXR8Z5jd",
"has_account": true,
"email": "jane@example.com",
"phone": "+380681234567",
"display_hint": "Ja*** D.",
"language": "uk",
"country_id": "804",
"is_main_owner": true
}
]| Feld | Beschreibung |
|---|---|
owners[].public_id | Stabile öffentliche Besitzer-ID — übergeben Sie sie an POST /animals owners[].public_id (API-Version >= 2026-07-04). |
owners[].user_gid | Veraltete numerische Besitzer-ID (Besitzer-Anhängen in älteren API-Versionen). |
owners[].has_account | Ob der Eigentümer bereits ein nutzbares Konto hat. |
owners[].email | Hinterlegte E-Mail-Adresse für diesen Eigentümer (null, falls unbekannt). |
owners[].phone | Hinterlegte Telefonnummer für diesen Eigentümer (null, falls unbekannt). |
owners[].display_hint | Maskierter Anzeigename (keine personenbezogenen Daten). |
owners[].language | Bevorzugte Sprache. |
owners[].country_id | Mit Nullen aufgefüllter numerischer ISO 3166-1-Code als Zeichenkette (z. B. "804"). |
owners[].is_main_owner | true für den Haupteigentümer (animal_user_relation-Typ main_owner); false für Miteigentümer. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK — Array (leer, wenn der Eigentümer bei reinen Telefonsuchen keine hinterlegte E-Mail hat). |
422 | email_or_phone ist erforderlich. |
/v1/partner/animals/{id}Vollständige Tierkarte.▸Authentifizierung: HMAC. Beliebiger Partnerschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
id | ja | path string | — | Öffentliche Tier-ID (NanoID). |
Beispielantwort
{ "payload": { "id": "8xK3pQzVnB7rL2qF", "species": 3,
"species_public_id": "d49c523a-d7ff-41b4-9ab6-0d1d2ce20939", "species_name": "Собака",
"breed": "Labrador", "breed_public_id": null, "breed_name": null,
"nickname": "Барсік", "microchip": "900263000123456", "deceased": false,
"abilities": { "can_edit": true } } }| Feld | Beschreibung |
|---|---|
species_public_id | Canonical species public_id — the same key you pass back as species_public_id on POST /animals. |
species_name | Species name in the request language (falls back to English, then to the Latin name). |
breed_public_id | Canonical breed public_id, or null when the animal carries only the free-text breed. |
breed_name | Canonical breed name in the request language; null when breed_public_id is null — read `breed` then. |
Berechtigungen
Jedes Tierobjekt enthält ein abilities-Objekt, das beschreibt, was der authentifizierte Partnerbenutzer mit diesem Tier tun darf. Dies ist das erste Zugriffsflag; im Laufe der Zeit werden weitere hinzugefügt.
| Feld | Beschreibung |
|---|---|
abilities.can_edit | Ob der authentifizierte Partnerbenutzer dieses Tier bearbeiten darf — seine Daten aktualisieren, Verfahren hinzufügen und Fotos verwalten. True, wenn der Benutzer das Tier registriert hat, eine Beziehung zu ihm hat (animal_user_relation) oder aktives Mitglied einer Organisation ist, deren Register es führt (org_animals). |
Erweiterung (X-Eternity-Expand)
Optionaler Header, der ein JSON-Array von Expand-Schlüsseln enthält (z. B. ["owners"]). Jeder angeforderte Schlüssel bettet ein zusätzliches Feld in jedes Tierobjekt der Antwort ein; lassen Sie den Header weg, um die einfache Karte zu erhalten. Unbekannte Schlüssel werden mit 422 abgelehnt.
| Schlüssel | Fügt hinzu | Beschreibung |
|---|---|---|
owners | owners[] | Die Eigentümer des Tieres — der Haupteigentümer plus etwaige Miteigentümer — jeweils mit Kontaktdaten und einem is_main_owner-Flag. Nur auf dieser Partneroberfläche verfügbar. |
"owners": [
{
"user_gid": 90231,
"public_id": "V1StGXR8Z5jd",
"has_account": true,
"email": "jane@example.com",
"phone": "+380681234567",
"display_hint": "Ja*** D.",
"language": "uk",
"country_id": "804",
"is_main_owner": true
}
]| Feld | Beschreibung |
|---|---|
owners[].public_id | Stabile öffentliche Besitzer-ID — übergeben Sie sie an POST /animals owners[].public_id (API-Version >= 2026-07-04). |
owners[].user_gid | Veraltete numerische Besitzer-ID (Besitzer-Anhängen in älteren API-Versionen). |
owners[].has_account | Ob der Eigentümer bereits ein nutzbares Konto hat. |
owners[].email | Hinterlegte E-Mail-Adresse für diesen Eigentümer (null, falls unbekannt). |
owners[].phone | Hinterlegte Telefonnummer für diesen Eigentümer (null, falls unbekannt). |
owners[].display_hint | Maskierter Anzeigename (keine personenbezogenen Daten). |
owners[].language | Bevorzugte Sprache. |
owners[].country_id | Mit Nullen aufgefüllter numerischer ISO 3166-1-Code als Zeichenkette (z. B. "804"). |
owners[].is_main_owner | true für den Haupteigentümer (animal_user_relation-Typ main_owner); false für Miteigentümer. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK. |
404 | Tier nicht gefunden. |
/v1/partner/animals/{id}Änderbare Felder aktualisieren / als verstorben markieren.▸Authentifizierung: HMAC. Eigentümer ODER Tierarzt mit aktiver Beziehung zum Tier. · X-Eternity-Idempotency-Key erforderlich
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
nickname | nein | string | — | Neuer Name. |
color | nein | string | — | Neue Farbe (Freitext — kein Wörterbuch). |
sterilization_status | nein | bool | — | Sterilisiert-Flag setzen. |
deceased | nein | bool | — | true → das Tier als tot markieren. |
Anfrage-Body (JSON)
{
"nickname": "Барсік",
"color": "black",
"sterilization_status": true,
"deceased": false
}Beispielantwort
204 No Content
Antwortstatus
| Status | Bedeutung |
|---|---|
204 | Aktualisiert. |
403 | Kein Zugriff auf dieses Tier — fordern Sie ihn an (POST /v1/partner/animals/{id}/access-request) und wiederholen Sie es, sobald der Eigentümer zustimmt. |
409 | X-Eternity-Idempotency-Key-Konflikt. |
422 | Validierungsfehler. |
/v1/partner/animals/{id}/access-requestDen Tierhalter um Zugriff bitten.▸Authentifizierung: HMAC. Tierarzt-/Organisationsschlüssel. · X-Eternity-Idempotency-Key erforderlich
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
id | ja | path string | — | Öffentliche Tier-ID (NanoID). |
Beispielantwort
{
"payload": {
"status": "pending",
"requested_at": "2026-06-23T09:00:00+00:00",
"expires_at": "2026-06-30T09:00:00+00:00",
"retry_after_seconds": 604800
}
}| Feld | Beschreibung |
|---|---|
status | "granted" — Sie haben bereits Zugriff, es wurde keine Anfrage erstellt; "pending" — wartet auf den Eigentümer; "denied" — der Eigentümer hat abgelehnt (erneut prüfbar, bis sie abläuft). |
requested_at | Wann die Anfrage gestellt wurde (null, wenn status="granted"). |
expires_at | Wann die Anfrage abläuft und Sie erneut anfragen dürfen (null, wenn status="granted"). |
retry_after_seconds | Sekunden, bis Sie dasselbe Tier erneut anfragen dürfen (0 nach Ablauf; null, wenn status="granted"). |
Antwortstatus
| Status | Bedeutung |
|---|---|
201 | Eine neue Zugriffsanfrage wurde erstellt — der Eigentümer wurde per E-Mail benachrichtigt. |
200 | Keine neue Anfrage erstellt: Sie haben bereits Zugriff (status "granted") oder es existiert bereits eine aktive Anfrage (status "pending"/"denied") — warten Sie retry_after_seconds ab, bevor Sie erneut anfragen. |
404 | Tier nicht gefunden. |
/v1/partner/animals/{id}/access-requestPrüfen, ob Ihre Zugriffsanfrage genehmigt wurde.▸Authentifizierung: HMAC. Tierarzt-/Organisationsschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
id | ja | path string | — | Öffentliche Tier-ID (NanoID). |
Beispielantwort
{
"payload": {
"status": "granted",
"requested_at": "2026-06-23T09:00:00+00:00",
"expires_at": "2026-06-30T09:00:00+00:00",
"retry_after_seconds": 0
}
}| Feld | Beschreibung |
|---|---|
status | "granted" — Zugriff wurde genehmigt und ist aktiv; "pending" — wartet auf den Eigentümer; "denied" — abgelehnt; "none" — keine aktive Anfrage. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK. |
404 | Tier nicht gefunden. |
/v1/partner/animals/{id}/proceduresBehandlungen erfassen; öffnet einen Besuch. Einzelobjekt oder Array.▸Authentifizierung: HMAC. Tierarzt-/Organisationsschlüssel mit Zugriff auf das Tier. · X-Eternity-Idempotency-Key erforderlich
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
(body) | ja | object | array | — | Ein einzelnes Verfahrensobjekt oder ein Array davon (≤100). |
type | ja | int | procedure_types | Katalog-ID des Verfahrens: 10 Impfung, 20 Tollwutimpfung, 30 Transponder-Identifikation, 40 Token-Identifikation, 50 Entwurmung, 60 Sterilisation, 70 Euthanasie / Todesbescheinigung. |
occurred_at | ja | datetime | — | Wann durchgeführt (ISO 8601). |
summary | nein | string | — | Freitext-Notiz. |
revaccination_date | nein | date | — | Datum der nächsten Impfung überschreiben (Impfungen). |
type_specific_payload | nein | object | — | Felder pro Typ — serverseitig validiert: 10/20 → {vaccine_name*, batch_number*}; 30 → {transponder_number* — 15 digits}; 40 → {token_number*}; 50 → {drug*, batch_number?, dose?}; 60 → {method?, anesthesia_type?}; 70 → {reason*, death_date*}. Für Typ 30: Wenn das Tier bereits einen Mikrochip trägt, wird dieser beibehalten — die neue Nummer wird als zusätzliche Kennung gespeichert (other_identifiers Typ 11), anstatt den Chip zu ersetzen. |
Anfrage-Body (JSON)
[
{
"type": 10,
"occurred_at": "2026-05-30T08:00:00+00:00",
"summary": "Annual shot",
"revaccination_date": "2027-05-30",
"type_specific_payload": {
"vaccine_name": "Nobivac",
"batch_number": "A123"
}
},
{
"type": 30,
"occurred_at": "2026-05-30T08:05:00+00:00",
"type_specific_payload": {
"transponder_number": "900263000123456"
}
}
]Beispielantwort
{
"payload": {
"appointment_id": 7741,
"procedures": [
{ "id": 99001, "animal_id": "8xK3pQzVnB7rL2qF", "visit_id": 7741, "type": 10,
"occurred_at": "2026-05-30T08:00:00+00:00", "summary": "Annual shot", "revaccination_date": "2027-05-30",
"type_specific_payload": { "vaccine_name": "Nobivac", "batch_number": "A123" } }
]
}
}| Feld | Beschreibung |
|---|---|
appointment_id | Der für diesen Batch geöffnete/verwendete Besuch. |
procedures[] | The recorded procedures — same card as GET list/show. |
procedures[].id | ID des Verfahrensdatensatzes. |
procedures[].type | Numeric type id (procedure_types dictionary). |
procedures[].type_specific_payload | Gespeicherte typspezifische Nutzdaten. |
Antwortstatus
| Status | Bedeutung |
|---|---|
201 | Erfasst; Besuch geöffnet. |
403 | Kein Zugriff auf dieses Tier — fordern Sie ihn an (POST /v1/partner/animals/{id}/access-request) und wiederholen Sie es, sobald der Eigentümer zustimmt. |
404 | Tier nicht gefunden. |
409 | X-Eternity-Idempotency-Key-Konflikt. |
422 | Nicht unterstützter Typ, fehlendes occurred_at oder fehlende typspezifische Felder. |
/v1/partner/animals/{id}/proceduresBehandlungen eines Tieres auflisten. Immer ein Array.▸Authentifizierung: HMAC. Tierarzt-/Organisationsschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
type | nein | int | procedure_types | Nach Verfahrenskatalog-ID filtern. |
since | nein | datetime | — | Nur an oder nach diesem Zeitpunkt. |
until | nein | datetime | — | Nur an oder vor diesem Zeitpunkt. |
Beispielantwort
{
"payload": [
{ "id": 99001, "animal_id": "8xK3pQzVnB7rL2qF", "visit_id": 7741, "type": 10,
"occurred_at": "2026-05-30T08:00:00+00:00", "summary": null, "revaccination_date": "2027-05-30",
"type_specific_payload": { "vaccine_name": "Nobivac", "batch_number": "A123" } }
]
}| Feld | Beschreibung |
|---|---|
type | Katalog-ID des Verfahrens (procedure_types-Wörterbuch). |
visit_id | Termin, unter dem das Verfahren erfasst wurde. |
type_specific_payload | Felder pro Typ. |
Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK — Array (möglicherweise leer). |
404 | Tier nicht gefunden. |
/v1/partner/procedures/{id}Einzelne Behandlung.▸Authentifizierung: HMAC. Tierarzt-/Organisationsschlüssel.
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
id | ja | path int | — | ID des Verfahrensdatensatzes. |
Beispielantwort
{
"payload": {
"id": 99001, "animal_id": "8xK3pQzVnB7rL2qF", "visit_id": 7741, "type": 10,
"occurred_at": "2026-05-30T08:00:00+00:00", "summary": null, "revaccination_date": "2027-05-30",
"type_specific_payload": { "vaccine_name": "Nobivac", "batch_number": "A123" }
}
}Antwortstatus
| Status | Bedeutung |
|---|---|
200 | OK. |
404 | Verfahren nicht gefunden. |
/v1/partner/animals/{id}/photosFoto hochladen (multipart). Halter oder Tierarzt mit Beziehung.▸Authentifizierung: HMAC + multipart/form-data. Eigentümer ODER Tierarzt mit Beziehung. · X-Eternity-Idempotency-Key erforderlich
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
file | ja | file | — | Bilddatei. Max. 8 MB pro Foto (Konfiguration partner.photos.max_single_mb). |
kind | nein | enum | — | avatar | gallery | nose_print. avatar legt das Hauptfoto fest. Standard gallery. |
Beispielantwort
{ "payload": { "id": 33015 } }| Feld | Beschreibung |
|---|---|
id | ID des neuen Fotos. |
Antwortstatus
| Status | Bedeutung |
|---|---|
201 | Hochgeladen. |
403 | Kein Zugriff auf dieses Tier — fordern Sie ihn an (POST /v1/partner/animals/{id}/access-request) und wiederholen Sie es, sobald der Eigentümer zustimmt. |
422 | Ungültige Datei oder größer als 8 MB (Größe reduzieren / Qualität verringern). |
413 | Gesamte Anfrage überschreitet 15 MB. |
/v1/partner/animals/{id}/photos/{photoId}Foto soft-löschen.▸Authentifizierung: HMAC. Eigentümer ODER Tierarzt mit Beziehung. · X-Eternity-Idempotency-Key erforderlich
Anfragefelder
| Feld | Erf. | Typ | Wörterbuch | Beschreibung |
|---|---|---|---|---|
id | ja | path string | — | Öffentliche Tier-ID (NanoID). |
photoId | ja | path int | — | Foto-ID. |
Beispielantwort
204 No Content
Antwortstatus
| Status | Bedeutung |
|---|---|
204 | Gelöscht. |
403 | Kein Zugriff auf dieses Tier — fordern Sie ihn an (POST /v1/partner/animals/{id}/access-request) und wiederholen Sie es, sobald der Eigentümer zustimmt. |