Negative Media Screening
Retrieve the latest negative media screening result for a verification entity or a specific stakeholder. Negative media screening searches the public web for adverse press about an individual or entity (and, for KYB verifications, each stakeholder), and uses bronID's summarization layer to flag articles that describe negative findings.
Overview
When screening completes, a webhook is sent with the updated idvRisk and a screening.negativeMedia summary. Use the endpoints below to retrieve full screening details including matched articles.
These read-only endpoints return the most recent screening result, including:
- Findings — overall flag and count of articles flagged as negative
- Articles — the search results bronID resolved, each with a per-article summary and
isNegativeflag
Three endpoints are available — two for retrieving the latest screening result, and one for triggering a new screening run on demand:
- GET
/v5/verifications/:trace/negative-media/latest- Get entity screening result - GET
/v5/verifications/:trace/stakeholders/:stakeholderId/negative-media/latest- Get stakeholder screening result - POST
/v5/verifications/:trace/negative-media- Trigger a new screening run
Negative media is opt-in per service. It runs automatically when a verification reaches verified status only if runNegativeMediaScreeningOnVerification is enabled in the service's screening configuration. Manual rescreens via this endpoint always run regardless of the flag.
Get entity screening
Retrieve the latest negative media screening result for the verification entity.
Path parameters
- Name
trace- Type
- string
- Description
The unique identifier for the verification.
Response fields
| Field | Type | Description |
|---|---|---|
screeningId | string | Unique identifier for the screening run. |
trace | string | The verification trace. |
totalArticles | number | Total number of articles returned by the upstream search. |
findingCount | number | Count of articles flagged as negative by bronID's summarization layer. |
hasFindings | boolean | Convenience flag — true when findingCount > 0. |
isNegative | boolean | Overall negative flag — true if any article in articles is negative. |
summary | string | Overall summary across all articles. |
articles | array | The articles returned and analyzed. See Articles. |
triggeredByAction | string | What triggered the screening: "on-verified", "manual-api", "manual-portal", or "scheduled". |
triggeredByUid | string | UID of the user who triggered the screening (optional, present on manual triggers). |
triggeredByEmail | string | Email of the user who triggered the screening (optional, present on manual triggers). |
screenedAt | number | Unix timestamp of when the screening was performed (milliseconds). |
screenedTime | string | Human-readable screening time. |
createdAt | number | Unix timestamp of when the record was created (milliseconds). |
createdTime | string | Human-readable creation time. |
Error responses
| Status Code | Error Type | Description |
|---|---|---|
| 404 | not_found | No negative media screening exists for this verification. |
Request
curl -X GET "https://api.bronid.com/v5/verifications/{trace}/negative-media/latest" \
-H "Authorization: Basic {credentials}"
Response
{
"timestamp": "2026-02-28T04:00:00.000Z",
"serviceUid": "5qA5Hq0n1JQTY2TASItxYXSRyND3",
"trace": "abc123-verification-trace",
"path": "/v5/verifications/:trace/negative-media/latest",
"pathParams": {
"trace": "abc123-verification-trace"
},
"statusCode": 200,
"message": "Negative media screening retrieved successfully.",
"help": null,
"status": "success",
"data": {
"screeningId": "scr-nm-abc123",
"trace": "abc123-verification-trace",
"totalArticles": 0,
"findingCount": 0,
"hasFindings": false,
"isNegative": false,
"summary": "",
"articles": [],
"triggeredByAction": "on-verified",
"screenedAt": 1740715200000,
"screenedTime": "28/02/2026 04:00:00",
"createdAt": 1740715200000,
"createdTime": "28/02/2026 04:00:00"
},
"error": null
}
Error response (404)
{
"timestamp": "2026-02-28T04:00:00.000Z",
"serviceUid": "5qA5Hq0n1JQTY2TASItxYXSRyND3",
"trace": "abc123-verification-trace",
"path": "/v5/verifications/:trace/negative-media/latest",
"pathParams": {
"trace": "abc123-verification-trace"
},
"statusCode": 404,
"message": "Not found",
"help": null,
"status": "error",
"data": null,
"error": {
"type": "not_found",
"details": [
{
"message": "Negative media screening not found",
"code": "not_found",
"path": ["screening"]
}
]
}
}
Get stakeholder screening
Retrieve the latest negative media screening result for a specific stakeholder within a verification.
Path parameters
- Name
trace- Type
- string
- Description
The unique identifier for the verification.
- Name
stakeholderId- Type
- string
- Description
The unique identifier for the stakeholder.
Response fields
The response fields are identical to the entity screening response, with the addition of:
| Field | Type | Description |
|---|---|---|
stakeholderId | string | The stakeholder that was screened. |
Error responses
| Status Code | Error Type | Description |
|---|---|---|
| 404 | not_found | No negative media screening exists for this stakeholder. |
| 422 | validation_error | Invalid stakeholder ID (e.g. empty or whitespace). |
Request
curl -X GET "https://api.bronid.com/v5/verifications/{trace}/stakeholders/{stakeholderId}/negative-media/latest" \
-H "Authorization: Basic {credentials}"
Response
{
"timestamp": "2026-02-28T04:00:00.000Z",
"serviceUid": "5qA5Hq0n1JQTY2TASItxYXSRyND3",
"trace": "abc123-verification-trace",
"path": "/v5/verifications/:trace/stakeholders/:stakeholderId/negative-media/latest",
"pathParams": {
"trace": "abc123-verification-trace",
"stakeholderId": "sth-director-001"
},
"statusCode": 200,
"message": "Negative media screening retrieved successfully.",
"help": null,
"status": "success",
"data": {
"screeningId": "scr-nm-def456",
"trace": "abc123-verification-trace",
"stakeholderId": "sth-director-001",
"totalArticles": 2,
"findingCount": 1,
"hasFindings": true,
"isNegative": true,
"summary": "One article references alleged misconduct involving the stakeholder.",
"articles": [
{
"title": "Director linked to alleged misconduct",
"link": "https://example.com/news/article-1",
"displayLink": "example.com",
"snippet": "An investigation alleges...",
"summary": "The article describes an ongoing investigation into the stakeholder.",
"isNegative": true,
"publishedAt": "2026-02-15"
},
{
"title": "Director appointed to advisory board",
"link": "https://example.com/news/article-2",
"displayLink": "example.com",
"snippet": "The stakeholder has been appointed...",
"summary": "The article reports a new advisory appointment.",
"isNegative": false,
"publishedAt": "2026-01-20"
}
],
"triggeredByAction": "on-verified",
"screenedAt": 1740715200000,
"screenedTime": "28/02/2026 04:00:00",
"createdAt": 1740715200000,
"createdTime": "28/02/2026 04:00:00"
},
"error": null
}
Articles
Each entry in articles represents a single search result analyzed by bronID's summarization layer.
| Field | Type | Description |
|---|---|---|
title | string | Article title. |
link | string | Article URL. |
displayLink | string | Display-friendly URL (typically the host). |
snippet | string | Search-result snippet. |
summary | string | bronID-derived per-article summary. |
isNegative | boolean | bronID-derived flag — true if the article describes a negative finding. |
publishedAt | string | ISO 8601 publication date if exposed by the source (optional). |
Trigger a rescreen
Dispatches a negative media rescreen for an existing verification. This is an asynchronous operation — the endpoint returns a jobId immediately, and the full screening cascade (stakeholders → stakeholder risk → entity → entity risk) runs in the background.
Poll GET /v5/verifications/:trace/jobs/negativeMedia/:jobId to check lifecycle status. See the Jobs reference for the full status machine and the in-flight debounce behavior.
429 with the jobId of the in-flight dispatch so you can poll that instead of starting a new one.Path parameters
- Name
trace- Type
- string
- Description
The unique identifier for the verification to rescreen. Must refer to a v5 verification.
Request body
No fields. Send an empty JSON object ({}).
Response fields
| Field | Type | Description |
|---|---|---|
triggered | boolean | Always true on a 200 response. |
jobId | string | The dispatched job's ID. Use it to poll status via the jobs endpoint. |
Error responses
| Status Code | Error Type | Description |
|---|---|---|
| 404 | not_found | No v5 verification exists for the given trace. |
| 429 | too_many_requests | A rescreen is already in flight for this verification. Response message includes the conflicting job's jobId; poll it instead of retrying immediately. |
Request
curl -X POST "https://api.bronid.com/v5/verifications/{trace}/negative-media" \
-H "Authorization: Basic {credentials}" \
-H "Content-Type: application/json" \
-d '{}'
Response
{
"timestamp": "2026-02-28T04:00:00.000Z",
"serviceUid": "5qA5Hq0n1JQTY2TASItxYXSRyND3",
"trace": "abc123-verification-trace",
"path": "/v5/verifications/:trace/negative-media",
"pathParams": {
"trace": "abc123-verification-trace"
},
"statusCode": 200,
"message": "Negative media rescreen dispatched.",
"help": null,
"status": "success",
"data": {
"triggered": true,
"jobId": "V1StGXR8_Z5jdHi6B-myT"
},
"error": null
}
Error response (429 – already in flight)
{
"timestamp": "2026-02-28T04:00:00.000Z",
"serviceUid": "5qA5Hq0n1JQTY2TASItxYXSRyND3",
"trace": "abc123-verification-trace",
"path": "/v5/verifications/:trace/negative-media",
"pathParams": {
"trace": "abc123-verification-trace"
},
"statusCode": 429,
"message": "Negative media rescreen already in progress (jobId: V1StGXR8_Z5jdHi6B-myT). Poll its job doc for status.",
"help": null,
"status": "error",
"data": null,
"error": {
"type": "too_many_requests",
"details": [
{
"message": "Conflicting in-flight job: V1StGXR8_Z5jdHi6B-myT",
"code": "too_many_requests",
"path": ["trace"]
}
]
}
}
Result delivery
Negative media results are delivered through the same webhook channel as other risk events. When the cascade completes, the verification webhook fires with the updated idvRisk and a screening.negativeMedia summary. Use the jobId returned from the rescreen endpoint to follow lifecycle state via the Jobs endpoint while you wait.
Screening summary
The webhook payload's screening.negativeMedia field summarizes the latest screening outcome.
| Field | Type | Description |
|---|---|---|
status | string | "not_screened", "clear", or "findings_present". |
findingCount | number | Count of articles flagged as negative by bronID's summarization layer. |
lastScreenedAt | number | Unix timestamp of when the screening was performed (milliseconds). |
lastScreenedTime | string | Human-readable screening time. |
IDV risk factor
Negative media contributes to the calculated IDV risk via the negativeMedia factor:
findingCount | Factor status | Factor risk |
|---|---|---|
null (never screened) | not_screened | unknown |
0 | clear | low |
> 0 | findings_present | medium_high |
The final IDV risk is the maximum across all factors, so a high-risk country still dominates a medium_high negative-media factor. See IDV risks for the full risk model.
Stakeholders (KYB)
For KYB verifications, every stakeholder is screened in parallel with the entity. The cascade runs:
- Each stakeholder is screened and their stakeholder risk is recalculated.
- The entity is screened and the entity risk is recalculated.
Each stakeholder run is billed separately for parity with the watchlist cascade. See the per-service screening configuration in the bronID portal for details.