Prismatic OSINT Business

Prismatic OSINT Business

310 files OSINT

Overview

Prismatic OSINT Business provides adapter pattern implementations for business and financial intelligence sources, integrating with corporate registries, sanctions screening databases, financial disclosure systems, and business intelligence platforms to build comprehensive entity profiles for due diligence and risk assessment. Each adapter normalizes source-specific data formats into the platform's unified entity resolution schema, enabling cross-source correlation through the knowledge graph.

The application implements multi-registry company verification, cross-referencing entity identifiers (ICO, DUNS, LEI, registration numbers) across Czech, European, and global corporate registries to build verified entity profiles with confidence scoring derived from the platform's NABLA epistemic framework. When multiple registries provide conflicting data about an entity's status, ownership, or address, the system preserves both signals following the contradiction preservation axiom rather than arbitrarily choosing one source over another.

Sanctions screening integrates OFAC, EU consolidated, and UN sanctions lists through a unified screening API that supports fuzzy name matching, alias resolution, and date-of-birth verification for natural persons. Corporate structure mapping traces parent-subsidiary relationships across jurisdictions, enabling risk propagation analysis where a sanctioned parent entity's risk status cascades to its subsidiaries with distance-weighted risk score attenuation.

Architecture

Query Router --> Source Adapter --> Response Parser --> Entity Normalizer --> Profile Store
      |               |                   |                    |                    |
  Multi-Registry   ARES/Justice       JSON/XML/HTML        Unified Schema      PostgreSQL
  Parallel Query   Open Corporates    Normalization        Cross-Reference     Knowledge Graph
  Cost Optimizer   OFAC/EU/UN         Validation           Confidence Score    Meilisearch
      |               |                   |                    |                    |
      +---------------+-------------------+--------------------+--------------------+
                                       |
                                Sanctions Screener --> Fuzzy Name Matcher
                                       |
                                Structure Mapper --> Ownership Graph

All parsing and entity normalization follows pure function principles. Network requests execute in isolated processes under the OTP supervision tree with rate limiting and circuit breaker patterns per source. Source credential management handles API key rotation and OAuth2 token refresh automatically.

Key Modules

ModuleResponsibility
PrismaticOsintBusinessPublic facade: company_profile/1, sanctions_check/2, verify_entity/1, corporate_structure/1
PrismaticOsintBusiness.ApplicationOTP application entry point with adapter supervisor
PrismaticOsintBusiness.QueryRouterMulti-registry parallel query orchestration with cost optimization
PrismaticOsintBusiness.SanctionsScreenerUnified sanctions screening across OFAC, EU, and UN lists
PrismaticOsintBusiness.FuzzyMatcherFuzzy name matching with transliteration, alias resolution, and phonetic comparison
PrismaticOsintBusiness.StructureMapperCorporate ownership chain traversal and parent-subsidiary mapping
PrismaticOsintBusiness.EntityNormalizerSource-specific data normalization to unified entity schema
PrismaticOsintBusiness.RiskPropagatorSanctions and risk score cascading through corporate ownership graphs
PrismaticOsintBusiness.CredentialManagerAPI key rotation, OAuth2 token refresh, and rate limit tracking

Key Features

Company Intelligence

Multi-registry verification ensures that entity data is corroborated across independent sources before being established as fact:

defmodule PrismaticOsintBusiness.QueryRouter do
  @spec verify_entity(keyword()) :: {:ok, VerifiedEntity.t()} | {:error, term()}
  def verify_entity(opts) do
    sources = Keyword.get(opts, :sources, [:ares, :justice, :open_corporates])
    identifier = extract_identifier(opts)

    results = Task.async_stream(sources, fn source ->
      {source, query_source(source, identifier)}
    end, max_concurrency: length(sources), timeout: 10_000)
    |> Enum.reduce(%{}, fn {:ok, {source, result}}, acc ->
      Map.put(acc, source, result)
    end)

    case EntityNormalizer.merge_and_score(results) do
      {:ok, entity} ->
        {:ok, %VerifiedEntity{
          entity: entity,
          sources: Map.keys(results),
          consistency: compute_consistency(results),
          discrepancies: detect_discrepancies(results),
          confidence: compute_confidence(results)
        }}

      {:error, reason} ->
        {:error, {:verification_failed, reason}}
    end
  end
end
  • Multi-registry company search and verification across Czech (ARES, Justice.cz), European (Open Corporates), and global sources
  • Officer and director identification with cross-registry verification and historical appointment tracking
  • Corporate structure mapping tracing parent/subsidiary relationships across jurisdictions with ownership percentage tracking
  • Filing and disclosure tracking including annual accounts, ownership changes, and regulatory submissions

Financial Intelligence

  • Sanctions screening across OFAC, EU, and UN lists with fuzzy name resolution and alias matching
  • PEP (Politically Exposed Person) identification through regulatory and public source cross-referencing
  • Adverse media monitoring for negative news, regulatory actions, and enforcement proceedings
  • Financial statement analysis with key ratio extraction and temporal trend detection

Sanctions Screening Engine

The sanctions screening engine implements multi-list fuzzy matching with configurable thresholds and evidence-based result classification:

Sanctions ListUpdate FrequencyMatching MethodCoverage
OFAC SDNDailyFuzzy name + alias + DOBUS designations
EU ConsolidatedDailyTransliteration + fuzzyEU restrictive measures
UN Security CouncilWeeklyMulti-language name matchGlobal designations
HMT (UK)DailyName + address verificationUK sanctions
SECO (Swiss)WeeklyName matchingSwiss regulations

