> ## Documentation Index
> Fetch the complete documentation index at: https://docs.parcha.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Adverse Media Screening Check

> Identify potential risks by analyzing news articles, media coverage, and customer reviews related to a business

The adverse media screening check analyzes news articles, media coverage, and other public sources to identify potential risks or concerns associated with a business. The check searches multiple data sources including Refinitiv World Check, ComplyAdvantage, and Google News to build comprehensive adverse media profiles.

## Check ID

`kyb.adverse_media_screening_check_v2`

## Response Structure

The check result contains a list of verified adverse media hits, where each hit represents a business profile found in adverse media sources along with detailed article information and metadata.

```typescript theme={null}
{
  type: "KYBAdverseMediaScreeningCheckResultV2";
  verified_adverse_media_hits: Array<BusinessAdverseMediaProfile>;
}
```

### BusinessAdverseMediaProfile Structure

Each adverse media profile contains comprehensive information about a business found in adverse media sources:

```typescript theme={null}
{
  // Identification
  id: string;                    // Short unique identifier (8 characters)
  reference_id: string | null;   // External reference ID from data source
  business_name: string | null;  // Name of the business in the profile

  // Geographic Information
  associated_countries: Array<StandardizedCountry>;
  associated_addresses: Array<Address>;
  location: string | null;       // e.g., "Houston, TX"

  // Weblinks and Articles
  weblinks: Array<Weblink>;      // Detailed article references with metadata

  // Classification
  is_perpetrator: boolean | null;  // Whether business is perpetrator of the event
  topics: Array<string>;           // Event topics (e.g., "Regulatory Violations", "Legal Disputes")
  title: string | null;            // Brief title summarizing the event
  summary: string | null;          // Summary of the adverse media event
  when: string | null;             // When the event occurred

  // Matching and Review
  profile_review: BusinessProfileReview;  // Match analysis and ratings
  escalate_for_review: boolean;           // Whether to escalate for manual review
  vendor: string | null;                  // Data source vendor (e.g., "refinitiv_world_check")
}
```

### Weblink Structure

Each weblink represents a specific article or source with full metadata:

```typescript theme={null}
{
  // Identification
  id: string;                    // Unique ID (6 characters)
  url: string | null;            // Article URL
  title: string | null;          // Article title

  // Temporal and Geographic Data
  date: string | null;           // Date from the weblink
  when: string | null;           // When the event occurred (e.g., "2025")
  where_countries: Array<string>; // Countries mentioned in article
  where_cities: Array<string>;    // Cities mentioned in article

  // Content
  summary: string | null;        // Summary of the article
  scanned_website: ScannedWebsite;  // Full scraped webpage content
  metadata: BusinessArticleMetadataV1;  // Structured article metadata

  // Source Information
  article_source: ArticleSource;  // Source type (e.g., "serp_google_search", "refinitiv_world_check")

  // Status
  has_photo: boolean | null;
  is_dead_url: boolean | null;
}
```

### BusinessArticleMetadataV1 Structure

Detailed metadata extracted from each article using LLM analysis:

```typescript theme={null}
{
  type: "BusinessArticleMetadataV1";
  id: string;

  // Article Classification
  adverse_media_article_title: string | null;
  is_adverse_media_article: boolean;    // Whether this is adverse media
  topics: Array<string> | null;         // Topics like "Regulatory Violations", "Legal Disputes"

  // Business Involvement
  is_perpetrator: boolean;               // Whether business is the perpetrator
  is_hit_business_name_found: boolean;  // Whether business name was found in article
  hit_business_name_value_found: string | null;  // Exact business name found

  // Geographic Context
  associated_addresses: Array<Address>;
  associated_countries: Array<string>;

  // Temporal Context
  year_of_the_crime: number | null;           // Year the event occurred
  year_of_article_publication: number | null; // Year article was published

  // Event Details
  summary_of_event: string | null;            // Summary of the main event
  summary_of_relation_to_crime: string | null;  // How business relates to the event
  quote_from_article: string | null;          // Direct quote from the article
  source_url: string | null;                  // Article URL
}
```

### ScannedWebsite Structure

Raw scraped content from the webpage:

```typescript theme={null}
{
  type: "ScannedWebsite";
  source_id: string;                 // Unique source ID (6 characters)
  source_name: string | null;        // Name of the source
  webpage_url: string | null;        // URL of the webpage
  webpage_title: string | null;      // Page title
  webpage_text: string | null;       // Full text content
  screenshot_url: string | null;     // Screenshot URL
  pdf_snapshot_url: string | null;   // PDF snapshot URL
  response_code: number;             // HTTP response code
  is_valid_url: boolean | null;      // Whether URL is accessible
  language: string | null;           // Language of the content
  publication_date: string | null;   // Publication date
  scrape_type: ScrapeType;           // Type of scrape ("generic", etc.)
  error: string | null;              // Error message if scraping failed
  cloudflare_encountered: boolean;   // Whether Cloudflare protection was encountered
}
```

