---
title: "Create a contact from the LinkedIn profile a reviewer chose"
method: POST
path: "/api/news/submissions/{id}/contacts/{newsContactId}/resolve"
tags: ["News"]
---

# Create a contact from the LinkedIn profile a reviewer chose

`POST /api/news/submissions/{id}/contacts/{newsContactId}/resolve`

## 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}/resolve`
- Auth: HTTP bearer

For a row still waiting on a profile: one the sourcing agent left as needs_review, or one that failed — a failed row keeps its shortlist and the profile that was picked, so the same choice can be sent again without paying for a fresh search. Where the search found nobody, this is also how a reviewer supplies a profile by hand. The scrape is queued on the same paced batch a confident match uses, because it spends a real account's cookie, so the answer arrives on the article page rather than in this response.

## Path parameters

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

## Request body

- ResolveNewsContactRequest
  - `linkedin_url` string, required: The chosen LinkedIn member profile, usually one of the row's sourced candidates.

## Response `202`

The row's 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 or extracted contact not found
- `409`: Already added, or a scrape is already in flight for it
- `422`: Not a LinkedIn member profile URL

---

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