Suche

Kontist API – Custom Connector

Themen

Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.

Mehr Informationen

Kontist Custom Connector Mit Swagger YAML Erstellen

Mit einem Kontist Custom Connector kannst du die Kontist API direkt in deine Automatisierungen integrieren. Statt den OAuth2 Flow manuell umzusetzen und Refresh Tokens selbst zu verwalten, nutzt du einfach ein fertiges Swagger YAML. Dadurch sparst du Zeit, reduzierst Fehler und kannst sofort mit GraphQL Queries arbeiten.

Der Ansatz ist bewusst simpel: Du erstellst einen leeren Custom Connector, wechselst in den Swagger Editor und kopierst den YAML Code ein. Anschliessend hinterlegst du deine OAuth2 Daten, testest die Verbindung und nutzt die Aktion direkt in deinen Flows. Somit wird aus einer eher sperrigen API-Anbindung ein sauberer, wiederverwendbarer Baustein.

Warum dieser Weg besser ist als eigener OAuth Code

Bei OAuth2 klingt vieles erst einmal harmlos. In der Praxis verlierst du aber schnell Zeit mit Redirect URLs, Authorization Codes, Access Tokens, Refresh Tokens und Fehlern beim erneuten Abrufen eines Tokens. Genau hier hilft der Custom Connector, weil die Token-Verwaltung nicht mehr in deinem eigenen Code liegt.

Du musst also keinen eigenen kleinen Auth-Service bauen, keine Tokens in Variablen oder Tabellen speichern und auch keine Refresh-Logik planen. Gleichzeitig bleibt dein Flow lesbar, weil die Authentifizierung sauber im Connector steckt. Dadurch kannst du dich auf deine eigentliche Logik konzentrieren: Kontostand abrufen, Transaktionen lesen, Belege laden oder Daten in andere Systeme schieben.

Die Grundidee: Ein Endpoint, viele GraphQL Queries

Kontist stellt eine GraphQL API bereit. Das bedeutet, dass du nicht viele einzelne REST-Endpunkte pflegen musst. Stattdessen sendest du deine Anfrage an einen zentralen Endpoint und bestimmst im Body, welche Daten du brauchst. Das macht den Connector sehr schlank, weil eine einzige Aktion reicht, um verschiedene Abfragen zu fahren.

Der Endpoint liegt bei https://api.kontist.com/api/graphql. Im Swagger wird daraus der Host api.kontist.com, der Base Path /api und der Pfad /graphql. Dadurch entsteht im Connector eine POST-Aktion, in der du deine Query als JSON Body übergibst. Gleichzeitig wird der Header content-type: application/json intern gesetzt, damit deine Anfrage sauber verarbeitet wird.

Voraussetzungen für den Kontist Custom Connector

Bevor du loslegst, brauchst du einen Zugang zum Kontist Developer Portal und einen registrierten OAuth2 Client. Dort bekommst du die Client ID und das Client Secret. Ausserdem brauchst du später die Redirect URL aus deinem Custom Connector, weil diese exakt im Kontist Client Management hinterlegt werden muss.

Wichtig ist ausserdem der Scope offline. Genau dieser Scope ist entscheidend, damit der Connector einen Refresh Token nutzen kann. Ohne diesen Scope kann es passieren, dass die Verbindung zwar erst funktioniert, spaeter aber nicht mehr automatisch erneuert wird.

Custom Connector Blank Erstellen Und In Den Swagger Mode Wechseln

Zuerst oeffnest du die Custom Connector Oberflaeche in deiner Umgebung. Dort erstellst du keinen Import aus einer OpenAPI Datei, sondern waehlt bewusst Create from blank. Dadurch startest du mit einer leeren Vorlage und hast gleichzeitig die volle Kontrolle ueber die komplette Definition.

Nach dem Namen, zum Beispiel Kontist Connector, wechselst du in den Swagger Editor. Dort entfernst du den vorhandenen Beispiel-Code komplett. Anschliessend kopierst du den bereitgestellten YAML Code vollstaendig in den Editor. Achte dabei auf die Einrueckungen, weil YAML bei Leerzeichen sehr genau ist.

Nach dem Speichern wird der Connector aus deiner Swagger Definition aufgebaut. Du siehst dann die Aktion Fetch GraphQL mit der POST-Methode auf /graphql. Gleichzeitig ist OAuth2 bereits als Security Definition enthalten, sodass du im naechsten Schritt nur noch die OAuth Werte sauber eintragen musst.

Swagger YAML Für Den Kontist Connector

Der folgende YAML Code ist die Basis für den Connector. Du kannst ihn direkt kopieren und im Swagger Editor einfügen. Danach speicherst du den Connector und kontrollierst kurz, ob die Aktion und die Security Definition korrekt angezeigt werden.

