---
title: "Add the extracted contacts a reviewer selected"
method: POST
path: "/api/news/submissions/{id}/contacts/add"
tags: ["News"]
---

# Add the extracted contacts a reviewer selected

`POST /api/news/submissions/{id}/contacts/add`

## 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/add`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/sponsorunited/apis/sponsorunited-api/docs/api/news/submissions/:id/contacts/add/post.ts> (a function with typed inputs; its response is checked against the schema)

Routes each selected row on whether its matched contact still resolves to a live platform contact. Matched rows are updated in place — the article quote is prepended to their notes and nothing else is touched. A matched contact that an agent created after the row was extracted (created_by_agent set, created_at later than the row) was created to add this person, and its row is reported as created instead of updated. Every row also says whether the quote reached the notes. Every selected id is answered individually, so a partial failure stays visible.

## Path parameters

- `id` integer, required

## Request body

- AddNewsContactsRequest
  - `news_contact_ids` integer[], required: Ids of the extracted contacts the reviewer selected. Every id must belong to this article.

## Response `200`

Per-row outcome.

- NewsContactAddResultsResource
  - `results` object[]
    - `news_contact_id` integer: Per-row outcome of an "Add contacts selected" request. Always one entry per selected id, in the order the rows were read, so a partial failure is visible rather than swallowed by a single overall status.
    - `status` 'created' | 'updated' | 'processing' | 'needs_review' | 'already_added' | 'forbidden' | 'failed': `created` when an agent created the platform contact after the row was extracted (created_by_agent set, created_at later than the row), so it was created to add this person; `updated` when it already existed. A row the reviewer selected that did not end up added is `failed`, with the reason in `message`. The stored add_status is retryable, so re-selecting it tries again.
    - `contact_id` integer, nullable: The platform contact this row resolved to.
    - `quote_attached` boolean: Whether the article quote was written to the contact's notes by this request. False when the notes already held it, when no quote matched the person's name, and for every row that was not added.
    - `message` string, nullable: Readable reason, present on forbidden and failed.

## Other responses

- `403`: Forbidden — missing edit news permission
- `404`: Article not found
- `422`: Empty selection, or an id that belongs to another article

---

[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)
