HomeGuidesAPI Reference
Log In
Guides

Data Enrichment

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 SARLAmazon). 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

GermanyAustriaSpainPortugalFranceItalyNetherlandsBelgiumNorwaySwedenDenmark

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.