{"eyebrow":"v2 · för utvecklare","choose_lead":"Två API:er med var sin inloggningsmodell. Välj efter hur er tjänst används.","footer_links":true,"title":"Vetmanager API","lead":"Ger partners tillgång till veterinärpraktikernas djurägare, djur, artiklar, onlinebokning och journal i Vetmanager — alltid med praktikens uttryckliga godkännande och bara den åtkomst integrationen behöver.","note":"Den här sidan förklarar upplägget. Det fullständiga kontraktet — fältnamn, scheman, exakta felsvar — står i OpenAPI-specarna. Vid konflikt är det de filerna som gäller.","apis":[{"key":"partner","name":"Partner-API","spec":"v2_partner","for_whom":"En integration som arbetar i bakgrunden, till exempel en bokningstjänst, en synk av djurägarregistret eller en tjänst som skickar in journaltext. Ingen veterinär loggar in i er app via Vetmanager.","auth":"OAuth 2.0 Client Credentials + headern X-Practice-Token per praktik.","steps":[{"title":"Registrera er som partner","text":"Ni accepterar partneravtalet, beskriver tjänsten och svarar på frågor om dataskydd, informationssäkerhet och AI-användning. Ansökan signeras med BankID eller FrejaEID."},{"title":"Bli godkända","text":"Vetmanager granskar ansökan. När den är godkänd får ni client_id och client_secret med de scopes ni ansökt om."},{"title":"Praktiken aktiverar er","text":"Varje praktik aktiverar er själv i Vetmanager och godkänner de scopes integrationen behöver. Utan det kommer ni inte åt praktiken, hur giltigt ert token än är."},{"title":"Hämta ett access-token","text":"Tokenet gäller i två timmar. Hämta ett nytt när det gått ut.","call":"POST /oauth/token"},{"title":"Hämta praktikerna","text":"Svaret har ett practice_token per praktik som aktiverat er. Det skickas som X-Practice-Token i allt som gäller den praktiken.","call":"GET /api/v2/practices"},{"title":"Läs och skriv","text":"Läs djurägare, djur, artiklar, personal, förbrukningar och fakturor med cursor-paginering och deltasynk på updated_at. Skapa besök med journaltext med POST /api/v2/resons.","call":"GET /api/v2/clients · GET /api/v2/animals · POST /api/v2/resons"},{"title":"Boka","text":"Med read:availability och write:bookings ser ni praktikens lediga onlinetider och kan boka dem. Djurägaren matchas på personnummer inom praktiken, eller skapas, och bokningen sköts sedan som en vanlig onlinebokning.","call":"GET /api/v2/available_times · POST /api/v2/vet_visits"},{"title":"Koppla en växel","text":"Växlar rapporterar samtal, så att receptionen ser vem som ringer (write:calls), och skriver anteckningar i djurägarens kontaktjournal (write:journal).","call":"POST /api/v2/calls · POST /api/v2/animals/{id}/notes"}],"spec_url":"https://vetmanager.se/api/docs/v2_partner.yaml","endpoints":[{"method":"GET","path":"/api/v2/practices","summary":"Lista praktikerna som har aktiverat er","scopes":[]},{"method":"GET","path":"/api/v2/clients","summary":"Lista djurägare","scopes":["read:contacts"]},{"method":"GET","path":"/api/v2/clients/{id}","summary":"Hämta en djurägare","scopes":["read:contacts"]},{"method":"GET","path":"/api/v2/animals","summary":"Lista djur","scopes":["read:contacts"]},{"method":"GET","path":"/api/v2/animals/{id}","summary":"Hämta ett djur","scopes":["read:contacts"]},{"method":"GET","path":"/api/v2/articles","summary":"Lista artiklar","scopes":["read:articles"]},{"method":"GET","path":"/api/v2/articles/{id}","summary":"Hämta en artikel","scopes":["read:articles"]},{"method":"GET","path":"/api/v2/farm_admin_contacts","summary":"Lista personal","scopes":["read:calendar"]},{"method":"GET","path":"/api/v2/farm_admin_contacts/{id}","summary":"Hämta en person i personalen","scopes":["read:calendar"]},{"method":"POST","path":"/api/v2/resons","summary":"Skapa ett besök med journaltext","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/available_times/first","summary":"Första lediga tid för ett djurslag, hos alla era praktiker","scopes":["read:availability"]},{"method":"GET","path":"/api/v2/vet_visit_types","summary":"Besökstyper ni kan boka hos praktiken","scopes":["read:availability"]},{"method":"GET","path":"/api/v2/plants","summary":"Praktikens aktiva anläggningar","scopes":["read:availability"]},{"method":"GET","path":"/api/v2/available_times","summary":"Lediga tider för en besökstyp hos praktiken","scopes":["read:availability"]},{"method":"GET","path":"/api/v2/vet_visits","summary":"Era egna bokningar hos praktiken","scopes":["write:bookings"]},{"method":"POST","path":"/api/v2/vet_visits","summary":"Boka en tid","scopes":["write:bookings"]},{"method":"PATCH","path":"/api/v2/vet_visits/{id}","summary":"Uppdatera anamnesen på en egen bokning","scopes":["write:bookings"]},{"method":"GET","path":"/api/v2/consumptions","summary":"Lista förbrukningar","scopes":["read:economy"]},{"method":"GET","path":"/api/v2/consumptions/{id}","summary":"Hämta en förbrukning","scopes":["read:economy"]},{"method":"GET","path":"/api/v2/invoices","summary":"Lista fakturor","scopes":["read:economy"]},{"method":"GET","path":"/api/v2/invoices/{id}","summary":"Hämta en faktura","scopes":["read:economy"]},{"method":"POST","path":"/api/v2/calls","summary":"Rapportera ett samtal","scopes":["write:calls"]},{"method":"POST","path":"/api/v2/animals/{id}/notes","summary":"Skriv en journalanteckning på ett djur","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/breeds","summary":"Lista raser","scopes":[]},{"method":"GET","path":"/api/v2/breeds/{id}","summary":"Hämta en ras","scopes":[]},{"method":"GET","path":"/api/v2/sales_statistics","summary":"Försäljningsstatistik för en period","scopes":["read:economy","read:contacts"]}]},{"key":"scribe","name":"Scribe-API","spec":"v2_scribe","for_whom":"En app som veterinären använder under besöket, till exempel AI-diktering. Veterinären startar appen från ett besök i Vetmanager, eller öppnar den direkt, och appen skriver tillbaka till journalen.","auth":"OAuth 2.0 Authorization Code (OIDC) — veterinären loggar in, tokenet binds till ett besök.","steps":[{"title":"Registrera er och bli godkända","text":"Samma registrering och granskning som för partner-API:t. Ni anger era redirect-URI:er, och Vetmanager lägger upp den launch_url som knappen i besöket ska leda till."},{"title":"Veterinären startar er app","text":"En knapp i besöket skickar veterinären till er launch_url med reson och return_url. Starten gäller i tio minuter och bara för den veterinär som klickade."},{"title":"Kör inloggningen","text":"Standard Authorization Code mot /oauth/authorize med reson_id. Veterinären är redan inloggad, så det märks knappt. Tokenet som utfärdas är bundet till just det besöket.","call":"GET /oauth/authorize"},{"title":"Hämta besöket","text":"Djur, djurägare och ansvarig veterinär, som underlag för er app.","call":"GET /api/v2/scribe/resons/{id}"},{"title":"Skriv tillbaka","text":"Fyll på anamnes, status och hemråd, skapa AI-anteckningen och lägg till diagnoser och förbrukningar. Allt läggs till — inget som veterinären skrivit skrivs över.","call":"PATCH /api/v2/scribe/resons/{id} · POST /api/v2/scribe/resons/{id}/events"}],"spec_url":"https://vetmanager.se/api/docs/v2_scribe.yaml","endpoints":[{"method":"POST","path":"/api/v2/scribe/resons","summary":"Skapa en besöksorsak utan start från besöket","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/scribe/clients","summary":"Sök bland praktikens djurägare","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/scribe/clients/{id}","summary":"Hämta en djurägare (kräver read:contacts hos praktiken)","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/scribe/animals","summary":"Sök bland praktikens djur","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/scribe/animals/{id}","summary":"Hämta ett djur (kräver read:contacts hos praktiken)","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/scribe/resons/{id}","summary":"Hämta besöket med djur och djurägare","scopes":["read:journal","write:journal"]},{"method":"PATCH","path":"/api/v2/scribe/resons/{id}","summary":"Fyll på besökets kliniska fält","scopes":["write:journal"]},{"method":"POST","path":"/api/v2/scribe/resons/{id}/events","summary":"Skapa AI-anteckningen på besöket","scopes":["write:journal"]},{"method":"POST","path":"/api/v2/scribe/resons/{id}/diagnoses","summary":"Lägg till en diagnos på besöket","scopes":["write:journal"]},{"method":"POST","path":"/api/v2/scribe/events/{event_id}/consumptions","summary":"Lägg till en förbrukning på AI-anteckningen","scopes":["write:journal"]},{"method":"GET","path":"/api/v2/scribe/articles","summary":"Lista praktikens artiklar","scopes":["read:articles"]}]}],"concepts":{"title":"Så hänger det ihop","lead":"Fält- och parameternamn är på engelska — det är själva API-kontraktet. Så här motsvarar de orden i Vetmanager. Vissa begrepp kan kännas märkliga, men Vetmanager är sprunget ur Horsemanager, ett system för hästgårdar.","terms":[{"term":"practice","meaning":"Praktiken — veterinärkliniken eller djursjukhuset som använder Vetmanager och har aktiverat er."},{"term":"client","meaning":"Djurägaren. Kan vara en privatperson eller ett företag."},{"term":"animal","meaning":"Djuret. animal_kind anger djurslaget, till exempel 13 häst, 51 hund och 52 katt. Se SJVs baslitor. Det kan förekomma att animal kallas horse."},{"term":"reson","meaning":"Besöksorsaken — ett djurs del av ett besök, med anamnes, status, hemråd och journalanteckningar."},{"term":"assignment","meaning":"Besöket. Ett besök kan ha flera djur och flera besöksorsaker."},{"term":"vet_visit","meaning":"Bokningen i kalendern, innan besöket har ägt rum."},{"term":"farm_admin_contact","meaning":"En person i praktikens personal. Det är den man bokar mot och anger som ansvarig."},{"term":"plant","meaning":"Anläggningen — platsen där praktiken tar emot."}]},"auth":{"title":"Autentisering och behörighet","lead":"Tre saker måste stämma för att ett anrop ska gå igenom. Ett giltigt token räcker inte ensamt.","layers":[{"title":"Partnern är godkänd och aktiv","text":"Ett avstängt eller avslaget partnerkonto stoppas i varje anrop, oavsett token."},{"title":"Tokenet har scopet","text":"Scopen bestäms när ni godkänns, och begärs när tokenet hämtas."},{"title":"Praktiken har godkänt scopet","text":"Varje praktik godkänner själv vilka scopes ni får använda hos just den. Praktiken kan stänga av er när som helst."}],"journal_note":"Journaltext lämnas aldrig ut till en partner. Veterinärjournaler kan innehålla uppgifter som omfattas av tystnadsplikt. Ni kan skriva journal, och scribe-appar kan läsa det besök de är bundna till."},"conventions":{"title":"Konventioner","items":[{"title":"Fel","text":"Alla fel är application/problem+json (RFC 9457). Grena på status och på code där den finns, aldrig på detail — det är en läsbar text på svenska som kan ändras."},{"title":"Listor","text":"Cursor-paginering med first/after och last/before. Svaret har page_info och färdiga länkar till nästa och föregående sida."},{"title":"Filter och sortering","text":"fält__operator=värde, till exempel updated_at__gte=2026-10-01T00:00:00+02:00. Sortera med ordering=-updated_at. Okänt fält eller okänd operator ger 400 i stället för att ignoreras."},{"title":"Idempotens","text":"Anrop som skapar något kräver headern Idempotency-Key. Samma nyckel och samma body inom 24 timmar ger det första svaret i stället för en dubblett."},{"title":"Tider","text":"ISO 8601 med offset, i svensk lokaltid (Europe/Stockholm)."},{"title":"Ingen testkonsol","text":"Det finns ingen \"try it out\" mot produktion. Testa mot en praktik som har aktiverat er, i samråd med praktiken."}]}}