### BusinessProfileReview Structure

Match analysis and confidence scoring:

```typescript theme={null}
{
  id: string;                                  // Review ID (8 characters)
  business_name_match: BusinessNameMatch | null;  // Business name match result
  address_matches: Array<AddressMatch> | null;     // Address match results
  best_address_match: AddressMatch | null;         // Best matching address
  match_rating: HitMatch | null;                   // Overall match confidence
}
```

### Match Rating System

The `match_rating` field uses the following enum values:

* **`strong_match`**: High confidence that the adverse media refers to the screened business
  * Business name matches closely
  * Location matches
  * Other identifying details align

* **`partial_match`**: Moderate confidence in the match
  * Business name is similar but not exact
  * Some geographic or contextual alignment
  * May require manual review

* **`weak_match`**: Low confidence in the match
  * Name similarity is limited
  * Location may not match
  * Likely a different business with a similar name

* **`no_match`**: Clear mismatch
  * Business name is significantly different
  * Location doesn't match
  * Context clearly indicates a different entity

* **`unknown`**: Unable to determine match confidence
  * Insufficient information available
  * Ambiguous details

## Example Response

```json theme={null}
{
  "type": "KYBAdverseMediaScreeningCheckResultV2",
  "verified_adverse_media_hits": [
    {
      "id": "tm2m3kdz",
      "reference_id": null,
      "business_name": "Empower Pharmacy",
      "associated_countries": [
        {
          "original_country_input": "United States",
          "country_name": "United States of America",
          "alpha_2_country_code": "US",
          "alpha_3_country_code": "USA",
          "numeric_country_code": "840"
        }
      ],
      "associated_addresses": [
        {
          "type": "Address",
          "street_1": null,
          "street_2": null,
          "city": "Houston",
          "state": null,
          "country_code": "US",
          "postal_code": null
        }
      ],
      "weblinks": [
        {
          "id": "ijbjo6cc",
          "url": "https://lawgaze.com/empower-pharmacy-lawsuit/",
          "date": null,
          "has_photo": null,
          "is_dead_url": null,
          "summary": "Empower Pharmacy is the defendant in regulatory disputes with the FDA over alleged sterility concerns, labeling violations, and compliance failures.",
          "when": "2025",
          "where_countries": ["United States"],
          "where_cities": ["Houston"],
          "scanned_website": {
            "type": "ScannedWebsite",
            "source_id": "nbxery",
            "webpage_url": null,
            "webpage_title": "Empower Pharmacy Lawsuit: FDA Disputes and Legal Battles",
            "response_code": 200,
            "scrape_type": "generic",
            "cloudflare_encountered": false,
            "error": null
          },
          "metadata": {
            "type": "BusinessArticleMetadataV1",
            "id": "ijbjo6cc",
            "topics": ["Regulatory Violations", "Legal Disputes", "Compliance Issues"],
            "adverse_media_article_title": "Empower Pharmacy Lawsuit: FDA Disputes and Legal Battles",
            "is_adverse_media_article": true,
            "is_perpetrator": false,
            "is_hit_business_name_found": true,
            "hit_business_name_value_found": "Empower Pharmacy",
            "associated_addresses": [
              {
                "type": "Address",
                "street_1": null,
                "street_2": null,
                "city": "Houston",
                "state": "Texas",
                "country_code": "US",
                "postal_code": null
              }
            ],
            "associated_countries": ["United States"],
            "year_of_the_crime": 2025,
            "year_of_article_publication": 2025,
            "summary_of_relation_to_crime": "Empower Pharmacy is the defendant in regulatory disputes with the FDA over alleged sterility concerns, labeling violations, and compliance failures.",
            "summary_of_event": "The FDA has alleged that Empower Pharmacy, one of the largest compounding pharmacies in the US, has violated regulations regarding sterility standards, labeling compliance, and drug manufacturing practices.",
            "source_url": "https://lawgaze.com/empower-pharmacy-lawsuit/",
            "quote_from_article": "Empower Pharmacy, one of the largest compounding pharmacies in the United States, has found itself at the center of a legal storm."
          },
          "title": "Empower Pharmacy Lawsuit: FDA Disputes and Legal Battles",
          "article_source": "serp_google_search"
        }
      ],
      "is_perpetrator": null,
      "topics": [],
      "title": null,
      "summary": null,
      "when": null,
      "profile_review": {
        "id": "abc123de",
        "business_name_match": null,
        "address_matches": null,
        "best_address_match": null,
        "match_rating": {
          "match": "partial_match",
          "reason": "Business name matches, location matches, but needs manual review"
        }
      },
      "escalate_for_review": true,
      "vendor": null
    }
  ]
}
```