Czech Business Sources

  • ARES integration (business registry) with full entity profile extraction and real-time availability
  • Justice.cz (commercial register) access for corporate filings, board composition, and insolvency status
  • RZP (trade license register) for professional qualification and activity verification
  • CEDR (subsidy tracking) for government grant and support payment monitoring

Cross-Registry Verification

  • Entity identity verification through multi-source cross-referencing with weighted confidence scores
  • Automated detection of inconsistencies between registry sources with audit trail documentation
  • Entity resolution algorithms handling name variations, transliterations, and legal form differences
  • Telemetry emission for verification latency, match rates, and source utilization metrics

Risk Propagation Through Ownership Graphs

When a sanctioned entity is identified, the risk score propagates through the corporate ownership graph with distance-weighted attenuation:

defmodule PrismaticOsintBusiness.RiskPropagator do
  @spec propagate(String.t(), float(), keyword()) :: {:ok, list(map())} | {:error, term()}
  def propagate(entity_id, base_risk, opts \\ []) do
    max_depth = Keyword.get(opts, :max_depth, 5)
    attenuation = Keyword.get(opts, :attenuation, 0.7)

    graph = PrismaticGraph.ownership_subgraph(entity_id, depth: max_depth)

    propagated = traverse_and_score(graph, entity_id, base_risk, attenuation, 0)

    {:ok, Enum.map(propagated, fn {id, score, path} ->
      %{entity_id: id, propagated_risk: score, distance: length(path), path: path}
    end)}
  end
end

Integrated Sources

SourceData TypeKey CapabilityRate Limit
Open CorporatesCompanyGlobal corporate data across 140+ jurisdictions500/day (free)
CrunchbaseBusinessStartup funding, investors, and acquisition data200/day
OFACSanctionsUS sanctions screening with SDN listUnlimited (public)
EU SanctionsSanctionsEU consolidated restrictive measuresUnlimited (public)
ARESCompanyCzech business registry with full entity profiles1000/hour
CEDRFinancialCzech subsidy tracking and grant monitoring500/hour

Usage

# Full company profile from multiple registries
{:ok, profile} = PrismaticOsintBusiness.company_profile(ico: "12345678")
# => %{name: "Example s.r.o.", registries: [:ares, :justice], confidence: 0.96}

# Sanctions screening with fuzzy matching
{:ok, result} = PrismaticOsintBusiness.sanctions_check("Entity Name",
  lists: [:ofac, :eu, :un], threshold: 0.85)
# => %{matches: [...], clear: true, screening_id: "scr_..."}

# Cross-registry entity verification
{:ok, verified} = PrismaticOsintBusiness.verify_entity(
  name: "Example s.r.o.",
  ico: "12345678",
  sources: [:ares, :justice, :open_corporates]
)
# => %{verified: true, consistency: 0.94, discrepancies: []}

# Corporate structure discovery
{:ok, structure} = PrismaticOsintBusiness.corporate_structure(ico: "12345678")
# => %{parent: nil, subsidiaries: [...], ownership_depth: 3, total_entities: 12}

# PEP screening with evidence
{:ok, pep_result} = PrismaticOsintBusiness.pep_check("Person Name",
  jurisdiction: :cz, include_family: true)

NABLA Compliance

NABLA AxiomBusiness OSINT EnforcementImplementation
Provenance MandatoryEvery data point traceable to source registrySource identifier and retrieval timestamp on all records
Signal PluralityEntity verification requires multi-registry corroborationQueryRouter queries minimum 2 independent sources
Contradiction PreservationConflicting registry data preserved without resolutionDiscrepancies tracked and presented alongside confidence scores
Source IndependenceEach registry adapter operates independentlyPer-source process isolation with independent rate limiting
Time DecayRegistry data freshness tracked with staleness warningsTemporal metadata enables freshness-based confidence adjustment

Testing

Company profile tests verify multi-registry data merging, entity normalization accuracy, and confidence score computation against known entity fixtures. Sanctions screening tests verify fuzzy matching accuracy, false positive rates, and list update handling. Corporate structure tests verify ownership chain traversal, risk propagation attenuation, and cycle detection in ownership graphs.

Integration tests exercise the full pipeline from multi-registry query through entity normalization to profile storage. Property-based tests generate random entity names with variations to verify fuzzy matching stability and consistency.

Integration Points

ApplicationRelationship
Prismatic OSINT SourcesBusiness adapters registered in the unified OSINT source catalog
Prismatic OSINT EU InstitutionsEU sanctions and financial data complementing business intelligence
Prismatic Czech AutocrawlerCzech registry data feeding business entity profiles
Prismatic GraphEntity relationship mapping in the knowledge graph
Prismatic DDDue diligence workflows consuming business intelligence profiles
Prismatic ComplianceCompliance framework assessment using sanctions screening data

Performance

OperationLatencyNotes
Single-registry query200ms-2sDepends on source API response time
Multi-registry verification1-5sParallel queries across 3+ registries
Sanctions screening500ms-3sFuzzy matching across all lists
Corporate structure discovery2-10sDepends on ownership graph depth
Entity normalization< 50msPure function transformation
Risk propagation100ms-1sDepends on graph traversal depth

Telemetry events: [:prismatic, :osint_business, :profile_built], [:prismatic, :osint_business, :sanctions_screened], [:prismatic, :osint_business, :entity_verified].


Connect & Contribute

Created by Tomáš Korcak (korczis) | Open Source under GHL