Hinweishelden IBAN API

API for detecting fraudulent IBANs and fake shops.

Questions about the API, or need a trial access? Write to us at peterson@hinweishelden.com. Use of the API is governed by the API Agreement.

Quick Start

The Hinweishelden IBAN API provides access to fraud intelligence data including reported IBANs and associated entities (fake shops, fraudulent offers, etc.). All responses are JSON.

1. Get your API key

Your API key will be provided by the Hinweishelden team. Keep it secure — it cannot be recovered if lost.

2. Test your key

curl -H "X-API-Key: YOUR_API_KEY" https://api.iban.hinweishelden.com/v1/status/auth/

Expected response:

{
  "authenticated": true,
  "user_email": "partner@bank.de",
  "user_status": "general_user"
}

3. Fetch recent IBANs

curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.iban.hinweishelden.com/v1/ibans/?created_after=2026-02-01T00:00:00Z&include_entities=true"

Authentication

All API requests require an API key sent via the X-API-Key header:

X-API-Key: hwh_your_api_key_here

Invalid or missing keys return 401 Unauthorized.

User Tiers

TierAccess
BasicIBANs only (without recipient_name, proof_url, or entities). Entity endpoints return 403.
GeneralFull read access to all endpoints.
StaffFull read/write access including staff endpoints.

Endpoints

All endpoints are prefixed with /v1/.

IBANs

GET /v1/ibans/ — List IBANs with filtering and pagination
GET /v1/ibans/search/ — Search IBANs by ID, IBAN, BIC, or recipient name

List Filters

ParameterTypeDescription
changed_afterISO 8601IBANs changed after this timestamp
created_afterISO 8601IBANs created after this timestamp
report_typestringfraud or release
vop_resultstringFilter by Verification of Payee result: not_checked, match, close_match, no_match, not_possible
include_entitiesbooleanInclude linked entity data in response

Search Parameters

ParameterTypeDescription
idintegerExact ID match
ibanstringExact IBAN match
bicstringExact BIC match
recipient_namestringContains match (case-insensitive)

Example Response

GET /v1/ibans/?changed_after=2026-02-27T00:00:00Z&include_entities=true

{
  "results": [
    {
      "id": 42,
      "recipient_name": "FERREIRA",
      "iban": "FR7614518292670016542294013",
      "bic": "FTNOFRP1XXX",
      "date_of_report": "2026-02-12 00:00:00",
      "timestamp_created": "2026-02-12 06:23:21",
      "timestamp_changed": "2026-02-27 10:05:19",
      "report_type": "fraud",
      "confidence": "black",
      "vop_result": "no_match",
      "vop_checked_at": "2026-02-27 10:05:19",
      "proof_url": "https://s3.hetzner.com/...?X-Amz-Expires=604800&...",
      "comment": null,
      "entities": [
        {
          "id": 7,
          "type": "shop",
          "medium": "website",
          "report_type": "fraud",
          "url": "https://okatode.com",
          "source_category": "reported_internally",
          "sources": [
            "https://www.auktionshilfe.info/thread/35603",
            "https://seitcheck.de/okatode-com/"
          ],
          "comment": "Fake shop selling firewood and pellets. Stolen company data in imprint, no delivery, prepayment only.",
          "shop_screenshot_url": "https://s3.hetzner.com/...?X-Amz-Expires=604800&...",
          "timestamp_created": "2026-02-12 06:23:21",
          "timestamp_changed": "2026-02-27 10:05:19"
        }
      ]
    }
  ],
  "next_cursor": "2026-02-27T10:05:19.210000Z",
  "has_more": true
}

Entities

GET /v1/entities/ — List entities (fake shops, etc.) with pagination
GET /v1/entities/search/ — Search entities by ID or URL

All entities are returned. Screenshots are provided as pre-signed S3 URLs valid for 7 days.

List Filters

ParameterTypeDescription
changed_afterISO 8601Entities changed after this timestamp
created_afterISO 8601Entities created after this timestamp
typestringFilter by entity type (e.g. shop)
mediumstringFilter by medium (e.g. website, letter, sms)
report_typestringfraud or release
source_categorystringFilter by source category
ibanstringOnly entities linked to this exact IBAN

Search Parameters

ParameterTypeDescription
idintegerExact ID match
urlstringContains match (case-insensitive)