## Response Fields

<ResponseField name="type" type="string">
  Always `"KYBAdverseMediaScreeningCheckResultV2"`.
</ResponseField>

<ResponseField name="verified_adverse_media_hits" type="array">
  List of verified adverse media profiles for the business. Each profile represents a business found in adverse media sources.

  <Expandable title="BusinessAdverseMediaProfile Fields">
    <ResponseField name="id" type="string">
      Short unique identifier (8 characters) for this profile.
    </ResponseField>

    <ResponseField name="reference_id" type="string | null">
      External reference ID from the data source (e.g., Refinitiv World Check ID).
    </ResponseField>

    <ResponseField name="business_name" type="string | null">
      Name of the business in the adverse media profile.
    </ResponseField>

    <ResponseField name="associated_countries" type="array">
      Countries associated with the business in the adverse media.

      <ResponseField name="country_name" type="string">
        Full country name (e.g., "United States of America").
      </ResponseField>

      <ResponseField name="alpha_2_country_code" type="string">
        ISO 3166-1 alpha-2 code (e.g., "US").
      </ResponseField>

      <ResponseField name="alpha_3_country_code" type="string">
        ISO 3166-1 alpha-3 code (e.g., "USA").
      </ResponseField>
    </ResponseField>

    <ResponseField name="associated_addresses" type="array">
      Addresses associated with the business in the adverse media.

      <ResponseField name="city" type="string | null">
        City name.
      </ResponseField>

      <ResponseField name="state" type="string | null">
        State or province.
      </ResponseField>

      <ResponseField name="country_code" type="string | null">
        ISO 3166-1 alpha-2 country code.
      </ResponseField>
    </ResponseField>

    <ResponseField name="weblinks" type="array">
      Array of article references with detailed metadata. See [Weblink Structure](#weblink-structure) above.

      <ResponseField name="url" type="string | null">
        URL of the article or source.
      </ResponseField>

      <ResponseField name="title" type="string | null">
        Title of the article.
      </ResponseField>

      <ResponseField name="summary" type="string | null">
        Summary of the article content.
      </ResponseField>

      <ResponseField name="when" type="string | null">
        When the event occurred (e.g., "2025", "2024-2025").
      </ResponseField>

      <ResponseField name="where_countries" type="array">
        Countries mentioned in the article.
      </ResponseField>

      <ResponseField name="where_cities" type="array">
        Cities mentioned in the article.
      </ResponseField>

      <ResponseField name="metadata" type="object">
        Structured metadata extracted from the article using LLM analysis.

        <ResponseField name="topics" type="array">
          Event topics (e.g., "Regulatory Violations", "Legal Disputes", "Compliance Issues").
        </ResponseField>

        <ResponseField name="is_adverse_media_article" type="boolean">
          Whether this is classified as adverse media.
        </ResponseField>

        <ResponseField name="is_perpetrator" type="boolean">
          Whether the business is the perpetrator of the event described.
        </ResponseField>

        <ResponseField name="year_of_the_crime" type="number | null">
          Year when the event occurred.
        </ResponseField>

        <ResponseField name="year_of_article_publication" type="number | null">
          Year when the article was published.
        </ResponseField>

        <ResponseField name="summary_of_event" type="string | null">
          Summary of the main event described in the article.
        </ResponseField>

        <ResponseField name="summary_of_relation_to_crime" type="string | null">
          Summary of how the business relates to the event.
        </ResponseField>

        <ResponseField name="quote_from_article" type="string | null">
          Direct quote from the article about the business.
        </ResponseField>
      </ResponseField>

      <ResponseField name="article_source" type="string">
        Source of the article. Possible values:

        * `serp_google_search` - Google Search results
        * `serp_google_news` - Google News
        * `refinitiv_world_check` - Refinitiv World-Check
        * `comply_advantage` - ComplyAdvantage
        * Other source identifiers
      </ResponseField>
    </ResponseField>

    <ResponseField name="is_perpetrator" type="boolean | null">
      Whether the business is the perpetrator of the adverse event.
    </ResponseField>

    <ResponseField name="profile_review" type="object">
      Match analysis and confidence scoring for this profile.

      <ResponseField name="match_rating" type="object | null">
        Overall match confidence rating.

        <ResponseField name="match" type="string">
          Match strength: `strong_match`, `partial_match`, `weak_match`, `no_match`, or `unknown`.
        </ResponseField>

        <ResponseField name="reason" type="string | null">
          Explanation for the match rating.
        </ResponseField>
      </ResponseField>
    </ResponseField>

    <ResponseField name="escalate_for_review" type="boolean">
      Whether this profile should be escalated for manual review based on match ratings and risk thresholds.
    </ResponseField>
  </Expandable>
</ResponseField>

## Article Sources

The check aggregates adverse media from multiple sources:

### Primary Data Sources

* **Refinitiv World-Check** (`refinitiv_world_check`)
  * Global risk intelligence database
  * PEPs, sanctions, and adverse media

* **ComplyAdvantage** (`comply_advantage`)
  * Real-time risk database
  * Comprehensive adverse media coverage

### Search Engine Sources

* **Google Search** (`serp_google_search`)
  * Web search results for adverse media
  * Broad coverage of online content

* **Google News** (`serp_google_news`)
  * News-specific search results
  * Recent and archived news articles

* **Brave Search** (`serp_brave_search`, `serp_brave_news`)
  * Privacy-focused search engine results

### Other Sources

* **Opoint** (`opoint`)
  * Specialized adverse media intelligence

* **Other** (`other`)
  * Miscellaneous or unclassified sources

## Key Components

### Article Metadata Extraction

Each article undergoes LLM-powered analysis to extract:

1. **Event Classification**: Topics and categories (regulatory, legal, financial, etc.)
2. **Business Involvement**: Whether business is perpetrator, victim, or mentioned
3. **Geographic Context**: Countries and cities mentioned
4. **Temporal Context**: When the event occurred and when it was published
5. **Relationship Analysis**: How the business relates to the adverse event
6. **Evidence Extraction**: Direct quotes and summaries

### Match Confidence Scoring

The system evaluates multiple factors to determine match confidence:

* Business name similarity and exact matches
* Geographic alignment (addresses, cities, countries)
* Contextual relevance
* Article quality and recency
* Source reliability

### Escalation Logic

Profiles are escalated for manual review based on:

1. **Match Rating**: Strong and partial matches typically escalated
2. **Event Severity**: Regulatory violations, criminal activity, major fraud
3. **Recency**: Recent events (within last 2-5 years)
4. **Volume**: Multiple articles about the same event
5. **Source Quality**: Articles from reputable sources

## Common Topics

Articles are categorized into topics such as:

* **Regulatory Violations**: FDA warnings, compliance failures, regulatory actions
* **Legal Disputes**: Lawsuits, legal battles, civil litigation
* **Compliance Issues**: Failure to meet standards, policy violations
* **Safety Issues**: Product safety, public health concerns
* **Financial Misconduct**: Fraud, embezzlement, financial crimes
* **Criminal Activity**: Criminal charges, investigations
* **Operational Problems**: Business failures, bankruptcy
* **Reputational Concerns**: Scandals, negative publicity

## Implementation Details

### Pydantic Schema Location

* **Main Schema**: `ai/data_loaders/schema/kyb_schema.py`
* **Base Classes**: `ai/data_loaders/schema/base.py`
* **Models**: `ai/tools/bdd/bdd_models.py`

### Data Loader

`ai/data_loaders/kyb_adverse_media_profile_loader_v2.py`

### Tool Implementation

`ai/tools/kyb/kyb_adverse_media_screening_check_v2.py`

## Filtering Examples

Use JSONPath queries to extract specific fields from the check results:

```bash theme={null}
# Get only articles from Google Search
?jsonpath_query=$.check_results[?(@.command_id=='kyb.adverse_media_screening_check_v2')].payload.verified_adverse_media_hits[*].weblinks[?(@.article_source=='serp_google_search')]

# Get only articles where business is the perpetrator
?jsonpath_query=$.check_results[?(@.command_id=='kyb.adverse_media_screening_check_v2')].payload.verified_adverse_media_hits[*].weblinks[?(@.metadata.is_perpetrator==true)]

# Extract all article titles
?jsonpath_query=$.check_results[?(@.command_id=='kyb.adverse_media_screening_check_v2')].payload.verified_adverse_media_hits[*].weblinks[*].title

# Get articles about regulatory violations
?jsonpath_query=$.check_results[?(@.command_id=='kyb.adverse_media_screening_check_v2')].payload.verified_adverse_media_hits[*].weblinks[?(@.metadata.topics[*]=='Regulatory Violations')]
```

See [getJobById filtering documentation](/api-reference/getJobById#filtering-check-results) for more JSONPath query examples.