Power Automate

swagger: '2.0'
info:
  title: Kontist
  description: >-
    Kontist Business Bank - all about yout accounts, clients, statemants,
    subscriptions, transactions, transfers and users.
  version: '1.0'
host: api.kontist.com
basePath: /api
schemes:
  - https
consumes: []
produces: []
paths:
  /graphql:
    post:
      responses:
        default:
          description: default
          schema: {}
      summary: Fetch GraphQL
      operationId: FetchGraphQl
      parameters:
        - name: content-type
          in: header
          required: true
          type: string
          default: application/json
          x-ms-visibility: internal
        - name: body
          in: body
          required: true
          schema:
            type: object
            properties:
              query:
                type: string
                description: query
            x-ms-visibility: important
          x-ms-visibility: important
      description: post custom query
definitions: {}
parameters: {}
responses: {}
securityDefinitions:
  oauth2-auth:
    type: oauth2
    flow: accessCode
    authorizationUrl: https://api.kontist.com/api/oauth/authorize
    tokenUrl: https://api.kontist.com/api/oauth/token
    scopes:
      offline: offline
security:
  - oauth2-auth:
      - offline
tags: []

Security Tab – OAuth2 im Connector einrichten

Wechsle in den Bereich Security. Dort sollte OAuth2 bereits automatisch erkannt sein. Als Identity Provider wählst du Generic OAuth 2. Die Authorization URL und die Token URL sind in der Regel bereits korrekt vorausgefüllt, da sie aus der Kontist API übernommen werden. Beide Felder erhalten den Wert: https://api.kontist.com/api/oauth/token.

Im Feld Scope trägst du zusätzlich den Wert offline ein, um keine Einschränkungen bei der Autorisierung zu haben. Speichere den Custom Connector zunächst mit einer beliebigen Client ID und einem beliebigen Client Secret. Dadurch wird die Redirect URL generiert, die du im nächsten Schritt benötigst.

Kopiere anschließend die generierte Redirect URL aus dem Custom Connector und hinterlege sie im Kontist Developer Portal im Client Management.

Erst danach erhältst du deine tatsächliche Client ID für dein Client Secret.

Gehe nun zurück in den Custom Connector und öffne erneut den Security-Tab. Trage dort deine echte Client ID und dein Client Secret ein und speichere die Änderungen.

Verbindung Testen Und Refresh Token Automatisch Nutzen

Im Bereich Test erstellst du eine neue Verbindung. Dabei wirst du zur Kontist Anmeldung weitergeleitet. Nach der Anmeldung bestätigst du den Zugriff und landest wieder im Connector. Wenn alles passt, ist die Verbindung gespeichert und kann in Flows genutzt werden.

Der wichtigste Vorteil kommt danach: Du musst den Refresh Token nicht selbst über Code holen. Der Connector übernimmt das Handling für dich, sofern der OAuth Flow und der Scope korrekt gesetzt sind. Dadurch wird deine Lösung stabiler, weil der Token-Prozess nicht in jedem Flow neu gebaut werden muss.

Kontist Login Greenshot Screenshot

Autorisierung bei Kontist

ConfirmConenction_PowerAutomate

Bestätigung der Verbindung in Power Automate

Erste GraphQL Query Im Testbereich Ausführen

Zum Testen reicht eine kleine Query. Im Body übergibst du ein JSON Objekt mit dem Feld query. Dadurch kann der Connector die Anfrage an den GraphQL Endpoint senden und die Antwort direkt anzeigen.

{ viewer { firstName lastName email } }
Power Apps
Set(
    varViewer,
    With(
        {response: Kontist.FetchGraphQl({query: "{ viewer { firstName lastName email } }"}).data.viewer},
        {
            firstName: Text(response.firstName),
            lastName: Text(response.lastName),
            email: Text(response.email)
        }
    )
);

Testanfrage über PowerFx inklusive Parsing

Wenn diese Anfrage eine Antwort liefert, steht die Basis. Danach kannst du Schritt für Schritt weitere Felder ergänzen. Gerade bei GraphQL ist das praktisch, weil du nur die Daten abfragst, die du wirklich brauchst. Somit bleiben Antworten schlanker und deine Flows werden leichter wartbar.

Kontostand abrufen

Mit diesem Call holst du dir richtig nützliche Infos zu deinem Kontist-Konto – und zwar nicht einfach nur den Kontostand, sondern die volle Steuer- und Finanzübersicht. Stell dir vor: Du willst auf einen Blick sehen, wie viel Kohle wirklich dir gehört, wie viel ans Finanzamt geht und was noch unklar ist – genau das liefert dir diese Abfrage.

