Visma eAccounting anbinden: Drei Markennamen, Token für sechzig Minuten und Seiten zu fünfzig Datensätzen
Visma eAccounting wird in Norwegen und den Niederlanden als eAccounting verkauft und in Schweden als Spiris, und das Entwicklerportal des Herstellers führt den neuen Namen bereits. Die Schnittstelle nicht: jeder Scope, jeder Host und jeder Pfad sagt weiterhin ea. Was die Trennung kostet, sind drei Support-Adressen auf zwei Domains.


Drei Markennamen, und ein Zielsystem darunter
Die erste Frage zu diesem System ist eine nach dem Namen: Welches Produkt sehen Sie sich eigentlich an. Dieselbe Software wird in jedem ihrer Märkte unter einem anderen Namen verkauft, und die Dokumentation ist gerade dabei, den Namen zu wechseln, den sie benutzt.
Die Integrationsdokumentation von maesn beantwortet das in einer Zeile, direkt unter der Kennung des Zielsystems: „Beachten Sie, dass das System in den Niederlanden und in Norwegen unter dem Markennamen eAccounting bekannt ist und in Schweden als Spiris (früher SPCS).“
Der Hersteller ist weiter gegangen. Seine Entwicklerdokumentation heißt inzwischen Spiris/eAccounting, die Client-ID, die Sie erhalten, wird beschrieben als „bei der Registrierung für das Spiris-Partnerprogramm bereitgestellt“, das Produkt wird durchgehend als Bookkeeping & Invoicing/eAccounting geschrieben, und schwedische Partner werden unter einer Adresse auf der Spiris-Domain beantwortet.
Was sich nicht bewegt hat, ist alles, was Sie tippen. Die Scopes heißen ea:api, ea:sales, ea:accounting und ea:purchase, der Host ist eaccountingapi.vismaonline.com, die Pfade sind /v2/…, und das Zielsystem über maesn heißt vismaeaccounting. Eine Umbenennung über der Schnittstelle und ein stabiler Stand darunter ist die brauchbare Art, sich dieses System zu merken.
Welche Objekte diese Verbindung heute erreicht und welche auf Anfrage bereitstehen, steht Objekt für Objekt auf der Seite zur Visma eAccounting Schnittstelle. Sie ist schmaler, als die Marktabdeckung vermuten lässt.
- Schweden
- Spiris
- Hieß früher SPCS
- Norwegen
- eAccounting
- Der Testzugang liegt auf der .no-Domain
- Niederlande
- eAccounting
- Eigene Partneradresse
- TARGET_SYSTEM: vismaeaccounting
- ea:api
- eaccountingapi.vismaonline.com
Der Name ist eine Vertriebsfrage. Der Bau sieht eine Schnittstelle. Eine Verbindung, die für einen norwegischen Kunden geschrieben wurde, erreicht einen schwedischen bereits. Was sich je Markt unterscheidet, ist die Sandbox, und dort brauchen Sie je ein Konto.
Der Satz zu den Markennamen und die Kennung des Zielsystems aus dem Anbindungsleitfaden. Programmname, Produktbenennung und die Support-Adressen aus Vismas Entwickler-Startseite, geprüft am 14. August 2026.
Eine Schnittstelle, drei Märkte und drei getrennte Partnerkontakte
Drei Märkte auf einer Schnittstelle sind das kommerzielle Argument dieses Systems, und es trägt. Was dabei nicht gesagt wird: Die Märkte werden darunter getrennt geführt, und das zeigt sich beim ersten Mal, wenn Sie einen Partnerkontakt brauchen.
Die Supportstruktur des Herstellers bildet die Trennung ab, und sie ist das deutlichste Signal dafür, wie getrennt diese Märkte unter einer Schnittstelle laufen:
| Markt | Marke | Partner-Support |
|---|---|---|
| Schweden | Spiris | Eigene Adresse, eigene Domain |
| Norwegen | eAccounting | Eigene Adresse, Visma-Domain |
| Niederlande | eAccounting | Eigene Adresse, Visma-Domain |
Drei getrennte Kontakte auf zwei Domains für eine Schnittstelle. Lesen Sie das als Planungsgröße und nicht als Urteil: Es sagt Ihnen, an welche Tür Sie je Markt klopfen, und dass es nicht dieselbe Tür ist.
Das größere Muster ist eine Eigenschaft der Gruppe. Visma kauft Software und lässt sie unter ihrem eigenen Namen weiterlaufen, weshalb ein einzelnes Herstellerlogo in einer Präsentation darunter immer noch eine eigene Integration je Produkt bedeuten kann.
Support-Adressen und die Marktliste aus Vismas Entwickler-Startseite, geprüft am 14. August 2026. Die Sandbox-Regionen aus den Sandbox-FAQ.
Die Scopes werden vereinbart, bevor Ihr erster Kunde sich verbindet
Die Authentifizierung ist OAuth 2.0 mit dem Authorization Code Flow, und damit ist sie die vertraute Hälfte dieses Systems. Die unvertraute Hälfte ist, dass die Scope-Liste zweimal festgelegt wird, und das zweite Mal in jeder Autorisierungsanfrage, die Sie senden.
Zwei Scopes sind Pflicht. ea:api gewährt überhaupt Zugang zur Schnittstelle, und offline_access sorgt dafür, dass ein Refresh-Token zurückkommt. Alles Weitere geht je Ressourcenbereich, jeweils mit einer Nur-Lese-Variante, und das heißt: Die Grenze dessen, was Ihre Integration je erreichen kann, wird gezogen, bevor Ihr erster Kunde einen Zustimmungsdialog sieht.
| Scope | Zugang | Erreicht |
|---|---|---|
ea:api | Pflicht | Die Schnittstelle selbst |
offline_access | Pflicht | Ein Refresh-Token |
ea:sales | Optional | Vertriebsressourcen, vollständig |
ea:sales_readonly | Optional | Vertriebsressourcen, lesend |
ea:accounting | Optional | Buchhaltungsressourcen, vollständig |
ea:purchase | Optional | Einkaufsressourcen, vollständig |
Auch ea:accounting und ea:purchase haben _readonly-Varianten, nach demselben Muster wie sales. Und ein Scope gehört zu einem anderen Produkt: vls:api erreicht Vismas Lohnschnittstelle, die sich denselben Identity Server teilt, sodass ein Token beide bedienen kann, solange die Scopes autorisiert wurden.
Zwei Anfrageparameter empfiehlt der Hersteller ungewöhnlich nachdrücklich, und beide gibt es, damit der Ablauf nicht die falsche Firma verbindet:
prompt=select_accounterzwingt die Firmenauswahl, statt die bereits in Visma Online gewählte zu übernehmen. Die Dokumentation nennt ihn „dringend empfohlen“ und sagt, ein Weglassen „kann zu automatischen oder unvorhersehbaren Anmeldungen mit einer bereits ausgewählten Firma führen“.acr_valuesfiltert die Auswahl auf Firmen, die tatsächlich Zugang zu diesem Produkt haben, und hält einen Kunden davon ab, ein fremdes Visma-Abonnement zu wählen.
GET https://identity.vismaonline.com/connect/authorize?client_id=<client_id>&redirect_uri=<redirect_uri>&scope=ea:api%20offline_access%20ea:sales&state=<state>&response_type=code&prompt=select_account&acr_values=service:44643EB1-...# Der Code ist einmal verwendbar und 5 Minuten gültig.# Fragmente (#) sind in redirect_uri nicht erlaubt.
Mehrere Scopes werden mit %20 oder + getrennt. Der Token-Tausch authentifiziert sich mit Basic base64(client_id:client_secret) und nicht über ein Feld im Rumpf.
Die praktische Folge dessen, dass Scopes vorab erklärt werden, ist eine Produktfrage und keine Entwicklungsfrage. Sie später zu erweitern heißt, zu jedem verbundenen Kunden für eine neue Zustimmung zurückzugehen, also gehört das, was Ihr Produkt in einem Jahr brauchen könnte, in das Gespräch, bevor der erste Kunde sich verbindet.
Über maesn wird der Scope-Satz einmal mit den Zugangsdaten eingereicht und auf jede Autorisierungsanfrage angewendet, und das ist dieselbe Form, die Unified Authentication jedem anderen System gibt.
Scope-Tabelle, die zwei Parameter, die Gültigkeit des Codes von fünf Minuten, die Fragment-Beschränkung und der geteilte Identity Server aus Vismas Authentifizierungsleitfaden, geprüft am 14. August 2026. Die acr_values-Kennung ist hier abgekürzt; der vollständige Wert steht auf jener Seite.
Sechzig Minuten, zwei Jahre und eine Passwortänderung
Drei Zahlen beschreiben den gesamten Token-Lebenszyklus hier, und die dritte ist der Grund, aus dem Integrationen auf diesem System aufhören zu arbeiten, ohne dass jemand etwas ausgeliefert hätte.
Das Access-Token läuft 60 Minuten nach seiner Ausgabe ab, was die Token-Antwort als expires_in: 3600 angibt. Erneuert wird mit demselben Aufruf und grant_type=refresh_token, und die Antwort hat dieselbe Form, sodass eine Erneuerung neben dem neuen Access-Token auch ein neues Refresh-Token zurückgibt.
Das Refresh-Token selbst ist ab Ausgabe zwei Jahre gültig. Dann kommt die Ausnahme, in den Worten des Herstellers: „Das Refresh-Token bleibt ab dem Tag seiner Ausgabe zwei Jahre gültig. Beachten Sie jedoch, dass das Refresh-Token ungültig wird, wenn der Nutzer sein Passwort ändert.“
Zwei Dinge folgen daraus, und beim zweiten sitzt der Aufwand. Eine Passwortänderung ist in einem kleinen Unternehmen ein gewöhnliches Ereignis, also ist das ein normaler Zustand, für den man entwirft. Und die Dokumentation beschreibt keine Benachrichtigung dafür, also ist das erste Signal, das Ihr Code bekommt, ein 401 beim nächsten Aufruf, zu welcher Stunde auch immer Ihr Scheduler gerade läuft.
Damit wird die erneute Autorisierung eine Produktfläche und kein Fehlerzweig. Irgendetwas in Ihrer Oberfläche muss dem richtigen Kunden sagen können, dass diese Verbindung neu verbunden werden muss, und genau für diesen Zustand gibt es ein Fehlermodell, das ihn einheitlich sichtbar macht.
| Token | Gültig für | Endet früher, wenn |
|---|---|---|
| Access-Token | 60 Minuten | nichts weiter nötig |
| Refresh-Token | Zwei Jahre ab Ausgabe | der Nutzer sein Passwort ändert |
| Authorization Code | 5 Minuten, einmal verwendbar | er einmal eingetauscht wurde |
Es gibt außerdem einen Endpunkt zum Widerruf, der eine Verbindung von Ihrer Seite aus ausdrücklich beendet: POST /connect/revocation mit dem Token und einem optionalen token_type_hint, authentifiziert wie der Token-Tausch. Ein erfolgreicher Aufruf gibt 200 mit leerem Rumpf zurück.
Token-Laufzeiten, die Ausnahme bei Passwortänderung, der Erneuerungsaufruf und der Widerrufs-Endpunkt aus Vismas Authentifizierungsleitfaden, geprüft am 14. August 2026. Jene Seite dokumentiert keinen Benachrichtigungsmechanismus für die Entwertung, was eine Lücke in der Dokumentation ist und keine Aussage, dass es keinen gibt.
Fünfzig Datensätze als Vorgabe, und die Antwort zählt den Rest
Sammlungs-Endpunkte geben 50 Objekte je Seite zurück, solange Sie nicht mehr anfordern, und das Maximum ist 1.000. Erhöht wird mit $pagesize, durch die Seiten bewegt man sich mit $page, oder Sie folgen dem Link-Antwortheader, der die nächste und die letzte Seite trägt.
Der Teil, der entscheidet, ob ein Abgleich korrekt ist, ist der Umschlag. Eine paginierte Antwort kommt als zwei Felder, ein Meta-Objekt und ein Data-Array, und Meta meldet, wie viel es insgesamt gibt.
{"Meta": {"CurrentPage": 1,"PageSize": 50,"TotalNumberOfPages": 22,"TotalNumberOfResults": 1100,"ServerTimeUtc": "2018-03-05T15:14:04Z"},"Data": [ ... ]}
Fünfzig Datensätze in der Hand und 1.100 in der Sammlung, genannt in derselben Antwort. Ein Abgleich, der hier aufhört, ist ein Client, der Meta nicht gelesen hat.
- CurrentPage
- 1
- PageSize
- 50
- TotalNumberOfPages
- 22
- TotalNumberOfResults
- 1.100
- ServerTimeUtc
- Zeitstempel
Die erste Antwort sagt Ihnen bereits, dass sie eine von zweiundzwanzig ist. Ein Abgleich, der hier aufhört, gibt 50 von 1.100 Datensätzen zurück und ein 200, und die zwei Felder, die das gefangen hätten, lagen die ganze Zeit in der Antwort.
Das Filtern ist die andere Hälfte eines geplanten Lesevorgangs, und es ist oData v4 mit einem $filter-Parameter und keine eigene Syntax. Die Operatoren sind der gewöhnliche Satz, Zeichenketten werden ohne Rücksicht auf Groß- und Kleinschreibung verglichen und müssen in Anführungszeichen stehen, und Datumsangaben haben ein festes Format.
Für einen Delta-Abgleich ist das entscheidende Feld ChangedUtc, und der Hersteller führt es als Beispiel für einen Datumsfilter, was es zum natürlichen Gegenstück der Paginierung darüber macht: fragen, was sich bewegt hat, und dann durch die Seiten laufen, bis CurrentPage bei TotalNumberOfPages ankommt.
GET /v2/articles?$filter=ChangedUtc gt 2026-08-01T00:00:00.00Z&$page=1&$pagesize=1000# Operatoren: gt lt ge le eq ne# startswith() endswith() contains() length()# Helfer: year() month() day() hour() minute() second()# Zeichenketten stehen in einfachen Anführungszeichen, Zahlen nicht.
Prädikate werden mit and und or verknüpft. Das dokumentierte Datumsformat ist yyyy-MM-ddTHH-mm-ss-FFZ.
Über maesn kommen beide Hälften in der Form an, die jedes andere verbundene System benutzt, und genau das heißt ein Weg, zu filtern und zu paginieren in der Praxis: dieselbe Abfrage gegen ein System, das über einen Cursor paginiert, über eine Seitenzahl oder in Schritten von fünfzig Datensätzen.
Seitengrößen, der Link-Header, die Meta-Felder und die Beispielzahlen aus Vismas Paginierungsleitfaden. Operatoren, das Datumsformat und ChangedUtc aus seinem Filterleitfaden. Beide geprüft am 14. August 2026.
Sechshundert Anfragen pro Minute, gezählt je Endpunkt
Die Ratenbegrenzung ist eine Zahl mit einer ungewöhnlichen Einheit: 600 Anfragen pro Minute, und „die Begrenzung wird je Client und Endpunkt/URL geführt“.
Je Endpunkt ändert, wie ein Erstabgleich sich verhält. Ein Worker, der Kunden, Lieferanten und Artikel liest, teilt sich kein Budget über die drei, also bringt Parallelisieren über Ressourcen hinweg Durchsatz, den Parallelisieren innerhalb einer Ressource nicht bringt. Es heißt auch, dass ein einzelner heißgelaufener Endpunkt gedrosselt werden kann, während der Rest Ihrer Integration unberührt bleibt, und das ist in einem Log schwerer zu sehen als eine globale Begrenzung.
Ein Überschreiten gibt 429 zurück, mit einem Rumpf, der das Zeitfenster und die Wartezeit in klaren Worten nennt:
HTTP/1.1 429 Too Many Requests{"ErrorCode": 4010,"DeveloperErrorMessage": "API calls quota exceeded! maximumadmitted 600 per Minute. Try again in 55 seconds.","ErrorId": "3fa7da17-eeb2-48f6-997d-0be158f4cba4"}
Jede erfolglose Anfrage trägt eine ErrorId, und der Hersteller bittet beim Support um sie und um Ihre Client-ID. Das Client Secret ist nie Teil dieses Gesprächs.
Es lohnt sich, das mit dem anderen Visma-Produkt im Katalog zu vergleichen, denn die beiden messen auf Achsen, die nichts gemeinsam haben. Die Visma e-conomic Schnittstelle führt einen Token-Bucket je Kundenvereinbarung, in dem verschiedene Endpunkte verschieden viel kosten, ihr Budget hängt also davon ab, welche Aufrufe Sie machen. Dieses hier zählt Aufrufe flach und teilt die Zählung je Endpunkt.
Ein Hersteller, zwei Produkte, zwei Modelle und kein gemeinsames Vokabular dazwischen. Das ist in dieser Gruppe der Normalfall, und es ist der Grund, aus dem eine Taktstrategie es wert ist, einmal auf einer Ebene darüber geschrieben zu werden.
Die Begrenzung, ihre Einheit und der 429-Rumpf aus Vismas Leitfaden zur Ratenbegrenzung, geprüft am 14. August 2026. Die Konvention zur Fehler-ID aus seiner Entwickler-Startseite.
Eine Firma je E-Mail-Adresse, auf derselben URL wie die Produktion
Dieses System zu testen hat zwei Eigenschaften, die leicht zu übersehen und spät teuer zu entdecken sind. Die erste ist, dass die Sandbox keine eigene Adresse hat.
In den Worten des Herstellers: „Es sind dieselben URLs wie in der Produktion, aber mit einem IdentityServer-Client und einem Visma-Online-Konto, das einen bestimmten Sandbox-Typ hat.“ Nichts in einer Basis-URL und nichts in einem Hostnamen sagt Ihnen, mit welcher Umgebung Sie sprechen. Nur die Zugangsdaten tun das.
Die zwei Richtungen sind auch nicht symmetrisch: Eine Produktions-Client-ID kann eine Sandbox-Firma erreichen, während eine Sandbox-Client-ID nie eine Produktionsfirma erreicht.
Die zweite ist der Umfang. Eine Sandbox-Firma ist bei der Anlage an eine Region gebunden, die Region lässt sich danach nicht mehr ändern, und „Sie können maximal 1 Firma je E-Mail-Adresse haben“. Einen zweiten Markt zu testen heißt deshalb, ein zweites Konto unter einer anderen E-Mail-Adresse anzulegen. Der Hersteller merkt an, dass er daran arbeitet, das aufzuheben, womit es eine aktuelle Einschränkung ist und keine Festlegung.
| Eigenschaft | Zustand |
|---|---|
| Region | Bei der Anlage gewählt, nicht änderbar |
| Firmen je E-Mail-Adresse | Eine |
| Verfügbare Regionen | Schweden, Norwegen, Finnland, die Niederlande |
| Beispieldaten | Regionsspezifisch, oder eigene ergänzen |
| Zurücksetzen | Archiviert alles außer dem Firmennamen |
| Interne Dienste | Payslip, AutoPay, AutoReport und AutoInvoice sind nachgebildet oder fehlen |
Die letzte Zeile verdient einen Satz, denn der Hersteller ist offen über die Folge: Da einige interne Integrationen nachgebildet sind, „stoßen Sie womöglich auf seltsame Fehler, wenn Sie versuchen, auf diese Dienste zuzugreifen“. Ein Fehlschlag in der Sandbox ist deshalb nicht automatisch ein Fehlschlag in Ihrem Code.
Zwei Schritte in diesem Ablauf brauchen den Hersteller, und beide gehören in einen Plan, der vor der Startwoche geschrieben wird. Der Gang in die Produktion verlangt, Vismas Schnittstellen-Support zu kontaktieren. Und die Rückruf-URL wird vom Hersteller gesetzt und nicht von Ihnen: Die Dokumentation von maesn sagt ausdrücklich, dass „Sie Visma kontaktieren müssen, um die URL auf die richtige zu ändern“.
Was maesn hier ändert, ist die Sandbox selbst und nicht der Papierkram. Unsere Sandbox-Übersicht führt dieses System mit einer kostenlosen Testmöglichkeit und als von maesn bereitgestellt, sodass eine Testumgebung bereitsteht, ohne je Region eine eigene Visma-Registrierung. Die Regionen gibt es weiter; sie hören nur auf, getrennte Registrierungsprojekte zu sein.
Die geteilten URLs und die nachgebildeten Dienste aus Vismas Umgebungsseite, die Ein-Firma-Regel, die Regionsbindung, das Verhalten beim Zurücksetzen und die Asymmetrie der Client-ID aus den Sandbox-FAQ, der Produktionszugang aus der Startseite, alles geprüft am 14. August 2026. Der Rückruf-Schritt aus dem Anbindungsleitfaden und die Verfügbarkeit der Sandbox aus der Sandbox-Übersicht.
Was maesn von der Liste nimmt, und was bei Ihnen bleibt
Alles bisher beschreibt, was das System tut. Dies ist die Aufteilung: die Teile, die auf dieser Ebene enden, und die Entscheidungen, die Ihre bleiben, weil nur Sie Ihr Produkt kennen.
Was maesn von der Liste nimmt:
- Die Scope-Erklärung und die zwei Parameter. Einmal mit Ihren Zugangsdaten eingereicht und auf jede Autorisierungsanfrage angewendet.
- Die Erneuerung, je Mandant. Token werden auf dieser Seite erneuert, der Lebenszyklus ist also nichts, was Ihr Produkt je Kunde einplant oder speichert.
- Das Paginieren jeder Sammlung. Der Umschlag wird für Sie gelesen, sodass die vollständige Menge ankommt und nicht die ersten fünfzig.
- Drei Markennamen, reduziert auf eine Verbindung. Welchen Namen der Kunde auch benutzt, Ihr Code spricht ein Zielsystem an, abgebildet in ein Common Data Model mit jedem anderen System.
Was bei Ihnen bleibt:
- Die Scope-Entscheidung. Was Ihr Produkt in einem Jahr brauchen könnte, ist jetzt günstiger beantragt als nach der Zustimmung jedes Kunden.
- Das Abfrageintervall. Wie aktuell Ihr Produkt sein muss, ist Ihre Wahl, und Sie haben 600 Anfragen pro Minute je Endpunkt dafür.
- Welche Objekte freigeschaltet sein müssen. Benennen Sie sie aus Ihrem Anwendungsfall, und führen Sie dieses Gespräch vor einer Zusage an einen Kunden.
Häufige Fragen
Brauche ich eine eigene Integration für Spiris?
Welche Scopes braucht Visma eAccounting?
Wie lange gelten Visma-eAccounting-Token?
Warum gibt meine Visma-eAccounting-Anfrage nur 50 Datensätze zurück?
Wie sind die Ratenbegrenzungen von Visma eAccounting?
Kann ich jeden Visma-eAccounting-Markt mit einem Visma-Konto testen?

