Metody API
Dokumentacja Partner API
Ten przewodnik opisuje, jak Twoja integracja komunikuje się z Animal-ID w imieniu Twojej organizacji: uwierzytelnianie, wymagane nagłówki i podstawowe endpointy MVP (właściciele, zwierzęta, procedury, zdjęcia, słowniki).
SDK i biblioteki klienckie
Oficjalne SDK open-source, które opakowują podpisywanie żądań i opisane niżej punkty końcowe — podłącz je zamiast podpisywać żądania ręcznie.
PHP · Composer
Serwerowe SDK dla PHP: podpisywanie żądań HMAC i typowane klienty dla każdego punktu końcowego.
composer require animal-id/aid-partner-sdk
JavaScript · npm
Pakiety dla frameworków w Node i w przeglądarce, zbudowane na wspólnym rdzeniu.
npm i @animal-id/partner-core
- @animal-id/partner-coreRdzeń niezależny od frameworka: podpisywanie + typowany klient.
- @animal-id/partner-reactHooki i helpery dla Reacta.
- @animal-id/partner-vueComposables dla Vue.
- @animal-id/partner-angularSerwisy dla Angulara.
- @animal-id/partner-nestjsModuł NestJS do integracji po stronie serwera.
Uwierzytelnianie i podpisywanie żądań
Bazowy URL: https://gw.animal-id.net · wszystkie ścieżki zaczynają się od /v1/partner.
Każde podpisane żądanie zawiera cztery nagłówki. Podpis to HMAC-SHA256 (hex) kanonicznego ciągu znaków, obliczony z użyciem Twojego klucza prywatnego:
stringToSign = METHOD + "\n" + path[?query] + "\n" + sha256_hex(rawBody) + "\n" + timestamp signature = hex( hmac_sha256(stringToSign, privateKey) )
| Nagłówek | Wartość |
|---|---|
X-Eternity-App-Id | Identyfikator Twojej aplikacji. |
X-Eternity-Public-Key | Twój klucz publiczny. |
X-Eternity-Timestamp | Czas Unix w sekundach; musi mieścić się w zakresie ±300s od czasu serwera. |
X-Eternity-Signature | Obliczony powyżej HMAC-SHA256 w postaci hex. |
X-Eternity-Idempotency-Key | UUID, wymagany w każdym żądaniu POST/PATCH/DELETE. Powtórzone żądania zwracają pierwszą odpowiedź; ten sam klucz + inne ciało → 409. |
X-Eternity-Animal-ID-Version | Opcjonalna wersja w postaci daty (YYYY-MM-DD). Domyślnie obowiązuje wersja ustalona w chwili wydania Twojej aplikacji; od 2026-07-04 rejestracja zwierzęcia dołącza istniejących właścicieli po public_id zamiast po user_gid. |
X-Eternity-Expand | Opcjonalny. Tablica JSON kluczy rozszerzeń, które osadzają dodatkowe dane w obsługiwanych endpointach (np. ["owners"]). Dozwolone klucze znajdziesz w sekcji „Rozszerzenie” danego endpointu; nieznane klucze → 422. |
X-Eternity-Lang-Code | Opcjonalny. Kod języka (uk, en, ru, de, es) dla nazw zwracanych przez API — np. species_name i breed_name na karcie zwierzęcia oraz etykiety w słownikach. Jeśli pominięty, używany jest domyślny język regionu. |
Podpisz i wyślij dokładnie te same bajty ciała. Dla GET/DELETE ciało jest puste (jego sha256 to skrót pustego ciągu). path obejmuje query string, jeśli występuje. Przy przesyłaniu multipart/form-data (zdjęcia) surowe ciało również nie jest częścią podpisu — podpisz sha256 pustego ciała.
Każda udana odpowiedź opakowuje wyniki w tablicę payload. Endpointy tworzące lub pobierające pojedynczy zasób zwracają tablicę jednoelementową (np. { "payload": [ { … } ] }); dla zwięzłości przykłady poszczególnych endpointów poniżej pokazują sam obiekt.
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);Webhooki
Odbieraj odroczone zdarzenia — na przykład zgodę właściciela na wniosek weterynarza o dostęp — jako podpisane żądania POST na Twój serwer. Adres URL ustawisz, a sekret podpisu znajdziesz na karcie kluczy API.
Podpisane dostarczenie webhookaPodpis i treść webhooka▸Każde zdarzenie wysyłamy metodą POST na skonfigurowany przez Ciebie URL webhooka, podpisane sekretem webhooka Twojej aplikacji (pokazywanym jednorazowo przy generowaniu). Zanim zaufasz dostarczeniu, zweryfikuj podpis: oblicz ponownie HMAC z kanonicznego ciągu i porównaj wyniki w stałym czasie:
canonical = "POST" + "\n" + path[?query] + "\n" + sha256_hex(rawBody) + "\n" + timestamp signature = hex( hmac_sha256(canonical, webhookSecret) )
| Nagłówek | Wartość |
|---|---|
X-Eternity-Webhook-Id | Unikalny identyfikator dostarczenia (UUID); nie zmienia się przy ponownych wysyłkach tego samego zdarzenia. |
X-Eternity-Webhook-Event | Klucz zdarzenia, np. animal_access.approved. |
X-Eternity-Webhook-Timestamp | Czas Unix (w sekundach) podpisania dostarczenia; odrzucaj dostarczenia z rozbieżnym znacznikiem czasu. |
X-Eternity-Webhook-Signature | HMAC-SHA256 (hex) kanonicznego ciągu, obliczony z użyciem Twojego sekretu webhooka (nie klucza prywatnego API). |
Ciało dostarczenia (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"
}
}| Pole | Opis |
|---|---|
id | Unikalny identyfikator zdarzenia (zgodny z nagłówkiem X-Eternity-Webhook-Id). |
event | Klucz zdarzenia, np. animal_access.approved. |
occurred_at | Kiedy wystąpiło zdarzenie (ISO 8601). |
result | Decyzja w sprawie dostępu. Odpowiada GET /v1/partner/animals/{id}/access-request i dodatkowo zawiera animal_id, requester_user_gid oraz decided_at. |
Zdarzenia
| Klucz | Znaczenie |
|---|---|
animal_access.approved | Właściciel zaakceptował Twoją oczekującą prośbę o dostęp — możesz teraz edytować zwierzę. |
animal_access.denied | Właściciel odrzucił Twoją prośbę o dostęp — możesz poprosić ponownie, gdy wygaśnie. |
procedures.verified | Właściciel potwierdził zabiegi zapisane przez Ciebie bez dostępu — są teraz zweryfikowane. |
procedures.rejected | Właściciel odrzucił zabiegi zapisane przez Ciebie bez dostępu — zostały usunięte. |
consent.approved | Osoba, którą zapytałeś, wyraziła zgodę — możesz korzystać z uprawnienia, dopóki nie wygaśnie. |
consent.denied | Osoba, którą zapytałeś, odrzuciła wniosek. Nic nie zostało przyznane. |
consent.revoked | Przyznane Ci uprawnienie zostało cofnięte. W przypadku przekazanego klucza przestaje on działać natychmiast. |
consent.expired | Nikt nie odpowiedział na czas i wniosek stracił ważność. To nie jest odmowa — możesz zapytać ponownie. |
Treść zdarzenia o zabiegach
Wysyłane do organizacji, dla której złożono prośbę o dostęp, oprócz animal_access.* i bez ustalonej kolejności względem niego. Zmiany, które zweryfikowany zabieg wprowadza w zwierzęciu (mikroczip, adresówka, sterylizacja, śmierć), są wprowadzane osobno i mogą pojawić się po tym zdarzeniu.
{
"id": "0c9b6a14-6d1e-4b8e-9f7a-3c2d1e0f9a87",
"event": "procedures.verified",
"occurred_at": "2026-05-31T10:00:00+00:00",
"result": {
"animal_id": "8xK3pQzVnB7rL2qF",
"requester_user_gid": 90231,
"decided_at": "2026-05-31T10:00:00+00:00",
"procedures": [
{ "id": 99001, "visit_id": null, "type": 10,
"occurred_at": "2026-05-30T08:00:00+00:00", "verification_status": "verified" }
]
}
}| Pole | Opis |
|---|---|
animal_id | Publiczny id zwierzęcia. |
requester_user_gid | Globalny id weterynarza, który zapisał zabiegi. |
decided_at | Kiedy właściciel podjął decyzję (ISO 8601). |
procedures[] | Każdy zabieg objęty decyzją: id, visit_id (null dla niezweryfikowanej partii), type, occurred_at i jego nowy verification_status. |
Treść zdarzenia o zgodzie
Zdarzenia o zgodzie są dostarczane do Twojej aplikacji platformy, a nie do organizacji: gdy lekarz pozwala Ci trzymać dane dostępowe działające w jego imieniu, żadna przychodnia nie bierze w tym udziału.
{
"id": "282824f1-b65e-40f4-86d1-62a2bac566df",
"event": "consent.revoked",
"occurred_at": "2026-08-26T19:45:00+00:00",
"result": {
"consent_id": "qeHSuvlSZHAWpacF",
"kind": "key_handover",
"status": "revoked",
"doctor_id": "c71ORqKq81fRoTcm",
"clinic_id": null,
"decided_at": "2026-08-26T19:45:00+00:00"
}
}| Pole | Opis |
|---|---|
consent_id | Wniosek, którego dotyczy ta decyzja — ten sam identyfikator, który zwróciło wywołanie provisioningu. |
kind | key_handover (dane dostępowe działające w imieniu lekarza) lub clinic_membership (dodanie lekarza do przychodni). |
status | approved, denied, revoked lub expired. |
doctor_id | Publiczny identyfikator lekarza — przy przekazaniu klucza. W przeciwnym razie null; także null, jeśli konto zostało od tego czasu usunięte. |
clinic_id | Publiczny identyfikator przychodni — przy członkostwie w przychodni. W przeciwnym razie null. |
decided_at | Kiedy nastąpił ten stan (ISO 8601). Przy wygaśnięciu jest to termin końcowy, a nie moment, w którym to zauważyliśmy. |
Obsługuj consent.revoked. Uprawnienie można cofnąć w dowolnej chwili, a przekazany klucz przestaje wtedy działać natychmiast — bez tego zdarzenia dowiedziałbyś się o tym dopiero wtedy, gdy kolejne wywołanie zakończy się błędem.
Potwierdź odbiór dowolną odpowiedzią 2xx. Status inny niż 2xx lub przekroczenie limitu czasu zapisujemy jako nieudane dostarczenie, które możesz wysłać ponownie z dziennika dostarczeń webhooków w swoim panelu.
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 2xxMetody API
Zacznij pisać — sekcje filtrują się według słów kluczowych.
Platform API — zakładanie kont
Zakładanie przychodni i lekarzy oraz proszenie ludzi o zgodę, której nie da się wziąć samemu. Od tego zaczyna się integracja: najpierw tworzysz konta, a potem odbierasz dane dostępowe, którymi będziesz z nimi pracować.
- Podpisywane Twoim kluczem platformy, wydawanym jednorazowo przy zakładaniu konta partnera. W nagłówku X-Eternity-App-Id wysyłaj uuid aplikacji platformy.
- Do danych zwierząt nie sięga nigdy. Klucz platformy na ścieżce /v1/partner/ zwróci 401 — to działa rozdzielenie, a nie błąd konfiguracji.
/v1/platform/organizationsZnajdź już istniejącą przychodnię, zanim utworzysz nową.▸Uwierzytelnianie: HMAC z Twoim kluczem PLATFORMY.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
query | tak | string | — | Fragment nazwy lub adresu, co najmniej 2 znaki. |
limit | nie | int | — | Maksymalna liczba wyników, do 50 (domyślnie 20). |
Przykładowa odpowiedź
{
"payload": [
{
"public_id": "TGo1Gwe2ppRkUFO1",
"org_name": "Лапа",
"full_address": "Україна, Київ, вул. Прикладна, 1",
"status": 3,
"linked": false
}
]
}| Pole | Opis |
|---|---|
public_id | Przekaż go do endpointu dodawania członka, aby umieścić tu lekarza. |
status | Status moderacji. Przychodnia założona przez Ciebie pozostaje poza publicznym katalogiem, dopóki nie przejmie jej dyrektor. |
linked | true, gdy ta przychodnia została założona przez Ciebie. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | Dopasowania (pusta lista, gdy nic nie pasuje). |
422 | Błąd walidacji (brak parametru query lub jest on krótszy niż 2 znaki). |
/v1/platform/organizationsUtwórz przychodnię lub znajdź już istniejącą po własnym identyfikatorze.▸Uwierzytelnianie: HMAC z Twoim kluczem PLATFORMY. Jest wydawany osobno od kluczy przychodni i nigdy nie sięga do danych zwierząt.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
external_org_id | tak | string | — | Twój własny identyfikator tej przychodni. Ponowne wywołanie z tą samą wartością zwraca przychodnię, którą już masz, zamiast tworzyć kolejną — dlatego wysyłaj stałą wartość. |
name | tak | string | — | Nazwa przychodni. |
director_public_id | tak | string | — | Lekarz, który obejmuje stanowisko dyrektora, wskazany przez swój public_id (z POST /owners lub z endpointu dodawania członka poniżej). Przychodnia nie może istnieć bez dyrektora, a lekarz może kierować tylko jedną przychodnią — wskazanie osoby, która kieruje już inną, kończy się odpowiedzią 409. |
email | nie | string | — | Kontaktowy adres e-mail. |
phone | nie | string | — | Telefon kontaktowy (E.164). |
website | nie | string | — | Strona internetowa. |
address | nie | string | — | Pełny adres. |
country_id | nie | int | countries | Identyfikator kraju ze słownika. |
description | nie | string | — | Opis w postaci dowolnego tekstu. |
lat | nie | number | — | Szerokość geograficzna. |
lng | nie | number | — | Długość geograficzna. |
Ciało żądania (JSON)
{
"external_org_id": "crm-clinic-118",
"name": "Лапа",
"director_public_id": "V1StGXR8Z5jd",
"email": "clinic@example.com",
"phone": "+380441234567"
}Przykładowa odpowiedź
{
"payload": {
"public_id": "yAvgJrSYehJo9JXh",
"name": "Лапа",
"status": 2,
"created": true
}
}| Pole | Opis |
|---|---|
public_id | Stały publiczny identyfikator przychodni — przekaż go do endpointu dodawania członka poniżej. |
created | true, gdy to wywołanie utworzyło przychodnię; false, gdy zwróciło tę, którą już masz. |
status | Status moderacji. Założona przychodnia pozostaje poza publicznym katalogiem, dopóki nie przejmie jej dyrektor. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Utworzono przychodnię. |
200 | Przychodnia dla tego external_org_id już istniała — zwrócono tę samą przychodnię. |
409 | Wskazany dyrektor kieruje już inną przychodnią. Wskaż innego lekarza. |
422 | Błąd walidacji (brak external_org_id, name lub director_public_id). |
/v1/platform/organizations/{clinic_public_id}/membersUmieść lekarza w przychodni i odbierz jego dane dostępowe.▸Uwierzytelnianie: HMAC z Twoim kluczem PLATFORMY.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
email | warunkowo | string | — | E-mail lekarza. Wymagane jest jedno z pól email/phone. |
phone | warunkowo | string | — | Telefon lekarza (E.164). Wymagane jest jedno z pól email/phone. |
first_name | nie | string | — | Imię. |
last_name | nie | string | — | Nazwisko. |
language | nie | string | languages | Preferowany język. |
clinic_name | nie | string | — | Etykieta wyświetlana przy wydanych danych dostępowych. |
external_doctor_id | nie | string | — | Twój własny identyfikator tego lekarza. To samo pole i te same zasady co external_owner_id: zapisywany raz, nigdy nie nadpisywany i widoczny wyłącznie dla Ciebie. |
consent | tak | object | — | Blok zgody (niezmienny zapis audytowy). |
consent.account_creation | tak | bool | — | Musi mieć wartość true. Otrzymane dane dostępowe działają w imieniu tej osoby, dlatego wymagana jest jej zgoda. |
Ciało żądania (JSON)
{
"email": "doctor@example.com",
"first_name": "Ihor",
"last_name": "Melnyk",
"language": "uk",
"external_doctor_id": "crm-doc-4471",
"consent": { "account_creation": true }
}Przykładowa odpowiedź
{
"payload": {
"public_id": "LSG9w6B2rwAiPoJD",
"app_id": "4833d2e5-1a97-4572-ac5d-a03c7614e0d7",
"public_key": "94af0494...",
"private_key": "b208c6e0...",
"created": true
}
}| Pole | Opis |
|---|---|
app_id | App-Id, którym ten lekarz podpisuje wywołania płaszczyzny danych (X-Eternity-App-Id). |
public_key | Publiczna część pary kluczy lekarza. |
private_key | Prywatna część. Pokazywana w tej odpowiedzi i nigdy więcej — zapisz ją, zanim zamkniesz połączenie. |
public_id | Stały publiczny identyfikator lekarza — używaj go wszędzie tam, gdzie wskazuje się właściciela lub dyrektora. |
created | true, gdy konto zostało utworzone przez to wywołanie; false, gdy lekarz miał już konto i zostało ono dopasowane. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Lekarz umieszczony w przychodni; zwrócono dane dostępowe. |
409 | Ten lekarz ma już klucz do tej przychodni albo przychodnia nie została założona przez Ciebie, a jej dyrektor Cię nie zatwierdził — najpierw złóż wniosek o zgodę clinic_membership. |
422 | Błąd walidacji (brak email/phone albo nie zaakceptowano consent.account_creation). |
/v1/platform/organizations/{clinic_public_id}/members/{doctor_public_id}/credentialsOdbierz dane dostępowe działające w imieniu lekarza, który się na to zgodził.▸Uwierzytelnianie: HMAC z Twoim kluczem PLATFORMY.
Przykładowa odpowiedź
{
"payload": {
"public_id": "LSG9w6B2rwAiPoJD",
"app_id": "dcd4895e-550e-424a-9c5d-5206cbce2956",
"public_key": "11fff5d1...",
"private_key": "00604b9b...",
"created": false
}
}| Pole | Opis |
|---|---|
private_key | Pokazywany raz i nigdy więcej. Klucz należy do Ciebie i jest oddzielony od własnego klucza lekarza — gdy lekarz wycofa zgodę, Twój klucz przestanie działać, a jego nie. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Wydano dane dostępowe. |
409 | Lekarz nie zgodził się na przekazanie albo nie możesz działać w imieniu tej przychodni. Komunikat wskazuje, który przypadek zachodzi. |
/v1/platform/consentsPoproś lekarza lub przychodnię o zgodę.▸Uwierzytelnianie: HMAC z Twoim kluczem PLATFORMY.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
kind | tak | string | — | key_handover — trzymanie danych dostępowych działających w imieniu tego lekarza, na co zgodę może wyrazić tylko sam lekarz. clinic_membership — umieszczenie tego lekarza w przychodni, która nie została założona przez Ciebie; decyduje o tym jej dyrektor. |
doctor_public_id | tak | string | — | Lekarz, którego dotyczy wniosek. |
clinic_public_id | warunkowo | string | — | Wymagane dla clinic_membership: przychodnia, do której dyrektora kierujesz wniosek. |
Ciało żądania (JSON)
{
"kind": "clinic_membership",
"doctor_public_id": "LSG9w6B2rwAiPoJD",
"clinic_public_id": "jJlmHf0sgxMT3Gni"
}Przykładowa odpowiedź
{
"payload": {
"public_id": "5G5rBYl0hQvpJuCZ",
"kind": "clinic_membership",
"status": "pending",
"expires_at": 1788973565,
"decided_at": null
}
}| Pole | Opis |
|---|---|
public_id | Z tym identyfikatorem odpytuj endpoint statusu. |
status | pending, dopóki osoba nie odpowie, potem approved lub denied. |
expires_at | Czas Unix w sekundach. Wniosek bez odpowiedzi zamyka się sam, a zgoda przestaje działać w tym samym momencie — uprawnienie nie jest bezterminowe. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Złożono wniosek albo zwrócono ten, który już istniał — ponowne zapytanie nie tworzy drugiego. |
409 | Nikt nie może o tym zdecydować (na przykład przychodnia bez dyrektora). |
422 | Błąd walidacji (nieznany kind albo brak clinic_public_id dla clinic_membership). |
/v1/platform/consents/{public_id}Sprawdź, na jakim etapie jest wniosek o zgodę.▸Uwierzytelnianie: HMAC z Twoim kluczem PLATFORMY.
Przykładowa odpowiedź
{
"payload": {
"public_id": "5G5rBYl0hQvpJuCZ",
"kind": "clinic_membership",
"status": "approved",
"expires_at": 1788973565,
"decided_at": 1787763211
}
}Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | Bieżący stan. |
404 | Nie ma takiego wniosku albo należy on do innego partnera. |
Partner API — dane
Zwierzęta, właściciele, procedury i zdjęcia — codzienna powierzchnia pracy. Każdy zapis jest tu odnotowywany w imieniu lekarza, którego kluczem został podpisany.
- Podpisywane kluczem lekarza, zwracanym jednorazowo — gdy umieszczasz go w przychodni albo odbierasz jego dane dostępowe po wyrażeniu zgody. W nagłówku X-Eternity-App-Id wysyłaj uuid aplikacji tego lekarza.
- Nie może niczego zakładać i przestaje działać w chwili, gdy lekarz cofnie zgodę. Słowniki nie wymagają podpisu w ogóle.
/v1/partner/dictionariesSłowniki referencyjne (wielojęzyczne, z filtrowaniem).▸Uwierzytelnianie: Publiczny (podpis nie jest wymagany). Może być buforowany w CDN dzięki ETag.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
include | nie | string (csv) | — | Klucze słowników do zwrócenia, oddzielone przecinkami; puste → wszystkie. Klucze: species, pet_species_featured, sex, sizes, lost_statuses, other_identifiers, procedure_types, countries, languages, cites. `pet_species_featured` to kanoniczna lista popularnych gatunków z kluczem public_id w formacie UUID — przekaż kod wpisu do POST /animals jako species_public_id. |
q | nie | string | — | Filtruje wpisy po zlokalizowanej nazwie w dowolnym aktywnym języku. |
lang | nie | string | languages | Zwraca nazwy tylko w jednym języku (uk, en, ru, de, es). Domyślnie: wszystkie aktywne. |
Przykładowa odpowiedź
{
"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
}| Pole | Opis |
|---|---|
payload[].key | Klucz słownika. |
payload[].items[].code | Stały identyfikator używany jako wartość w endpointach zapisu. Liczbowy dla większości słowników (species, sex, …); dla pet_species_featured jest to kanoniczny public_id gatunku (UUID) → przekaż go jako species_public_id w POST /animals; dla countries jest to numeryczny kod ISO 3166-1 uzupełniony zerami, jako ciąg znaków (np. "004", "804"); dla languages jest to kod ISO 639-1 (np. "uk"). |
payload[].items[].names | Mapa język → zlokalizowana nazwa. Dla języków bez tłumaczenia używana jest wersja angielska. |
payload[].items[].alpha2 / alpha3 | Tylko dla countries: kody ISO 3166-1 alpha-2 / alpha-3 do wygodnego mapowania. |
payload[].items[].native | Tylko dla languages: nazwa języka w tym właśnie języku (endonim), przydatna w selektorach języka. |
metadata.etag | Odeślij w If-None-Match, aby otrzymać 304, gdy nic się nie zmieniło. |
metadata.languages | Aktywne języki faktycznie obecne w tej kompilacji. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK — zwrócono słowniki. |
304 | Not Modified — Twój If-None-Match pasuje; użyj kopii z pamięci podręcznej. |
/v1/partner/dictionaries/speciesWyszukiwanie gatunków (kanoniczne, według public_id).▸Uwierzytelnianie: Publiczny (podpis nie jest wymagany).
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
q | nie | string | — | Fraza wyszukiwania gatunku (dowolna ranga taksonomiczna, dopasowanie fragmentu + odporność na literówki). Pomiń, aby przeglądać najlepsze dopasowania. Uzupełnia słownik pet_species_featured, który zawiera tylko popularne gatunki. |
Przykładowa odpowiedź
{
"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 }
]
}| Pole | Opis |
|---|---|
payload[].public_id | public_id gatunku — przekaż go jako species_public_id w POST /animals lub do /dictionaries/species/{species_public_id}/breeds. |
payload[].name | Zlokalizowana nazwa gatunku (język żądania, w razie braku — angielski). |
payload[].rank | Ranga taksonomiczna (species, genus, family, …). |
payload[].has_breeds | Czy gatunek ma listę ras. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK — pasujące gatunki. |
/v1/partner/dictionaries/species/{species_public_id}/breedsRasy dla gatunku (kanoniczne, według public_id).▸Uwierzytelnianie: Publiczny (podpis nie jest wymagany).
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
species_public_id | tak | string | — | Segment ścieżki: public_id gatunku (UUID). Znajdziesz go w pet_species_featured lub /dictionaries/species. |
q | nie | string | — | Opcjonalny filtr po nazwie rasy (fragment nazwy, odporny na literówki). |
Przykładowa odpowiedź
{
"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" }
]
}| Pole | Opis |
|---|---|
payload[].public_id | Kanoniczny public_id rasy — przekaż go jako breed_public_id w POST /animals. |
payload[].name | Zlokalizowana nazwa rasy (język żądania, w razie braku — angielski). |
payload[].kind | purebred | mixed | unknown | crossbreed | variety. mixed/unknown/crossbreed to specjalne opcje zastępcze. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK — rasy gatunku (pusta lista dla gatunku bez ras). |
404 | species_public_id nie jest prawidłowym UUID (trasa nie została dopasowana). |
/v1/partner/ownersUtwórz (lub znajdź) właściciela; zwraca globalny identyfikator użytkownika.▸Uwierzytelnianie: HMAC. Dowolny klucz partnera. · X-Eternity-Idempotency-Key wymagany
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
email | warunkowo | string | — | E-mail właściciela. Wymagane jest jedno z pól email/phone — dzięki temu można później skontaktować się z właścicielem lub go uwierzytelnić. |
phone | warunkowo | string | — | Telefon właściciela (E.164). Wymagane jest jedno z pól email/phone. |
first_name | nie | string | — | Imię. |
last_name | nie | string | — | Nazwisko. |
language | nie | string | languages | Preferowany język. |
country | nie | string | countries | Numeryczny kod ISO 3166-1 uzupełniony zerami, jako ciąg znaków (np. "804") — zgodny z kodem ze słownika countries. |
external_owner_id | nie | string | — | Twój własny identyfikator tej osoby. Zapisywany raz, przy pierwszym kontakcie, i nigdy nie nadpisywany — wysyłaj go, aby obie strony mogły później dopasować tę samą osobę. Maks. 128 znaków. |
consent | tak | object | — | Blok zgody (niezmienny zapis audytowy). |
consent.account_creation | tak | bool | — | Musi mieć wartość true — właściciel zgodził się na utworzenie konta. Czas zarejestrowania zgody jest zapisywany po stronie serwera. |
Ciało żądania (JSON)
{
"email": "jane@example.com",
"phone": "+380681234567",
"first_name": "Jane",
"last_name": "Doe",
"language": "uk",
"country": "804",
"external_owner_id": "crm-4471",
"consent": {
"account_creation": true
}
}Przykładowa odpowiedź
{
"payload": {
"user_gid": 90231,
"public_id": "V1StGXR8Z5jd",
"has_account": true,
"email": "jane@example.com",
"phone": null,
"display_hint": "Ол*** К.",
"language": "uk",
"country_id": 804,
"external_owner_id": "crm-4471"
}
}| Pole | Opis |
|---|---|
public_id | Stały publiczny identyfikator właściciela — przekaż go w POST /animals jako owners[].public_id (wersja API >= 2026-07-04). |
user_gid | Starszy liczbowy identyfikator właściciela (dołączanie właściciela w starszych wersjach API). |
has_account | Czy właściciel ma już konto, z którego może korzystać. |
email | E-mail zapisany dla tego właściciela (null, jeśli nieznany). |
phone | Telefon zapisany dla tego właściciela (null, jeśli nieznany). |
display_hint | Zamaskowana nazwa wyświetlana (bez danych osobowych). |
external_owner_id | Identyfikator przesłany nam przez CIEBIE dla tej osoby albo null, jeśli żaden nie został przesłany. Ograniczony do Twojej integracji — nigdy nie zobaczysz, jak tę samą osobę nazywa inny partner. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Created (albo odnaleziono istniejącego właściciela — idempotentnie według email/phone). |
409 | X-Eternity-Idempotency-Key użyty ponownie z innym ciałem albo żądanie jest wciąż przetwarzane. |
422 | Błąd walidacji (brak email/phone albo nie zaakceptowano consent.account_creation). |
/v1/partner/owners/searchZnajdź właściciela po dokładnym adresie e-mail lub numerze telefonu.▸Uwierzytelnianie: HMAC. Dowolny klucz partnera.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
email_or_phone | tak | string | — | Dokładny e-mail lub telefon (jedno pole; e-mail rozpoznawany po formacie). |
Przykładowa odpowiedź
{
"payload": { "user_gid": 90231, "public_id": "V1StGXR8Z5jd", "has_account": true, "email": "jane@example.com", "phone": null, "display_hint": "Ол*** К.", "language": "uk", "country_id": 804, "external_owner_id": "crm-4471" }
}| Pole | Opis |
|---|---|
public_id | Stały publiczny identyfikator właściciela — przekaż go w POST /animals jako owners[].public_id (wersja API >= 2026-07-04). |
user_gid | Starszy liczbowy identyfikator właściciela (dołączanie właściciela w starszych wersjach API). |
email | E-mail zapisany dla tego właściciela (null, jeśli nieznany). |
phone | Telefon zapisany dla tego właściciela (null, jeśli nieznany). |
external_owner_id | Identyfikator przesłany nam przez CIEBIE dla tej osoby albo null, jeśli żaden nie został przesłany. Ograniczony do Twojej integracji — nigdy nie zobaczysz, jak tę samą osobę nazywa inny partner. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | Znaleziono właściciela. |
404 | Brak właściciela z takim email_or_phone. |
422 | email_or_phone jest wymagany. |
/v1/partner/animalsZarejestruj zwierzę (na podstawie czipa).▸Uwierzytelnianie: HMAC. Klucz weterynarza/organizacji. · X-Eternity-Idempotency-Key wymagany
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
species | warunkowo | int | species | Starszy identyfikator gatunku ze słownika. Wymagane jest dokładnie jedno z pól species / species_public_id. |
species_public_id | warunkowo | string | pet_species_featured | Kanoniczny public_id gatunku (UUID) ze słownika pet_species_featured. Wymagane jest dokładnie jedno z pól species / species_public_id; jeśli jest podany, ma pierwszeństwo przed species. |
is_microchip | tak | bool | — | Czy zwierzę jest zaczipowane. true → microchip jest wymagany; false → microchip jest ignorowany, a rejestr nadaje tymczasowy numer WC. |
microchip | warunkowo | string | — | Mikroczip (transponder). Wymagany tylko, gdy is_microchip = true. |
nickname | tak | string | — | Imię zwierzęcia. |
qr_tag | nie | string | — | Numer seryjny paszportu QR do przypisania przy rejestracji. |
owners | nie | array | — | Właściciele; pierwszy zostaje main_owner, pozostali — owners (bez duplikatów). Każdy wpis albo dołącza istniejącego właściciela, ALBO rejestruje nowego inline. |
owners[].public_id | warunkowo | string | — | Tryb dołączania (wersja API >= 2026-07-04): public_id istniejącego właściciela z POST/GET owners. Pomiń, aby zarejestrować właściciela inline. |
owners[].user_gid | warunkowo | int | — | Tryb dołączania (wersje API przed 2026-07-04): starszy liczbowy identyfikator właściciela. Pomiń, aby zarejestrować właściciela inline. |
owners[].email | warunkowo | string | — | Tryb inline: e-mail właściciela. Wymagane jest jedno z pól email/phone, gdy brak public_id/user_gid (upsert — bez duplikatów). |
owners[].phone | warunkowo | string | — | Tryb inline: telefon właściciela (E.164). |
owners[].first_name | nie | string | — | Tryb inline: imię. |
owners[].last_name | nie | string | — | Tryb inline: nazwisko. |
owners[].language | nie | string | languages | Tryb inline: preferowany język. |
owners[].country | nie | string | countries | Tryb inline: numeryczny kod ISO 3166-1 uzupełniony zerami, jako ciąg znaków (np. "804") — zgodny z kodem ze słownika countries. |
owners[].external_owner_id | nie | string | — | Tryb inline: Twój własny identyfikator tej osoby — to samo pole i te same zasady co w POST /owners. |
owners[].consent.account_creation | warunkowo | bool | — | Tryb inline: musi mieć wartość true — właściciel zgodził się na utworzenie konta. Wymagane tylko przy rejestracji inline. |
breed | nie | string | — | Rasa (dowolny tekst). Używana tylko, gdy brak breed_public_id. |
breed_public_id | nie | string | — | Kanoniczny public_id rasy (UUID) z GET /breeds?species_public_id=. Musi należeć do danego gatunku; jeśli jest podany, ma pierwszeństwo przed rasą w postaci dowolnego tekstu. |
color | nie | string | — | Umaszczenie (dowolny tekst — bez słownika). |
gender_id | nie | int | sex | Identyfikator płci ze słownika. |
dob | nie | date | — | Data urodzenia (ISO 8601). |
microchip_date | nie | date | — | Kiedy wszczepiono czip (ISO 8601). |
sterilization | nie | bool | — | Flaga sterylizacji. |
size | nie | int | sizes | Identyfikator rozmiaru ze słownika. |
identifiers | nie | array | — | Dodatkowe identyfikatory oprócz microchip/qr. |
identifiers[].type | tak | int | other_identifiers | Identyfikator typu ze słownika other_identifiers (tatuaż, obrączka, …). |
identifiers[].value | tak | string | — | Wartość identyfikatora. |
identifiers[].added_at | nie | date | — | Kiedy nadano identyfikator (ISO 8601). |
Ciało żądania (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",
"external_owner_id": "crm-4471",
"consent": { "account_creation": true }
}
],
"identifiers": [
{ "type": 3, "value": "TAT-001", "added_at": "2026-05-01T00:00:00+00:00" }
]
}Przykładowa odpowiedź
{ "payload": { "id": "8xK3pQzVnB7rL2qF" } }| Pole | Opis |
|---|---|
id | Niemożliwy do odgadnięcia publiczny identyfikator zwierzęcia (NanoID). Używaj go we wszystkich kolejnych wywołaniach dotyczących zwierzęcia. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Zarejestrowano zwierzę. |
409 | Konflikt X-Eternity-Idempotency-Key (ten sam klucz, inne ciało). |
422 | Błąd walidacji: brak nickname/is_microchip albo brak zarówno species, jak i species_public_id; nieznany species_public_id/breed_public_id albo breed_public_id, który nie należy do danego gatunku; is_microchip=true bez prawidłowego mikroczipa; zduplikowany mikroczip (transponder już zarejestrowany, pole "transponder"); albo właściciel inline bez email/phone lub bez consent.account_creation. |
/v1/partner/animals/by-identifier/{type}/{value}Wyszukiwanie według konkretnego typu identyfikatora. Zawsze tablica.▸Uwierzytelnianie: HMAC. Dowolny klucz partnera.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
type | tak | path enum | — | microchip lub qr_tag. |
value | tak | path string | — | Wartość identyfikatora do wyszukania. |
Przykładowa odpowiedź
{
"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 } }
]
}| Pole | Opis |
|---|---|
payload | Tablica kart zwierząt — zwykle jedna, ale wartość może pasować do kilku. |
species_public_id | Kanoniczny public_id gatunku — ten sam klucz, który przekazujesz jako species_public_id w POST /animals. |
species_name | Nazwa gatunku w języku żądania (w razie braku — po angielsku, a potem nazwa łacińska). |
breed_public_id | Kanoniczny public_id rasy albo null, gdy zwierzę ma tylko rasę w postaci dowolnego tekstu. |
breed_name | Kanoniczna nazwa rasy w języku żądania; null, gdy breed_public_id jest null — wtedy odczytaj `breed`. |
microchip / qr_tag | Aktywne identyfikatory. |
lost_status | "active", gdy zgłoszono zaginięcie, w przeciwnym razie null. |
deceased | True, gdy odnotowano eutanazję/śmierć. |
Uprawnienia
Każdy obiekt zwierzęcia zawiera obiekt abilities, który opisuje, co uwierzytelniony użytkownik partnera może robić z tym zwierzęciem. To pierwsza flaga dostępu; z czasem dojdą kolejne.
| Pole | Opis |
|---|---|
abilities.can_edit | Czy uwierzytelniony użytkownik partnera może edytować to zwierzę — aktualizować jego dane, dodawać zweryfikowane zabiegi i zarządzać zdjęciami. True, gdy użytkownik zarejestrował zwierzę, ma z nim dowolną relację (animal_user_relation) albo jest aktywnym członkiem organizacji, w której rejestrze się znajduje (org_animals). Gdy false, nadal możesz zapisywać zabiegi: są zapisywane jako niezweryfikowane, dopóki właściciel nie zaakceptuje Twojej prośby o dostęp. |
Rozszerzenie (X-Eternity-Expand)
Opcjonalny nagłówek z tablicą JSON kluczy rozszerzeń (np. ["owners"]). Każdy żądany klucz osadza dodatkowe pole w każdym obiekcie zwierzęcia w odpowiedzi; pomiń nagłówek, aby otrzymać zwykłą kartę. Nieznane klucze są odrzucane z 422.
| Klucz | Dodaje | Opis |
|---|---|---|
owners | owners[] | Właściciele zwierzęcia — główny właściciel oraz ewentualni współwłaściciele — każdy z danymi kontaktowymi i flagą is_main_owner. Dostępne tylko w Partner API. |
"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",
"external_owner_id": "crm-4471",
"is_main_owner": true
}
]| Pole | Opis |
|---|---|
owners[].public_id | Stały publiczny identyfikator właściciela — przekaż go w POST /animals jako owners[].public_id (wersja API >= 2026-07-04). |
owners[].user_gid | Starszy liczbowy identyfikator właściciela (dołączanie właściciela w starszych wersjach API). |
owners[].has_account | Czy właściciel ma już konto, z którego może korzystać. |
owners[].email | E-mail zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].phone | Telefon zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].display_hint | Zamaskowana nazwa wyświetlana (bez danych osobowych). |
owners[].language | Preferowany język. |
owners[].country_id | Numeryczny kod ISO 3166-1 uzupełniony zerami, jako ciąg znaków (np. "804"). |
owners[].external_owner_id | Identyfikator przesłany nam przez CIEBIE dla tej osoby albo null, jeśli żaden nie został przesłany. Ograniczony do Twojej integracji — nigdy nie zobaczysz, jak tę samą osobę nazywa inny partner. |
owners[].is_main_owner | true dla głównego właściciela (animal_user_relation typu main_owner); false dla współwłaścicieli. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK — tablica (może być pusta). |
/v1/partner/animals/by-identifier/{value}Wyszukiwanie po wszystkich typach identyfikatorów naraz. Zawsze tablica.▸Uwierzytelnianie: HMAC. Dowolny klucz partnera.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
value | tak | path string | — | Wartość identyfikatora; wyszukiwana w microchip i qr_tag. |
Przykładowa odpowiedź
{ "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 } ] }| Pole | Opis |
|---|---|
species_public_id / breed_public_id | Kanoniczne klucze — te same, które przyjmuje POST /animals. breed_public_id jest null, dopóki zwierzę ma tylko rasę w postaci dowolnego tekstu. |
species_name / breed_name | Nazwy w języku żądania (w razie braku — po angielsku, a potem nazwa łacińska/kanoniczna). |
Uprawnienia
Każdy obiekt zwierzęcia zawiera obiekt abilities, który opisuje, co uwierzytelniony użytkownik partnera może robić z tym zwierzęciem. To pierwsza flaga dostępu; z czasem dojdą kolejne.
| Pole | Opis |
|---|---|
abilities.can_edit | Czy uwierzytelniony użytkownik partnera może edytować to zwierzę — aktualizować jego dane, dodawać zweryfikowane zabiegi i zarządzać zdjęciami. True, gdy użytkownik zarejestrował zwierzę, ma z nim dowolną relację (animal_user_relation) albo jest aktywnym członkiem organizacji, w której rejestrze się znajduje (org_animals). Gdy false, nadal możesz zapisywać zabiegi: są zapisywane jako niezweryfikowane, dopóki właściciel nie zaakceptuje Twojej prośby o dostęp. |
Rozszerzenie (X-Eternity-Expand)
Opcjonalny nagłówek z tablicą JSON kluczy rozszerzeń (np. ["owners"]). Każdy żądany klucz osadza dodatkowe pole w każdym obiekcie zwierzęcia w odpowiedzi; pomiń nagłówek, aby otrzymać zwykłą kartę. Nieznane klucze są odrzucane z 422.
| Klucz | Dodaje | Opis |
|---|---|---|
owners | owners[] | Właściciele zwierzęcia — główny właściciel oraz ewentualni współwłaściciele — każdy z danymi kontaktowymi i flagą is_main_owner. Dostępne tylko w Partner API. |
"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",
"external_owner_id": "crm-4471",
"is_main_owner": true
}
]| Pole | Opis |
|---|---|
owners[].public_id | Stały publiczny identyfikator właściciela — przekaż go w POST /animals jako owners[].public_id (wersja API >= 2026-07-04). |
owners[].user_gid | Starszy liczbowy identyfikator właściciela (dołączanie właściciela w starszych wersjach API). |
owners[].has_account | Czy właściciel ma już konto, z którego może korzystać. |
owners[].email | E-mail zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].phone | Telefon zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].display_hint | Zamaskowana nazwa wyświetlana (bez danych osobowych). |
owners[].language | Preferowany język. |
owners[].country_id | Numeryczny kod ISO 3166-1 uzupełniony zerami, jako ciąg znaków (np. "804"). |
owners[].external_owner_id | Identyfikator przesłany nam przez CIEBIE dla tej osoby albo null, jeśli żaden nie został przesłany. Ograniczony do Twojej integracji — nigdy nie zobaczysz, jak tę samą osobę nazywa inny partner. |
owners[].is_main_owner | true dla głównego właściciela (animal_user_relation typu main_owner); false dla współwłaścicieli. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK — tablica (może być pusta). |
/v1/partner/animals/by-ownerWyszukiwanie zwierząt po kontakcie właściciela. Zawsze tablica.▸Uwierzytelnianie: HMAC. Dowolny klucz partnera.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
email_or_phone | tak | string | — | Dokładny e-mail lub telefon właściciela (jedno pole; e-mail rozpoznawany po formacie). Na podstawie telefonu najpierw ustalany jest właściciel. |
Przykładowa odpowiedź
{ "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 } ] }| Pole | Opis |
|---|---|
species_public_id / breed_public_id | Kanoniczne klucze — te same, które przyjmuje POST /animals. breed_public_id jest null, dopóki zwierzę ma tylko rasę w postaci dowolnego tekstu. |
species_name / breed_name | Nazwy w języku żądania (w razie braku — po angielsku, a potem nazwa łacińska/kanoniczna). |
Uprawnienia
Każdy obiekt zwierzęcia zawiera obiekt abilities, który opisuje, co uwierzytelniony użytkownik partnera może robić z tym zwierzęciem. To pierwsza flaga dostępu; z czasem dojdą kolejne.
| Pole | Opis |
|---|---|
abilities.can_edit | Czy uwierzytelniony użytkownik partnera może edytować to zwierzę — aktualizować jego dane, dodawać zweryfikowane zabiegi i zarządzać zdjęciami. True, gdy użytkownik zarejestrował zwierzę, ma z nim dowolną relację (animal_user_relation) albo jest aktywnym członkiem organizacji, w której rejestrze się znajduje (org_animals). Gdy false, nadal możesz zapisywać zabiegi: są zapisywane jako niezweryfikowane, dopóki właściciel nie zaakceptuje Twojej prośby o dostęp. |
Rozszerzenie (X-Eternity-Expand)
Opcjonalny nagłówek z tablicą JSON kluczy rozszerzeń (np. ["owners"]). Każdy żądany klucz osadza dodatkowe pole w każdym obiekcie zwierzęcia w odpowiedzi; pomiń nagłówek, aby otrzymać zwykłą kartę. Nieznane klucze są odrzucane z 422.
| Klucz | Dodaje | Opis |
|---|---|---|
owners | owners[] | Właściciele zwierzęcia — główny właściciel oraz ewentualni współwłaściciele — każdy z danymi kontaktowymi i flagą is_main_owner. Dostępne tylko w Partner API. |
"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",
"external_owner_id": "crm-4471",
"is_main_owner": true
}
]| Pole | Opis |
|---|---|
owners[].public_id | Stały publiczny identyfikator właściciela — przekaż go w POST /animals jako owners[].public_id (wersja API >= 2026-07-04). |
owners[].user_gid | Starszy liczbowy identyfikator właściciela (dołączanie właściciela w starszych wersjach API). |
owners[].has_account | Czy właściciel ma już konto, z którego może korzystać. |
owners[].email | E-mail zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].phone | Telefon zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].display_hint | Zamaskowana nazwa wyświetlana (bez danych osobowych). |
owners[].language | Preferowany język. |
owners[].country_id | Numeryczny kod ISO 3166-1 uzupełniony zerami, jako ciąg znaków (np. "804"). |
owners[].external_owner_id | Identyfikator przesłany nam przez CIEBIE dla tej osoby albo null, jeśli żaden nie został przesłany. Ograniczony do Twojej integracji — nigdy nie zobaczysz, jak tę samą osobę nazywa inny partner. |
owners[].is_main_owner | true dla głównego właściciela (animal_user_relation typu main_owner); false dla współwłaścicieli. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK — tablica (pusta, jeśli przy wyszukiwaniu po samym telefonie właściciel nie ma zapisanego e-maila). |
422 | email_or_phone jest wymagany. |
/v1/partner/animals/{id}Pełna karta zwierzęcia.▸Uwierzytelnianie: HMAC. Dowolny klucz partnera.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
id | tak | path string | — | Publiczny identyfikator zwierzęcia (NanoID). |
Przykładowa odpowiedź
{ "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 } } }| Pole | Opis |
|---|---|
species_public_id | Kanoniczny public_id gatunku — ten sam klucz, który przekazujesz jako species_public_id w POST /animals. |
species_name | Nazwa gatunku w języku żądania (w razie braku — po angielsku, a potem nazwa łacińska). |
breed_public_id | Kanoniczny public_id rasy albo null, gdy zwierzę ma tylko rasę w postaci dowolnego tekstu. |
breed_name | Kanoniczna nazwa rasy w języku żądania; null, gdy breed_public_id jest null — wtedy odczytaj `breed`. |
Uprawnienia
Każdy obiekt zwierzęcia zawiera obiekt abilities, który opisuje, co uwierzytelniony użytkownik partnera może robić z tym zwierzęciem. To pierwsza flaga dostępu; z czasem dojdą kolejne.
| Pole | Opis |
|---|---|
abilities.can_edit | Czy uwierzytelniony użytkownik partnera może edytować to zwierzę — aktualizować jego dane, dodawać zweryfikowane zabiegi i zarządzać zdjęciami. True, gdy użytkownik zarejestrował zwierzę, ma z nim dowolną relację (animal_user_relation) albo jest aktywnym członkiem organizacji, w której rejestrze się znajduje (org_animals). Gdy false, nadal możesz zapisywać zabiegi: są zapisywane jako niezweryfikowane, dopóki właściciel nie zaakceptuje Twojej prośby o dostęp. |
Rozszerzenie (X-Eternity-Expand)
Opcjonalny nagłówek z tablicą JSON kluczy rozszerzeń (np. ["owners"]). Każdy żądany klucz osadza dodatkowe pole w każdym obiekcie zwierzęcia w odpowiedzi; pomiń nagłówek, aby otrzymać zwykłą kartę. Nieznane klucze są odrzucane z 422.
| Klucz | Dodaje | Opis |
|---|---|---|
owners | owners[] | Właściciele zwierzęcia — główny właściciel oraz ewentualni współwłaściciele — każdy z danymi kontaktowymi i flagą is_main_owner. Dostępne tylko w Partner API. |
"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",
"external_owner_id": "crm-4471",
"is_main_owner": true
}
]| Pole | Opis |
|---|---|
owners[].public_id | Stały publiczny identyfikator właściciela — przekaż go w POST /animals jako owners[].public_id (wersja API >= 2026-07-04). |
owners[].user_gid | Starszy liczbowy identyfikator właściciela (dołączanie właściciela w starszych wersjach API). |
owners[].has_account | Czy właściciel ma już konto, z którego może korzystać. |
owners[].email | E-mail zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].phone | Telefon zapisany dla tego właściciela (null, jeśli nieznany). |
owners[].display_hint | Zamaskowana nazwa wyświetlana (bez danych osobowych). |
owners[].language | Preferowany język. |
owners[].country_id | Numeryczny kod ISO 3166-1 uzupełniony zerami, jako ciąg znaków (np. "804"). |
owners[].external_owner_id | Identyfikator przesłany nam przez CIEBIE dla tej osoby albo null, jeśli żaden nie został przesłany. Ograniczony do Twojej integracji — nigdy nie zobaczysz, jak tę samą osobę nazywa inny partner. |
owners[].is_main_owner | true dla głównego właściciela (animal_user_relation typu main_owner); false dla współwłaścicieli. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK. |
404 | Nie znaleziono zwierzęcia. |
/v1/partner/animals/{id}Aktualizuj zmienialne pola / oznacz jako zmarłe.▸Uwierzytelnianie: HMAC. Właściciel LUB weterynarz z aktywnym powiązaniem ze zwierzęciem. · X-Eternity-Idempotency-Key wymagany
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
nickname | nie | string | — | Nowe imię. |
color | nie | string | — | Nowe umaszczenie (dowolny tekst — bez słownika). |
sterilization_status | nie | bool | — | Ustaw flagę sterylizacji. |
deceased | nie | bool | — | true → oznacz zwierzę jako zmarłe. |
Ciało żądania (JSON)
{
"nickname": "Барсік",
"color": "black",
"sterilization_status": true,
"deceased": false
}Przykładowa odpowiedź
204 No Content
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
204 | Zaktualizowano. |
403 | Brak dostępu do tego zwierzęcia — poproś o niego (POST /v1/partner/animals/{id}/access-request) i ponów próbę, gdy właściciel wyrazi zgodę. |
409 | Konflikt X-Eternity-Idempotency-Key. |
422 | Błąd walidacji. |
/v1/partner/animals/{id}/access-requestPoproś właściciela zwierzęcia o przyznanie Ci dostępu.▸Uwierzytelnianie: HMAC. Klucz weterynarza/organizacji. · X-Eternity-Idempotency-Key wymagany
Zapisanie zabiegów bez dostępu tworzy tę samą prośbę albo używa istniejącej. Decyzja właściciela obejmuje wszystkie niezweryfikowane zabiegi zapisane przez Ciebie dla zwierzęcia: akceptacja daje Ci dostęp i je weryfikuje; odrzucenie je usuwa, a nowe zabiegi nie są przyjmowane, dopóki odrzucenie nie wygaśnie. Akceptacja po odrzuceniu przywraca usunięte zabiegi.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
id | tak | path string | — | Publiczny identyfikator zwierzęcia (NanoID). |
Przykładowa odpowiedź
{
"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
}
}| Pole | Opis |
|---|---|
status | "granted" — masz już dostęp, prośba nie została utworzona; "pending" — czeka na właściciela; "denied" — właściciel odmówił (może zmienić decyzję, dopóki prośba nie wygaśnie). |
requested_at | Kiedy złożono prośbę (null, gdy status="granted"). |
expires_at | Kiedy prośba wygasa i możesz poprosić ponownie (null, gdy status="granted"). |
retry_after_seconds | Liczba sekund, po której możesz ponownie poprosić o dostęp do tego samego zwierzęcia (0, gdy ten czas minie; null, gdy status="granted"). |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Utworzono nową prośbę o dostęp — właściciel został powiadomiony e-mailem. |
200 | Nie utworzono nowej prośby: masz już dostęp (status "granted") albo istnieje już aktywna prośba (status "pending"/"denied") — odczekaj retry_after_seconds, zanim poprosisz ponownie. |
404 | Nie znaleziono zwierzęcia. |
/v1/partner/animals/{id}/access-requestSprawdź, czy Twój wniosek o dostęp został zatwierdzony.▸Uwierzytelnianie: HMAC. Klucz weterynarza/organizacji.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
id | tak | path string | — | Publiczny identyfikator zwierzęcia (NanoID). |
Przykładowa odpowiedź
{
"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
}
}| Pole | Opis |
|---|---|
status | "granted" — dostęp został zaakceptowany i jest aktywny; "pending" — czeka na właściciela; "denied" — prośba odrzucona; "none" — brak aktywnej prośby. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK. |
404 | Nie znaleziono zwierzęcia. |
/v1/partner/animals/{id}/proceduresZapisz zabiegi; otwiera wizytę — albo, bez dostępu do zwierzęcia, zapisuje je jako niezweryfikowane. Pojedynczy obiekt lub tablica.▸Uwierzytelnianie: HMAC. Klucz weterynarza/organizacji. · X-Eternity-Idempotency-Key wymagany
Bez dostępu do zwierzęcia (abilities.can_edit to false) zabiegi i tak są zapisywane, ale jako niezweryfikowane: wizyta nie jest otwierana (appointment_id to null), w zwierzęciu jeszcze nic się nie zmienia (mikroczip, adresówka, sterylizacja czy śmierć czekają na właściciela), a prośba o dostęp dla organizacji Twojego klucza zostaje utworzona lub użyta ponownie. Właściciel dostaje e-mail i jedną decyzją rozstrzyga o wszystkich niezweryfikowanych zabiegach zapisanych przez Ciebie dla zwierzęcia: akceptacja daje Ci dostęp i je weryfikuje — wtedy też są wprowadzane ich zmiany w zwierzęciu; odrzucenie je usuwa. Dopóki odrzucenie obowiązuje, nowe zabiegi dla zwierzęcia są odrzucane z 403.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
(body) | tak | object | array | — | Pojedynczy obiekt zabiegu lub ich tablica (≤100). |
type | tak | int | procedure_types | Identyfikator zabiegu w katalogu: 10 szczepienie, 20 szczepienie przeciw wściekliźnie, 30 identyfikacja transponderem, 40 identyfikacja adresówką QR, 50 odrobaczanie, 60 sterylizacja, 70 eutanazja / zaświadczenie o śmierci. |
occurred_at | tak | datetime | — | Kiedy wykonano (ISO 8601). |
summary | nie | string | — | Notatka w postaci dowolnego tekstu. |
revaccination_date | nie | date | — | Nadpisuje datę następnego szczepienia (szczepienia). |
type_specific_payload | nie | object | — | Pola zależne od typu — walidowane po stronie serwera: 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*}. Dla typu 30: jeśli zwierzę ma już mikroczip, zostaje on zachowany — nowy numer jest zapisywany jako dodatkowy identyfikator (other_identifiers typ 11) zamiast zastępować czip. |
Ciało żądania (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"
}
}
]Przykładowa odpowiedź
{
"payload": {
"appointment_id": null,
"procedures": [
{ "id": 99001, "animal_id": "8xK3pQzVnB7rL2qF", "visit_id": null, "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" },
"verification_status": "unverified", "verified_at": null }
],
"access_request": {
"status": "pending",
"requested_at": "2026-05-30T08:00:00+00:00",
"expires_at": "2026-06-06T08:00:00+00:00",
"retry_after_seconds": 604800
}
}
}| Pole | Opis |
|---|---|
appointment_id | Wizyta otwarta dla tej partii; null, gdy partię zapisano jako niezweryfikowaną (bez dostępu). |
procedures[] | Zapisane zabiegi — ta sama karta co w GET list/show. |
procedures[].id | Identyfikator wpisu zabiegu. |
procedures[].type | Liczbowy identyfikator typu (słownik procedure_types). |
procedures[].type_specific_payload | Zapisane dane specyficzne dla typu. |
procedures[].verification_status | "verified" — zapisany z dostępem do zwierzęcia lub potwierdzony przez właściciela; "unverified" — zapisany bez dostępu, czeka na decyzję właściciela. |
procedures[].verified_at | Kiedy właściciel potwierdził zabieg; null, gdy zapisano go z dostępem albo nadal jest niezweryfikowany. |
access_request | Prośba o dostęp, w ramach której zapisano niezweryfikowaną partię — ten sam obiekt co w GET /v1/partner/animals/{id}/access-request. null, gdy masz dostęp do zwierzęcia. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Zapisano: zweryfikowane z otwarciem wizyty albo — bez dostępu — niezweryfikowane w ramach prośby o dostęp. |
403 | Właściciel odrzucił Twoją prośbę o dostęp do tego zwierzęcia i odrzucenie nadal obowiązuje — nowe zabiegi są odrzucane, dopóki nie wygaśnie. |
404 | Nie znaleziono zwierzęcia. |
409 | Konflikt X-Eternity-Idempotency-Key albo adresówka QR (typ 40) jest już przypisana do zwierzęcia. |
422 | Nieobsługiwany typ, brak occurred_at lub brak pól specyficznych dla typu. |
/v1/partner/animals/{id}/proceduresLista zabiegów zwierzęcia. Zawsze tablica.▸Uwierzytelnianie: HMAC. Klucz weterynarza/organizacji.
Zwraca zweryfikowane zabiegi oraz niezweryfikowane zapisane przez Ciebie. Niezweryfikowane zabiegi innych weterynarzy nie są pokazywane.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
type | nie | int | procedure_types | Filtr po identyfikatorze zabiegu w katalogu. |
since | nie | datetime | — | Tylko od tego momentu (włącznie). |
until | nie | datetime | — | Tylko do tego momentu (włącznie). |
Przykładowa odpowiedź
{
"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" },
"verification_status": "verified", "verified_at": null }
]
}| Pole | Opis |
|---|---|
type | Identyfikator zabiegu w katalogu (słownik procedure_types). |
visit_id | Wizyta, w ramach której zapisano zabieg. |
type_specific_payload | Pola zależne od typu. |
verification_status | "verified" — zapisany z dostępem do zwierzęcia lub potwierdzony przez właściciela; "unverified" — zapisany bez dostępu, czeka na decyzję właściciela. |
verified_at | Kiedy właściciel potwierdził zabieg; null, gdy zapisano go z dostępem albo nadal jest niezweryfikowany. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK — tablica (może być pusta). |
404 | Nie znaleziono zwierzęcia. |
/v1/partner/procedures/{id}Pojedynczy zabieg.▸Uwierzytelnianie: HMAC. Klucz weterynarza/organizacji.
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
id | tak | path int | — | Identyfikator wpisu zabiegu. |
Przykładowa odpowiedź
{
"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" },
"verification_status": "verified", "verified_at": "2026-05-31T10:00:00+00:00"
}
}Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
200 | OK. |
404 | Nie znaleziono zabiegu — także niezweryfikowanego zabiegu innego weterynarza. |
/v1/partner/animals/{id}/photosPrześlij zdjęcie (multipart). Właściciel lub weterynarz z powiązaniem.▸Uwierzytelnianie: HMAC + multipart/form-data. Właściciel LUB weterynarz z powiązaniem. · X-Eternity-Idempotency-Key wymagany
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
file | tak | file | — | Plik obrazu. Maks. 8 MB na zdjęcie (konfiguracja partner.photos.max_single_mb). |
kind | nie | enum | — | avatar | gallery | nose_print. avatar ustawia zdjęcie główne. Domyślnie gallery. |
Przykładowa odpowiedź
{ "payload": { "id": 33015 } }| Pole | Opis |
|---|---|
id | Identyfikator nowego zdjęcia. |
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
201 | Przesłano. |
403 | Brak dostępu do tego zwierzęcia — poproś o niego (POST /v1/partner/animals/{id}/access-request) i ponów próbę, gdy właściciel wyrazi zgodę. |
422 | Nieprawidłowy plik lub plik większy niż 8 MB (zmniejsz rozmiar / obniż jakość). |
413 | Całe żądanie przekracza 15 MB. |
/v1/partner/animals/{id}/photos/{photoId}Miękkie usunięcie zdjęcia.▸Uwierzytelnianie: HMAC. Właściciel LUB weterynarz z powiązaniem. · X-Eternity-Idempotency-Key wymagany
Pola żądania
| Pole | Wym. | Typ | Słownik | Opis |
|---|---|---|---|---|
id | tak | path string | — | Publiczny identyfikator zwierzęcia (NanoID). |
photoId | tak | path int | — | Identyfikator zdjęcia. |
Przykładowa odpowiedź
204 No Content
Statusy odpowiedzi
| Status | Znaczenie |
|---|---|
204 | Usunięto. |
403 | Brak dostępu do tego zwierzęcia — poproś o niego (POST /v1/partner/animals/{id}/access-request) i ponów próbę, gdy właściciel wyrazi zgodę. |