# Successors

**Successors** mark the article that replaces a discontinued one
(`source_article_number` → `successor_article_number`). Pushing them lets
Mercura retarget demand for a phased-out article onto its current
replacement.
You can:
- **`POST /articles/successors`** — bulk-upsert up to 100,000 successor links in a
single call. Async — returns a `JobAck`; poll `GET /jobs/{job_id}` for
status.
- **`GET /articles/successors`** — cursor-paginated list of your successor links.
Pass `source_article_number` to look up one article's successor, or
`modified_since` on the first page to fetch only what changed.

 - [One successor per article](https://docs.mercura.ai/openapi/successors/one-successor-per-article.md): ### One successor per article A source article has **exactly one** active successor. Re-sending a source article with a different `successor_article_number` **replaces** the previous successor — this
 - [Upsert semantics (v1)](https://docs.mercura.ai/openapi/successors/upsert-semantics-(v1).md): ### Upsert semantics (v1) There is **no delete endpoint yet**. A row whose source or successor `article_number` does not exist in your catalogue is **skipped** (counted in the job's `skipped_count`),
 - [POST /articles/successors](https://docs.mercura.ai/openapi/successors/public_successors_bulk_upsert.md): Bulk-upsert successor relationships (async). Accepts up to 100,000 rows per call. Successors are 1:1 per source article: re-sending a source with a new successor replaces the previous one. Rows whose
 - [GET /articles/successors](https://docs.mercura.ai/openapi/successors/public_successors_list.md): Cursor-paginated list of successor relationships.
