---
title: "Clear an extracted person off the article"
method: DELETE
path: "/api/news/submissions/{id}/contacts/{newsContactId}"
tags: ["News"]
---

# Clear an extracted person off the article

`DELETE /api/news/submissions/{id}/contacts/{newsContactId}`

## Request

- Base URL: `https://api.sponsorunited.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.sponsorunited.com/api/news/submissions/{id}/contacts/{newsContactId}`
- Auth: HTTP bearer

Marks the row dismissed rather than deleting it, the way a dismissed news asset behaves: it leaves the submission payload and stays in the table, so what the extractor produced is still on record and the dismissal can be undone by sending match_status back to needs_review. A row that already produced a platform contact, or that has a scrape running against it, is refused.

## Path parameters

- `id` integer, required
- `newsContactId` integer, required

## Response `200`

The dismissed contact.

- object
  - `data` NewsContactResource: One person extracted from an article, or supplied with it.
    - `id` integer: One extracted person, in the shape the article payload has always used. The submission payload renders every row through this and the single-contact routes render one, so a reviewer editing a contact reads back exactly the shape the article page will show them (OP-1514, OP-1515).
    - `name` string
    - `title` string, nullable
    - `company` string, nullable
    - `role_context` string, nullable
    - `confidence` number, float
    - `source` 'extracted' | 'submitted': Whether the row came from the article's own extraction or arrived with the submission.
    - `submitted_linkedin_url` string, nullable: A LinkedIn profile supplied with the submission. Distinct from the `add.linkedin_url` the sourcing agent finds.
    - `match` NewsExtractionMatch: Entity-mapping resolver verdict for one extracted person (OP-966/967/968).
      - `status` 'pending' | 'auto_match' | 'needs_review' | 'no_match'
      - `confidence` number, float, nullable
      - `resolved_at` string, date-time, nullable
      - `person_profile_id` integer, nullable
      - `contact_id` integer, nullable
      - `contactable_type` 'agency' | 'brand' | 'property', nullable: Morph alias of the resolved entity; pairs with contactable_id to open the Administration Contacts context.
      - `contactable_id` integer, nullable
      - `entity_name` string, nullable: Name of the resolved agency / brand / property.
      - `candidates` object[]: Resolver top-K candidates; empty when the row was never resolved.
    - `current` NewsExtractionMatchedContact, nullable: Present-day platform values of the matched contact, for side-by-side comparison against the extracted ones. Null when the extraction resolved to no contact.
      - `id` integer
      - `name` string, nullable
      - `email` string, nullable
      - `position` string, nullable
      - `linkedin` string, nullable
    - `add` NewsExtractionAdd: Outcome of adding this extracted person to the platform. Contacts only — a quote becomes a note on a contact, never a contact of its own. `not_added` is the only selectable state; `needs_review` means the sourcing agent found profiles but could not choose between them.
      - `status` 'not_added' | 'processing' | 'needs_review' | 'created' | 'updated' | 'failed'
      - `added_at` string, date-time, nullable: When the reviewer clicked Add contacts selected.
      - `contact_id` integer, nullable: The platform contact this row produced.
      - `error` string, nullable: Readable failure reason when status is failed.
      - `linkedin_url` string, nullable: The profile in play for this row: the one it was created from when status is created, or the one last tried when status is processing or failed. With `candidates` still populated, a failed row can offer the same pick again instead of re-running the search.
      - `candidates` object[]: Profiles the agent found but could not choose between. Present when status is needs_review; the reviewer picks one and posts it to the resolve endpoint.
        - `slug` string
        - `linkedin_url` string
        - `title` string
        - `snippet` string
        - `position` integer

## Other responses

- `403`: Forbidden — missing edit news permission
- `404`: Article or extracted contact not found
- `409`: Already added to the platform, or a scrape is in flight for it

---

[API](https://skmtc.dev/sponsorunited/apis/sponsorunited-api.md) - [All operations](https://skmtc.dev/sponsorunited/apis/sponsorunited-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sponsorunited/apis/sponsorunited-api/revisions/cbf1ca5bff8f?raw)
