Vurdering
Teknisk oversikt
Partner API er et server-til-server REST-API over postene kundene deres allerede har i Visena — personer, selskaper, oppdrag, aktiviteter og dokumenter. Én OAuth 2.0-legitimasjon, ni ressurser under én versjonert kontrakt, og skrivinger som går gjennom de samme applikasjonstjenestene som Visenas egne skjermbilder. Denne siden er arkitekturen og sikkerhetsmodellen, for dem som skal godkjenne integrasjonen.
Én integrasjon, den virkelige Visena-motoren
Systemene deres oppretter, leser, oppdaterer og sletter postene som betyr noe — personer og selskaper, oppdrag, aktiviteter, dokumenter — inne i kundens Visena-instans. Det finnes ingen egen integrasjonsdatabase og ingen nattlig kopi: en skriving lander på den samme posten en bruker ville redigert, gjennom de samme applikasjonstjenestene, så validering og forretningsregler oppfører seg som de gjør i grensesnittet.
Autoritative data
Du leser og skriver posten selv, i sanntid. Ikke en eksport, ikke en kopi som må avstemmes i etterkant.
Sikker av design
OAuth 2.0 client credentials, opake bearer-tokener, og en legitimasjon bundet til én instans. Ingenting er skrudd på i etterkant.
Forutsigbart og standardisert
REST over HTTPS med JSON-kropper, RFC 7396 merge-patch, RFC 9457 problemdokumenter, RFC 8288 navigasjonslenker. Det teamet ditt allerede kan, gjelder her.
Den praktiske konsekvensen er at integrasjonen arver plattformens korrekthet i stedet for å implementere den på nytt. En regel grensesnittet håndhever — et påkrevd felt, et duplikat organisasjonsnummer, en referanse som må finnes — håndheves på kallet ditt også, og feilen kommer tilbake som et maskinlesbart problemdokument i stedet for en halvskrevet post.
Hva API-et gir deg
En CRUD- og synkroniseringsflate over kjernepostene i CRM og arbeid, med konvensjonene en integratør forventer. Alt under er tilgjengelig på ressursene som er dokumentert i referansen; sidene per ressurs er kontrakten.
| Det du får | Hvordan det virker |
|---|---|
| Opprett, les, oppdater, slett | Egen forespørselskropp per verb og hele entiteten i svaret. PUT erstatter, og PATCH med application/merge-patch+json (RFC 7396) endrer nøyaktig de feltene du sender — sett ett, tøm ett med null, la resten være. |
| Tre lesemoduser på en samling | Offset-paginering med et reelt totalantall for et skjermbilde, keyset-paginering (cursor) for et engangsuttrekk, og en tidsvindu-liste for «hva er endret siden». Dokumenter har i tillegg sin egen endringsstrøm på document/changes. |
| Maskerte identifikatorer | Poster adresseres med maskerte id-er per instans. Den rå databasenøkkelen går aldri over ledningen, i noen retning; den maskerte id-en bærer du uendret mellom systemene. |
| Strukturerte feil | RFC 9457 application/problem+json, med kategoriene holdt fra hverandre: 400 for en kropp som ikke validerte, 422 for en referanse som ikke finnes. Feil er programmatisk håndterbare. |
| Dine egne nøkler | externalIds bærer nøklene fra ditt eget system på en person, og personlisten kan filtrere på en eksakt ekstern referanse — så du avstemmer mot dine egne poster uten å gjøre Visenas id-er til din primærnøkkel. |
| Kun server-til-server | Ingen nettleser, ingen cookies, ingen sesjon — og dermed ingen CSRF-flate. API-et er laget for backender, jobbplanleggere og ETL-jobber. |
| Aktøren navngis | Når et kall gjøres på vegne av en navngitt bruker, navngir svaret den aktøren som actedBy ved siden av den endringen gjelder — to identiteter på én post, ikke en anonym maskinhendelse. |
| Tilskriving på hver skriving | En skriving tilskrives en virkelig person i instansen: posten bærer created/createdBy og modified/modifiedBy, akkurat som en endring gjort på skjermen. |
De tre lesemodusene, side om side
Det er tre ulike oppgaver, og å velge feil er den vanligste integrasjonsfeilen vi ser. Listeendepunktene og garantiene deres er dekket i sin helhet under Lister, paginering og synk.
# a page with a real total — for a screen or a picker
GET /acme/api/v1/en/person?offset=0&limit=50
# keyset paging — for a one-off extract, walked start to finish
GET /acme/api/v1/en/person/cursor?limit=100
# a time window — for ongoing synchronisation
GET /acme/api/v1/en/person/timeline?key=modified&since=2026-08-20T02:00:00Z
To egenskaper å designe rundt. Tidsvindu-listen er minst-én-gang: den kan gi deg samme post to ganger på en vindusgrense, så dedupliser på id. Og ingen lesemodus rapporterer slettinger — en post som er borte slutter bare å dukke opp, så å avstemme forsvinninger er fortsatt din oppgave. Begge er oppgitt per endepunkt i referansen.
En flate som fortsetter å vokse
Ni ressurser er i drift i dag, alle under én kontrakt, én legitimasjon og én autentiseringsmåte. Adressen bærer en eksplisitt versjon, så en ressurs som kommer senere er en ny adresse under samme v1 — å utvide det integrasjonen dekker er ny kode mot en kjent flate, ikke en ny integrasjon.
| Ressurs | Adresse | Hva den inneholder |
|---|---|---|
| Person | /person | Kontakter, ansatte og brukerkontoer — navn, roller, adresser, e-postaliaser, dine egne eksterne id-er. Har en veiledende duplikatsjekk og en planlagt slettedato. |
| Company | /company | Organisasjoner — identifikatorer, adresser, status og relasjoner, med validering av organisasjonsnummer og sin egen duplikatsjekk. |
| Company template | /company-template | Formene nye selskaper opprettes fra, slik instansen er satt opp. |
| Project | /project | Oppdragene som arbeid, timer og fakturering organiseres rundt. |
| Project template | /project-template | Formene nye prosjekter opprettes fra — les dem for å drive malbaserte opprettelser. |
| Activity | /activity | Oppgaver og oppfølginger, filtrerbare på prosjekt, selskap, ansvarlig, status eller frist. |
| Document | /document | Ekte filer lagret på en person, et selskap eller et prosjekt — last opp, erstatt, last ned. |
| Document folder | /document/folder | Mappestrukturen dokumentene arkiveres i, inkludert nedlasting av hele treet. |
| Document changes | /document/changes | En endringsstrøm over arkivet: hva som er lagt til eller erstattet siden forrige kjøring. |
Ressursnavnene er entall. /person, ikke /persons — og adressen har ikke noe partner/-segment. En eldre flertallsform finnes i noe tidlig materiale; den gjeldende formen er den som står i referansen, og det er den tjenesten svarer på.
Arkitekturen i korte trekk
Du snakker med ett offentlig inngangspunkt. Det autentiserer kallet, knytter det til nøyaktig én instans og ruter det videre til motoren. Alt bak det inngangspunktet er internt i Visena, og aldri noe integrasjonen din adresserer.
- Autentiser. Bytt klient-id og hemmelighet i et tilgangstoken på
/{instanceName}/auth/api/v1/token, med OAuth 2.0 client credentials. - Kall. Send tokenet som et vanlig
Authorization: Bearer-hode til hvilket som helst dataendepunkt. Det er ingenting annet som skal signeres. - Inngangspunktet validerer og isolerer. Tokenet sjekkes, og instansen som står i adressen må være en tokenet er innvilget for. Et kall utenfor innvilgelsen avvises i inngangspunktet, før det når noen data.
- Motoren bruker samme logikk som produktet. Skrivinger går gjennom Visenas egne applikasjonstjenester, så regler, validering og følgeeffekter utløses som for en endring gjort på skjermen.
Anatomien til en URL
Hvert kall har samme form: instansen, API-versjonen, en locale, og så ressursen.
en eller no
/person ressursen, alltid entall
Locale bestemmer språket i meldingene som kommer tilbake, ikke hvilke poster du ser. Instansnavnet velger kunden, og det må være en tokenet er innvilget for — et avvik avvises i inngangspunktet, ikke besvart med noen andres data.
Det sikkerhetsteamet vil vite
Kontrollene under er egenskaper ved plattformen, ikke valg en integratør må slå på. Legitimasjon og tokener har detaljene i drift, og Skrivebeskyttet tilgang går gjennom en legitimasjon som beviselig ikke kan skrive.
- Opake tokener. Et tilgangstoken er en referanseverdi, ikke en beholder: det er ingenting i det å dekode, og det utløper av seg selv — backenden din fornyer det. Et lekket token er et avgrenset tidsvindu, ikke en lesbar kopi av noe.
- Hemmeligheter vises én gang. Hemmeligheten til en legitimasjon vises én enkelt gang, ved opprettelsen, og lagres bare som en enveis hash — den kan ikke leses tilbake, verken av deg eller av Visena. En tapt hemmelighet erstattes, den gjenopprettes aldri.
- Isolering per instans. En legitimasjon er innvilget én instans, og instansen i adressen må stemme med innvilgelsen — inngangspunktet slår den opp, sjekker den og avviser et avvik. Bak det har hver instans sin egen database, så en forespørsel bundet til én kunde har ingen vei til en annens rader.
- Eksplisitte scope, og ingen tillatende standardverdi. En token-forespørsel må oppgi hvilke scope den vil ha: en som ikke oppgir noen, avvises med
invalid_scope— den får ikke stilltiende alt. Delingen mellom lesing og skriving håndheves deretter per forespørsel, i et filter foran endepunktet — derfor kan en legitimasjon utstedt for lesing ikke skrive i det hele tatt, ikke bare være forventet å ikke gjøre det. - Maskerte identifikatorer. Poster adresseres med maskerte id-er, og masken er utledet per instans: den rå databasenøkkelen går aldri over ledningen i noen retning, og samme post bærer ikke samme id i to ulike instanser.
- Tilbakekalling. Tilbakekall en legitimasjon, og tokenene den har utstedt slutter å virke — regn med at det slår inn innen omtrent ett minutt, ikke øyeblikkelig, fordi valideringssvar mellomlagres kort. Å avslutte en leverandør er ett kall, ikke en venting på utløp.
- Tilskriving, aldri anonym maskinaktivitet. En skriving gjennom API-et tilskrives en virkelig person i instansen, i de samme feltene
createdByogmodifiedBysom grensesnittet fyller ut — og der kallet ble gjort for noen andre, navngiractedByaktøren i tillegg. Ingen API-endring er utilskrevet.
Kunden holder nøklene, ikke partneren. Legitimasjon opprettes av en administrator inne i kundens egen Visena-instans, avgrenses der og tilbakekalles der. Visena gir ikke en partner en stående nøkkel til en kundes data, og en kunde kan avslutte en integrasjon uten å involvere oss.
Slik integrerer teamet ditt
Tre steg, og det første kallet skjer vanligvis samme ettermiddag.
- Få en legitimasjon. En administrator i kundens Visena-instans oppretter en partnerlegitimasjon for integrasjonen og overleverer klient-id og hemmelighet på en trygg måte. Se Legitimasjon og tokener.
- Hent et token. Backenden din bytter legitimasjonen i et tilgangstoken på token-endepunktet, og fornyer det før det utløper — noen få linjer i hvilken som helst HTTP-stack. Kom i gang har det virkende fra ende til ende.
- Bygg mot referansen. Å gjøre kall dekker hoder, verb og merge-patch, Feil og feilsøking dekker feiltilfellene, og referansen dokumenterer hvert endepunkt, felt og statuskode per ressurs.
Når dere er klare for produksjon, er Sette i produksjon sjekklisten: avgrenset legitimasjon, en innøvd rotasjon, og hva som bør overvåkes.
Et fundament du kan bygge et produkt på
Partner API gir teamet ditt en standardbasert vei til data kundene allerede stoler på Visena med, med plattformens sikkerhetsmodell, instansisolering og forretningslogikk bak hvert kall. Det finnes ingen ny datamodell å lære og ingen integritetsgap mellom det integrasjonen gjør og det produktet gjør: samme tjenester, samme regler, samme tilskriving.
Ni ressurser er i drift under én kontrakt i dag, og flaten har vokst ved at ressurser er lagt til den — ikke ved at måten du kobler deg på har endret seg. Det er egenskapen det er verdt å designe mot: legitimasjonen, tokenbyttet, adresseformen og feilformatet du integrerer én gang, er de du beholder.