No credit file.90 days of evidence.
Kredo reads the PSD2 bank statement of an applicant your bureau has never seen, and returns a 0–100 score your underwriters can explain down to the transaction.
- Income
- Everyday spending
- Gambling, flagged
- Pending, not scored
Approve
100 out of 100, low risk
What moved the score plan-v1
- Gambling severity−0.3
- Income stability+19.1
- Savings rate+8.6
- Regular payments+10.0
- Cross-border transfers−1.5
Gambling rule passed
€10.00 on gambling, out of €5,700.00 income.
- SK-0926-012 −€10.00 Name matched “Casino”
Statement
OK
14 records read, 0 rejected. 1 pending payment not scored.
Sample applicant: a synthetic statement. The result is a real Kredo API response.
The bureau says nothing. The statement says plenty.
Migrants, expats and people new to a country arrive with a job, rent to pay and a bank account, but no local credit history. The bureau returns an empty file, and the application usually stops there.
Kredo doesn’t replace that check. It adds a second one, built on what the applicant’s money actually does, so you can approve people you used to turn away and still know why.
What Kredo scores today
- Explainable score, 0–100
- A risk bucket and an approve, review or decline recommendation, with every factor’s weight and contribution in the response.
- Affordability
- Income stability, regular payments such as rent, savings rate and cross-border transfers, read from the statement’s dates and amounts.
- Gambling rule
- The share of income spent with betting and casino operators against a configurable limit (10% by default). Failing it caps the score.
- Loan check
- Can this applicant carry this loan? Monthly instalment, a debt-to-income verdict and the largest affordable amount.
What comes next
Today’s weights are a transparent starting point. We calibrate them with pilot lenders on real repayment outcomes; every score is versioned and kept from day one.
Run a statement through Kredo
Four sample statements in different provider formats. Pick one and send it to the live API. Samples only, and nothing you run here is stored.
Waiting for a statement
Pick a sample above and send it. The route draws here from the API’s answer, stop by stop.
What the lender sends
…What Kredo returns
Send a sample to see the full response.One statement, five stops
What happens between the provider’s raw data and the decision your underwriter sees.
Provider data
Send the bank’s or aggregator’s JSON exactly as you received it, or upload an MT940 export straight from the bank. No reformatting on your side.
Mapping
Each provider format is one config file. A new provider or a changed format is a new file, not new code, and the format is detected automatically.
Canonical transactions
Exact decimal amounts, ISO currencies, booking dates and direction, with duplicates removed. Ambiguous values such as “1,250.50” in a comma-decimal format are rejected, never guessed.
Quality report
OK, OK with warnings, partial or failed, with every problem located by JSON Pointer. A failed statement is never scored.
Score with reasons
A 0–100 score, bucket and recommendation, each factor’s contribution, and the gambling rule with the transactions that triggered it.
Integrate with one POST
Send the statement, get the score. Every endpoint is described in an OpenAPI spec, with API keys, rate limits, idempotent retries and signed webhooks for async scoring.
Formats read today
- Berlin Group NextGenPSD2
- UK Open Banking v3
- Aggregator JSON export
- MT940 bank export
Mappings are tested against sample responses. During a pilot we verify each one against your provider’s live data.
curl -X POST "$KREDO_API/api/v1/statements/assess?customer_id=app-1042" \
-H "X-API-Key: $KREDO_KEY" \
-H "Content-Type: application/json" \
--data-binary @statement.json
curl -X POST "$KREDO_API/api/v1/score" \
-H "X-API-Key: $KREDO_KEY" \
-H "Content-Type: application/json" \
-d @transactions.json{
"customer_id": "app-1042",
"risk": {
"score": 100,
"bucket": "LOW",
"recommendation": "APPROVE",
"model_version": "plan-v1",
"gambling_rule_override": false,
"factors": [
{ "feature": "income_stability", "value": 0.9553,
"weight": 20, "contribution": 19.11, "impact": "POSITIVE" },
{ "feature": "gambling_severity", "value": 0.0090,
"weight": -35, "contribution": -0.32, "impact": "NEGATIVE" },
…
]
},
"gambling": { "decision": "APPROVED", "gambling_share": 0.0018, … }
}Every decision traces back to a record
- Reasons, not a black box
- Every point of the score can be rebuilt from its factors, and each flagged transaction comes back with its ID and what matched. Your underwriter can show an applicant exactly why.
- Made for the EU AI Act
- Creditworthiness scoring is a high-risk use under the EU AI Act. Kredo’s model is transparent and versioned, and every decision leaves an audit entry with a human-readable rationale.
- Minimal data, erased on request
- Stored assessments keep totals and the decision, not the transactions. One call erases an applicant’s assessments, score history, consents and audit trail. The demo on this page stores nothing.
- Consent first
- Consent is recorded per applicant and can be enforced, so no score is produced without it. Statements arrive through PSD2 access the applicant granted to your lender.
We’ve been the thin-file applicant.
We came to the EU as refugees from Ukraine. We know the gap first-hand: a job and a bank account, but no local history for a bureau to find. Kredo is the second look we wanted lenders to take.
Denys Kozlov
Co-founder
Mykyta Prykhodko
Co-founder
Next stop: a pilot on your applicants.
Tell us about your segment and the providers your statements come from. We’ll run Kredo on statements like yours and scope a pilot together.
We start with microfinance and BNPL lenders in the EU, beginning with Central and Eastern Europe.
Book a pilot call