Example Response

GET /v1/entities/?created_after=2026-02-01T00:00:00Z

{
  "results": [
    {
      "id": 7,
      "type": "shop",
      "medium": "website",
      "report_type": "fraud",
      "url": "https://okatode.com",
      "source_category": "reported_internally",
      "sources": [
        "https://www.auktionshilfe.info/thread/35603",
        "https://seitcheck.de/okatode-com/"
      ],
      "comment": "Fake shop selling firewood and pellets. Stolen company data in imprint, no delivery, prepayment only.",
      "shop_screenshot_url": "https://s3.hetzner.com/...?X-Amz-Expires=604800&...",
      "timestamp_created": "2026-02-12 06:23:21",
      "timestamp_changed": "2026-02-27 10:05:19"
    }
  ],
  "next_cursor": "2026-02-12T06:23:21.000000Z",
  "next_cursor_id": 7,
  "has_more": false
}

Status

GET /v1/status/ — API health check (no auth required)
GET /v1/status/auth/ — Validate API key

Usage and Credits

Every request to the IBAN and entity endpoints is logged. Accounts are billed in one of two modes:

ModeBehaviour
flatUnlimited requests within the rate limit.
creditsEach request to /v1/ibans/, /v1/ibans/search/, /v1/entities/ or /v1/entities/search/ costs 1 credit per delivered record, at least 1 credit per request. A search with one hit costs 1, a list page with 200 records costs 200. Status endpoints are free. Requests that fail (4xx/5xx) are not charged.

Credits accounts receive the header X-Credits-Remaining on every data response and can read their balance from GET /v1/status/auth/. The page size of a credits account is capped at its remaining balance: with 10 credits left, limit=500 returns 10 records and has_more: true. When the balance reaches zero, requests return 402 with error code credits_exhausted until new credits are added.

Verification of Payee

Every IBAN carries vop_result, the outcome of a Verification of Payee check of the reported recipient name against the account holder at the bank, and vop_checked_at, when that check was made. Values: not_checked (default), match, close_match, no_match, not_possible (the bank does not answer VoP requests). A no_match on a fraud report means the fraudsters use a name that differs from the account holder, which is itself a strong signal.

Access Period and Delayed Data

Two optional restrictions can apply to an account. Both are visible in GET /v1/status/auth/.

FieldBehaviour
access_expires_atTrial or time-limited accounts stop working at this moment. Every request afterwards returns 403 with error code access_expired. null means unlimited.
data_delay_daysDelayed accounts only receive records that are at least this many days old (based on timestamp_created). 0 means no delay.
bank_scopeScoped accounts only receive IBANs whose BIC starts with one of the listed prefixes (e.g. BBVA, BBVADEFF) or whose German bank code matches a listed 8-digit code, plus entities linked to at least one such IBAN. An empty list means all banks.

Polling with a delay: for delayed accounts the parameters created_after, changed_after and cursor are interpreted in visibility time (real time plus the delay), and next_cursor is returned in the same way. A client that polls with created_after set to its last poll time therefore receives every record on the day it becomes visible, with no gaps. Individual records may be delivered more than once; treat the record id as the key.

Pagination

List endpoints use cursor-based pagination. The cursor is an ISO 8601 timestamp.

ParameterDefaultDescription
cursor—Timestamp cursor from previous response's next_cursor
cursor_id—ID cursor from previous response's next_cursor_id
limit100Page size (max 500)

When has_more is true, use both next_cursor and next_cursor_id from the response in your next request to fetch the next page.

Error Responses

All errors follow a consistent format:

{
  "error": {
    "code": "validation_error",
    "message": "Invalid IBAN format.",
    "details": {}
  }
}
HTTP StatusCodeDescription
400validation_errorInvalid request data
401authentication_failedInvalid or missing API key
402credits_exhaustedCredit balance is zero (credits accounts only)
403access_expiredThe account's access period has ended
403permission_deniedInsufficient permissions
404not_foundResource not found
429rate_limitedToo many requests

Pre-signed URLs

Screenshot fields (proof_url, shop_screenshot_url) return pre-signed S3 URLs. These URLs are valid for 7 days from the time of the API response. Fetch new URLs by re-requesting the resource after expiry.


Hinweishelden IBAN API v1.4.0 — Full API Reference