HomeGuidesAPI Reference
Log In
Guides

Data Enrichment

Categorise transactions and identify payment partners without connecting to a bank - send your own data, get enriched data back.

Data Enrichment

Data Enrichment gives you access to nrich's categorisation and payment partner identification capabilities as a standalone service. You bring the raw transaction data - from any source - and nrich returns each transaction enriched with a spending category and a normalised merchant name.

No bank connection. No Widget. No user authentication. Just your transactions in, enriched transactions out.

📘

Get credentials

Sign in to console.qwist.cloud to generate credentials. Data Enrichment uses client authentication only - no user tokens required.


When to use this

You already have transaction data

You're a bank, a core banking system, or a fintech with your own AIS - and you want to add categorisation without changing your data source.

You want clean merchant names

Raw transaction names from banks are noisy (AMZN EU SARL → Amazon). nrich normalises them to clean payment partner names.

You want spending insights

Power PFM features, budgeting dashboards, or spending analysis without a full open banking integration.

📘

Also consider Transaction Upload

If you also need income reports or risk scores from your transaction data, Transaction Upload is a better fit - it runs the full enrichment pipeline and returns an access_token for all reporting endpoints.

Data Enrichment is best when you only need categories and payment partners, and you want a synchronous call with immediate results.


Coverage

Data Enrichment

Available across all nrich AIS-supported countries

✓Germany✓Austria✓Spain✓Portugal✓France✓Italy✓Netherlands✓Belgium✓Norway✓Sweden✓Denmark

View full bank catalog - 3,381 banks across 33 countries →


Categorise transactions

POST https://api.finx-s.qwist.cloud/rpc/categorize

Authentication: HTTP Basic (clientId:clientSecret)

Limits: Up to 2,000 transactions per request.

Request:

[
  {
    "id": "txn-001",
    "amount": -12.99,
    "currency": "EUR",
    "name": "SPOTIFY AB",
    "purpose": "SVWZ+Spotify Abo 55912837 EREF+SPOTISP1234567",
    "iban": "SE3550000000054910000003",
    "creditor_id": "SE59ZZZ0000017491",
    "mandate_reference": "SPOTIFY-DE-923847102",
    "sepa_purpose_code": "GDDS",
    "booked_at": "2025-05-28T00:00:00.000Z"
  },
  {
    "id": "txn-002",
    "amount": -850.00,
    "currency": "EUR",
    "name": "STADTWERKE MÜNCHEN",
    "purpose": "Rechnung 20250501 KD-NR 48291037",
    "booked_at": "2025-05-02T00:00:00.000Z"
  },
  {
    "id": "txn-003",
    "amount": 2850.00,
    "currency": "EUR",
    "name": "ACME GMBH",
    "purpose": "Gehalt Mai 2025 Maria Mueller",
    "booked_at": "2025-05-30T00:00:00.000Z"
  }
]

Required fields per transaction:

FieldDescription
idYour unique identifier for this transaction. Returned in the response for mapping. Make this unique within the request.
amountTransaction amount. Negative = debit, positive = credit.
currencyISO 4217 currency code (e.g. "EUR").

Optional fields (improve accuracy):

FieldDescription
nameCounterparty name (raw from bank). Greatly improves payment partner detection.
purposePurpose text, including any SEPA structured fields.
ibanCounterparty IBAN.
sepa_purpose_codeISO 20022 purpose code (e.g. SALA for salary, GDDS for goods).
creditor_idSEPA creditor ID (for direct debits).
mandate_referenceSEPA mandate reference.
booked_atBooking date. Helps with time-based patterns.
user_idYour internal user ID - useful for grouping transactions when categorising across users.

Response:

[
  {
    "id": "txn-001",
    "amount": -12.99,
    "currency": "EUR",
    "name": "SPOTIFY AB",
    "purpose": "SVWZ+Spotify Abo 55912837 EREF+SPOTISP1234567",
    "iban": "SE3550000000054910000003",
    "booked_at": "2025-05-28T00:00:00.000Z",
    "categories": [
      { "id": 22, "parent_id": null, "name": "Leisure" },
      { "id": 33, "parent_id": 22, "name": "Music streaming" }
    ],
    "payment_partner": {
      "id": "c9944518e86e46409e46a52b0f55dee0",
      "name": "Spotify AB"
    }
  },
  {
    "id": "txn-002",
    "amount": -850.00,
    "currency": "EUR",
    "name": "STADTWERKE MÜNCHEN",
    "purpose": "Rechnung 20250501 KD-NR 48291037",
    "booked_at": "2025-05-02T00:00:00.000Z",
    "categories": [
      { "id": 11, "parent_id": null, "name": "Housing" },
      { "id": 15, "parent_id": 11, "name": "Utilities" }
    ],
    "payment_partner": {
      "id": "stw_muc_001",
      "name": "Stadtwerke München"
    }
  },
  {
    "id": "txn-003",
    "amount": 2850.00,
    "currency": "EUR",
    "name": "ACME GMBH",
    "purpose": "Gehalt Mai 2025 Maria Mueller",
    "booked_at": "2025-05-30T00:00:00.000Z",
    "categories": [
      { "id": 1, "parent_id": null, "name": "Income" },
      { "id": 2, "parent_id": 1, "name": "Salary" }
    ],
    "payment_partner": {
      "id": "a1b2c3d4e5f6",
      "name": "Acme GmbH"
    }
  }
]

The response array matches the request array by id. Each transaction is returned with its categories (parent → subcategory chain) and payment_partner (normalised merchant).


Get the category tree

GET https://api.finx-s.qwist.cloud/category-tree

Authentication: HTTP Basic (clientId:clientSecret)

Returns the full category taxonomy as a flat list. Use the Accept-Language header to get category names in your preferred language (de, en, es, fr).

Request:

GET /category-tree
Authorization: Basic {Base64(clientId:clientSecret)}
Accept-Language: en

Response:

[
  { "id": 1,  "parent_id": null, "name": "Income" },
  { "id": 2,  "parent_id": 1,   "name": "Salary" },
  { "id": 3,  "parent_id": 1,   "name": "Freelance income" },
  { "id": 11, "parent_id": null, "name": "Housing" },
  { "id": 15, "parent_id": 11,  "name": "Utilities" },
  { "id": 16, "parent_id": 11,  "name": "Rent" },
  { "id": 22, "parent_id": null, "name": "Leisure" },
  { "id": 33, "parent_id": 22,  "name": "Music streaming" }
]

Categories form a two-level tree. parent_id: null indicates a top-level category. Sub-categories reference their parent by parent_id. Use this endpoint to build your own category display, filter options, or mapping tables.


Understanding categories in responses

Every enriched transaction returns a categories array with the full path from root to leaf:

"categories": [
  { "id": 22, "parent_id": null, "name": "Leisure" },
  { "id": 33, "parent_id": 22,  "name": "Music streaming" }
]

The last item in the array is the most specific (leaf) category. The first item is always a top-level category. Use the leaf category for granular analysis and the top-level for aggregation.


Error handling

CodeMeaning
200 OKAll transactions categorised.
400 Bad RequestMalformed request - check that required fields (id, amount, currency) are present on all transactions.
401 UnauthorizedInvalid client credentials.


Did this page help you?