Skip to content

area · AML/KYC Compliance

Automated AML/KYC (art. 492)

Delivered the AML/KYC validation module of an insurance platform end to end: FastAPI backend, a hexagonal adapter with typed ports, a case inbox and a 4-step wizard.

  • Framework-free hexagonal architecture in the domain
  • Blocking import-linter contract in CI against regressions
  • Post-mortem of a nullable discriminator leaking data across modules
  • python
  • fastapi
  • sqlalchemy
  • postgresql
  • pytest

◆ KycPipeline

Every verdict explains why

This is how the KYC engine processes a file: five steps, from attachments to verdict. Scroll to walk through them; on the right, the verdict with the reason for each check.

  1. Ingest

    Receives the policy request's attachments.

    3 attachments · id.pdf · proof-of-address.jpg · tax-certificate.pdf

  2. Classify

    Identifies each document's type and discards the ones that don't belong.

    id → voter ID · proof → utility bill · certificate → tax status

  3. Extract

    Extracts the fields with an LLM and normalizes them to a typed schema.

    { "name": "Ana Ejemplo Ruiz", "rfc": "EERA850101XX0", "address": "12 Fictional St" }

  4. Checks

    Runs checks and cross-validations by person type and risk tier.

    validity · name match · recent address · RFC ↔ certificate cross-check

  5. Verdict

    Stores the result with the reason for each check, ready for review.

    needs review · 3 of 4 checks OK · 1 to review

verdict

Ana Ejemplo Ruiz · individual · new client

Needs review

  • ID validity : passed

    Expires in 2029: valid on the request date.

  • Name match : passed

    The name matches across all three documents.

  • Recent proof of address : to review

    It is 95 days old; the policy requires 90 or fewer.

  • RFC ↔ tax certificate cross-check : passed

    The extracted RFC matches the one on the certificate.

Demo with fictitious data: no real clients and nothing from production.

Cases

  • Hexagonal architecture

    A framework-free domain package with typed ports that a second engineer kept building on.

    Read the case study →
  • Boundaries with import-linter

    I led the implementation of a repository layer in 15+ slices over 3 days, protected by characterization tests and a blocking import-linter contract in CI.

  • The nullable discriminator bug

    A recurring cross-module data leak came from an untyped nullable column. I showed why the tests missed it and wrote the contract that fixed it.

  • Minca AI · 2026in production

    Automated KYC engine

    End-to-end owner

    AML/KYC module of an insurance platform (art. 492): it ingests a request's attachments, classifies them, extracts their fields, runs checks and stores a verdict with the reason for each one.

    code commits in 8 weeks
    224
    lines of Python
    +40.8k
    • Python
    • FastAPI
    • SQLAlchemy
    • React
    • pytest

Shall we build something reliable?

I reply in English or Spanish.

Email me on Gmail