Der Einstieg ist viewer, also der eingeloggte Nutzer. Dahinter steckt mainAccount, dein Hauptkonto. Und dort gibt’s das Objekt stats, in dem richtig viele spannende Zahlen stecken:

  • accountBalance zeigt dir deinen aktuellen Kontostand – ganz klassisch.
  • yours ist der Betrag, der dir tatsächlich bleibt, wenn man die ganzen Steuerverpflichtungen rausrechnet.
  • unknown sind Beträge, die noch nicht richtig zugeordnet wurden – also potenziell noch in der Klärung.
  • main ist wahrscheinlich der „echte“ Netto-Saldo deines Kontos.
  • vatTotal, vatAmount, vatMissing – das ist deine Umsatzsteuer im Überblick: Gesamt, laufend, und was noch fehlt.
  • Und dann die Einkommenssteuer: taxTotal, taxCurrentYearAmount, taxPastYearsAmount und taxMissing. Alles, was du wissen willst (oder lieber verdrängen würdest), rund um deine Steuerlast.

Mit einer einzigen Query bekommst du also eine ziemlich komplette Einschätzung deiner finanziellen Lage – ideal, wenn du in Power Automate automatische Checks baust oder dir in Power Apps einen schnellen Überblick schaffen willst.

{
  viewer {
    mainAccount {
      stats {
        accountBalance
        yours
        unknown
        main
        vatTotal
        vatAmount
        vatMissing
        taxTotal
        taxCurrentYearAmount
        taxPastYearsAmount
        taxMissing
      }
    }
  }
}

Transaktionen abrufen

Na klar – das hier ist der Power-Move, wenn du Transaktionen aus deinem Kontist-Konto abrufen willst. Und zwar nicht irgendwie, sondern richtig detailliert. Du bekommst mit dieser Abfrage nicht nur eine Liste an Buchungen, sondern alles, was dazugehört – inklusive Kategorien, Belege, Gebühren und sogar Splits.

Der Einstieg ist wieder viewer, also der aktuell eingeloggte Benutzer. Von da aus geht’s direkt zu mainAccount, deinem Hauptkonto. Und dann wird’s spannend: Über transactions holst du dir alle Transaktionen der letzten 500 Tage. Das Filterkriterium basiert auf dem Feld valutaDate, also dem Wertstellungsdatum.

Jetzt zur Rückgabe: Die Struktur ist klassisch GraphQL – du bekommst pageInfo, was dir sagt, ob es noch mehr Seiten gibt (für Pagination), und dann die eigentlichen Transaktionen unter edges > node.

Was steckt im node drin? Alles, was du für eine saubere Buchhaltung oder eine App-Auswertung brauchst:

  • Beträge, Kategorien, IBANs, Namen, Beschreibungen

  • Buchungs- und Wertstellungsdatum

  • Hinweise zur manuellen Kategorisierung oder Splits

  • Anhänge und Dokumente wie Belege und Rechnungen

  • Vorhersagen zur Kategorie und Buchungszeitpunkt

  • Gebühren, Lastschriftinfos und Währungsdaten

Kurz gesagt: Diese Query bringt das volle Transaktionspaket auf dein Dashboard. Ideal, wenn du z. B. in Power Apps eine Timeline baust oder in Power Automate automatisch prüfen willst, ob neue Ausgaben da sind, die noch keine Belege haben.

Du willst mehr Kontrolle über deine Finanzen? Diese Query ist dein Schweizer Taschenmesser.

