Partner API · v1
The Partner API opens your firm's clients, contacts, engagements, tasks and documents to the software around you. Import at scale, export without friction, sync continuously — or put your own portal in front of it all.
Nine resources, one contract · three read modes on every list · revocation under a minute · every write has a name on it
Who it's for
Visena runs the daily practice of firms whose work must stand up to scrutiny. The Partner API extends that same discipline to every integration you build on top.
One platform behind it
Visena gathers the essential tools of a modern practice — CRM, client screening, engagement management, time and invoicing — in one online solution. The Partner API opens the core records of that system to your own software: nine resources under one contract, the same records your teams see on screen, readable and writable over plain REST. No exports by e-mail, no CSV rituals, no waiting for someone to click a button.
person and company.project.activity.document and document/folder.document/changes.company-template and project-template.What our partners build
Whatever your firm runs on Visena, the Partner API makes it programmable. Four patterns cover most of what partners ask us for.
Put a front door you design in front of Visena. Every change made through the API obeys the same business rules as Visena's own screens — no shadow copies, no drift, no surprises.
Moving from a legacy system or spreadsheets? Load thousands of clients, contacts, projects and documents — with duplicate detection before you create, and validation that never half-writes a record.
Walk an entire dataset in a single pass with cursor paging, and pull documents on demand. Your data in Visena is yours — getting it out is a first-class feature, not a support request.
Change feeds tell you exactly what was created or modified since your last run — timeline on the records, document/changes on the archive. Keep your CRM, data warehouse or workflow tools current, without re-reading everything nightly.
See it in action
Plain HTTPS and JSON, standard OAuth 2.0 — if your team can call a REST API, they can build on Visena. Every call has the same shape: the instance name, the API version, a locale, then the resource. Here is what the everyday moves look like.
Probe for duplicates first, then create. Companies with a known organisation number are protected — the API refuses to create the same company twice, a bad reference writes nothing at all, and every imported record shows who loaded it.
# any duplicates before we create? GET /acme/api/v1/en/company/duplicates?orgNumber=983163327 # clear — create the client company POST /acme/api/v1/en/company { "name": "Fjellheim Regnskap AS", "orgNumber": "983163327" } → 201 Created · Location: …/company/bQ4wR8
Cursor paging is built for one consistent extract: start at the first page,
follow links.next to the end, and the dataset is yours in a single pass, filtered
to exactly the slice you need. It is not a substrate for resuming a sync — an id is allocated
at first write rather than at commit, so a row committed out of id order can land behind a walk
that has already passed it. Resuming is what the time-windowed timeline is for:
cursor-paginated as well, and at-least-once, so de-duplicate by id. Neither list mode reports
deletions — for the archive, document/changes is the only read path where a
deletion is observable.
GET /acme/api/v1/en/person/cursor?limit=100 { "items": [ …100 people… ], "links": { "next": "…/person/cursor?cursor=eyJp…" } } # follow links.next until it disappears — export complete
Every resource exposes a change feed: everything created or modified since a timestamp you choose. One watermark, one call — no full re-reads and no diffing on your side, whether you run it every five minutes or once a night.
# everything that changed since last night's run GET /acme/api/v1/en/person/timeline?since=2026-08-20T02:00:00Z { "items": [ …created & modified people… ], "links": { "next": "…" } } # apply, store the new watermark, done
Upload files against the client or engagement they belong to, organise them in folders, and pull whole folder trees back as zip bundles. Real binaries go in and out, not just metadata, and a conflict policy decides whether an existing file is replaced, skipped or kept alongside the new one.
# file the signed engagement letter on the client POST /acme/api/v1/en/document (multipart) file=@engagement-letter.pdf entityType=COMPANY entityId=bQ4wR8 → 201 Created · Location: …/document/dN3pT7 # later: the whole folder tree as one zip GET /acme/api/v1/en/document/folder/fR2kX9/content
Merge-patch updates change exactly the fields you send and nothing else — ideal behind a form in your own portal. Acting for a named user? The response records both identities: the person the change was made for, and what made it.
PATCH /acme/api/v1/en/person/xK9mQ2 Content-Type: application/merge-patch+json { "jobTitle": "Head of Operations", "directPhone": null } ← cleared; the rest untouched → 200 OK · modified + modifiedBy recorded
Why audit firms in particular
Your business is trust and traceability. An integration surface that blurs who did what would be disqualifying — so ours never does.
Security, without ceremony
The security model is the same one we trust with our own platform — and it stays out of your developers' way.
scope is mandatory at issuance: a token request that omits scope= is refused with invalid_scope. The read/write split is then enforced per request, in a filter ahead of the endpoint — a read-only export job is unable to write at all.Professional by design
No proprietary SDK, no exotic protocol. The Partner API is built on the open standards every integration team speaks — which is why first calls happen in an afternoon, not a sprint.
Machine-readable errors, navigable pagination links, precise partial updates — the conventions are boring on purpose. Boring is what integrates well, and what still integrates well five years from now.
Getting started
No procurement maze, no six-week enablement program. This is the whole journey.
clientId and secret pair, revocable at any time.The guides below cover credentials, tokens, scopes, paging and error handling, and the reference documents every endpoint. Your engineers will feel at home in the first hour.
Questions we hear first
No. The API is plain HTTPS with JSON bodies and standard OAuth 2.0. Any
language, any HTTP client, any integration platform that can send a request works — most
teams make their first call with nothing but curl.
Yes — completely, and without asking us. Cursor paging walks an entire
dataset in one pass, timeline resumes the sync afterwards, and documents download
as files or whole folder trees. Exit is a supported feature, not a negotiation.
Never. API writes run through the same validation and business logic as Visena's own screens, and land with the same attribution. What is invalid in the interface is invalid through the API — your data stays consistent no matter which door it came through.
The customer does. Credentials are created inside their Visena instance, scoped to exactly the permissions the integration needs, and revocable in one call — every token dies within about a minute. Secrets are shown once and stored only as a one-way hash.
Yes. On-behalf credentials are issued by the customer's administrator for a named user. Every change then records both identities — who it was done for, and what did it — which is exactly the trail an audit methodology expects.
That depends on what you are building and the scale you are planning for. Talk to your Visena contact, or write to sales@visena.com, and we will put together terms that fit.
Ten pages: an overview for the people who sign off on the integration, eight guides that build on each other, and the endpoint reference. Every page exists in English and Norwegian.
Guides, in reading order
Architecture, the surface you get and the security model — written for the people who have to sign off on the integration.
technical-overview.html → GuideThe whole flow in three moves, what you need before you start, and a 60-second taste that returns a real record.
getting-started.html → GuideInstances, credentials, access tokens and scopes, plain versus on-behalf credentials, masked ids, and what the locale in the URL decides.
concepts.html → GuideCreate, list, revoke and rotate a credential, then exchange it for a token — with a screen-by-screen walkthrough of doing it the first time.
credentials.html → GuideThe anatomy of a URL, the headers every request carries, create, read, update — PUT against PATCH — delete, and the response conventions worth knowing.
requests.html → GuideOffset lists, a cursor walk for one consistent extract, time-windowed timelines for resuming a sync, and filters.
lists-and-sync.html → GuideThe RFC 9457 problem document every failure returns, what to do about each status code, a retry policy that will not make things worse, and a quick diagnosis table.
errors.html → GuaranteeWhat a read-scoped token can and cannot do — and the 403 Forbidden that proves a read-only integration is unable to change anything.
read-only-access.html → GuideThe checklist before you point an integration at production, and how to reach us when something does not add up.
go-live.html →Endpoint reference