Tripletex anbinden: Ein Session-Token trägt jeden Aufruf
Tripletex verbindet zwei Tokens zu einem dritten, legt die Firma in den Benutzernamen und nummeriert neue Buchungszeilen über die Zeile. Was das beim Bauen heißt.
Lennart Svensson · 24. Sept. 2026
Procountor anbinden: Unbeaufsichtigt laufen lassen
Procountor hat zwei Wege hinein, und der unbeaufsichtigte endet an jedem Endpunkt mit zweitem Faktor. Was das für Token, Abgleich und Steuersätze heißt.
Lennart Svensson · 28. Aug. 2026
DATEV Rechnungswesen anbinden: Beide Richtungen, ein Token
Eine Verbindung trägt Lesen und Schreiben in DATEV Rechnungswesen, auf einem Zwei-Jahres-Token. Welche Objekte in welche Richtung reisen, ist die Entscheidung.
Lennart Svensson · 17. Aug. 2026Einmal bauen, auf der Unified API.
Visma eAccounting zählt 600 Anfragen pro Minute je Endpunkt und nennt sich selbst drei Dinge, Visma e-conomic bepreist jeden Aufruf und füllt je Vereinbarung nach, und beide gehören demselben Hersteller. Bauen Sie gegen eine Schnittstelle, und jeder dieser Unterschiede wird zu einer Zeile in einer Tabelle, die man einmal liest.