{
  viewer {
    mainAccount {
      transactions (filter:{
        valutaDate_gt: "@{addDays(utcnow(),-500,'yyyy-MM-dd')}"
      }){
        pageInfo {
          startCursor
          endCursor
          hasPreviousPage
          hasNextPage
        }
        edges {
          node {
            amount
            actionReason
            iban
            name
            category
            createdAt
            valutaDate
            receiptName
            bookingDate
            personalNote
            mandateNumber
            paymentMethod
            originalAmount
            categorizationType
            canBeRecategorized
            documentDownloadUrl
            merchantCategoryCode
            userSelectedBookingDate
            categoryCodeTranslation
            predictedUserSelectedBookingDate
            id
            description
            purpose
            type
            e2eId
            merchantCountryCode
            source
            fees {
              type
              status
              unitAmount
              usedAt
            }
            splits {
              id
              uuid
              amount
              category
              userSelectedBookingDate
              categorizationType
            }
            assets {
              id
              name
              filetype
              assetableId
              path
              thumbnail
              fullsize
            }
            directDebitFees {
              id
              type
              name
              amount
              usedAt
              invoiceStatus
            }
            predictedCategory
            documentNumber
            documentPreviewUrl
            documentDownloadUrl
            documentType
            foreignCurrency
            categoryCode
            verified
            categoryCodeTranslation
            recurlyInvoiceNumber
            transactionAssets {
              id
              name
              filetype
              assetableId
              path
              thumbnail
              fullsize
            }
          }
        }
      }
    }
  }
}
Power Apps
ClearCollect(
    colTransactions,
    With(
        {
            response: Kontist.FetchGraphQl(
                {
                    query: "{
  viewer {
    mainAccount {
      transactions (filter:{
        valutaDate_gt: """ & Text(
                        DateAdd(
                            Today(),
                            -365,
                            TimeUnit.Days
                        ),
                        "yyyy-mm-dd"
                    ) & """
      }){
        pageInfo {
          startCursor
          endCursor
          hasPreviousPage
          hasNextPage
        }
        edges {
          node {
            amount
            actionReason
            iban
            name
            category
            createdAt
            valutaDate
            receiptName
            bookingDate
            personalNote
            mandateNumber
            paymentMethod
            originalAmount
            categorizationType
            canBeRecategorized
            documentDownloadUrl
            merchantCategoryCode
            userSelectedBookingDate
            categoryCodeTranslation
            predictedUserSelectedBookingDate
            id
            description
            purpose
            type
            e2eId
            merchantCountryCode
            source
            fees {
              type
              status
              unitAmount
              usedAt
            }
            splits {
              id
              uuid
              amount
              category
              userSelectedBookingDate
              categorizationType
            }
            assets {
              id
              name
              filetype
              assetableId
              path
              thumbnail
              fullsize
            }
            directDebitFees {
              id
              type
              name
              amount
              usedAt
              invoiceStatus
            }
            predictedCategory
            documentNumber
            documentPreviewUrl
            documentDownloadUrl
            documentType
            foreignCurrency
            categoryCode
            verified
            categoryCodeTranslation
            recurlyInvoiceNumber
            transactionAssets {
              id
              name
              filetype
              assetableId
              path
              thumbnail
              fullsize
            }
          }
        }
      }
    }
  }
}"
                }
            ).data.viewer.mainAccount.transactions
        },
        {
            pageInfo: {
                startCursor: Text(response.pageInfo.startCursor),
                endCursor: Text(response.pageInfo.endCursor)
            },
            edges: ForAll(
                response.edges As _edge,
                {
                    amount: Value(_edge.node.amount),
                    category: Text(_edge.node.category),
                    createdAt: DateTimeValue(_edge.node.createdAt)
                }
            )
        }
    ).edges
);

Belege herunterladen

Jetzt, wo du dir die Transaktionen inklusive aller Anhänge sauber in deinen Flow geholt hast, wird’s richtig praktisch. Denn jede Transaktion bringt – wenn vorhanden – auch gleich ihre Belege mit. Diese findest du im Feld transactionAssets, und darin wiederum steckt die Eigenschaft fullsize.

Und genau hier kannst du ansetzen: Du gehst einfach mit einer Apply to each-Schleife über die Transaktionen, zum Beispiel mit

@{body('Query_Kontist_for_Transactions')?['data']?['viewer']?['mainAccount']?['transactions']?['edges']}

Dann prüfst du, ob das Feld transactionAssets belegt ist, und kannst über eine zweite Schleife direkt an die Dateien ran. Um den eigentlichen Beleg herunterzuladen, brauchst du nur einen simplen HTTP-Call – keine weitere Authentifizierung, keine Komplexität.

Du nimmst einfach die URL aus

@{items('Apply_to_each_transactionAssets')?['fullsize']}

und rufst sie mit einem HTTP GET auf. Das war’s. Der Beleg kommt zurück als Datei – bereit zum Speichern in SharePoint, OneDrive oder zum Anhängen an eine Mail.

So wird aus einer Transaktionsliste in Power Automate ganz schnell ein vollautomatisiertes Belegarchiv.

Fazit: Weniger Code, Weniger Token-Stress

Der Kontist Custom Connector ist eine schlanke Loesung, wenn du Kontist Daten in Automatisierungen nutzen willst. Durch den Blank Connector und den Swagger Editor bleibt das Setup kontrollierbar, gleichzeitig sparst du dir den kompletten Umweg ueber eigenen OAuth Code.

Besonders stark ist die Kombination aus GraphQL und OAuth2 im Connector. Du hast nur eine Aktion, kannst aber viele verschiedene Queries senden. Dadurch bleibt deine Integration flexibel, sauber und gut wartbar. Wenn du also Kontostand, Transaktionen oder Belege automatisiert nutzen willst, ist dieser Weg ein sehr guter Startpunkt.

War dieser Artikel hilfreich?

noch mehr interessante Beiträge

Nach oben scrollen