# Articles

An **Article** is one row in your sales catalogue: a thing you sell,
keyed by the `article_number` you assign in your source system. Articles
are the most important resource in this API — Mercura matches every
position on every incoming customer LV against your articles, so the
quality of the offers you read back depends directly on the quality of
the article catalogue you push.
You can:
- **`POST /articles`** — bulk-upsert up to 100,000 articles and at most
200 MiB in a single call (with translations and ETIM features, send
up to 5,000 per call — see **Jobs → Request size**). Async — returns
a `JobAck`; poll `GET /jobs/{job_id}` for status. Rows with the same `article_number` as an existing row are
updated in place; new rows are inserted. Recommend running this once
per night with the full delta since the last successful job.
- **`GET /articles`** — cursor-paginated list of your articles. Use
`modified_since` on the first page to fetch only the rows that
changed since your last sync.
- **`GET /articles/{article_number}`** — fetch a single article by the
partner-supplied `article_number`.

 - [Data depth and match quality](https://docs.mercura.ai/openapi/articles/data-depth-and-match-quality.md): ### Data depth and match quality The precision of Mercura's article matching depends directly on the **depth and structure** of the article data you push. The more you send, the more accurately Mercur
 - [About ](https://docs.mercura.ai/openapi/articles/about.md): ### About `article_number` Article numbers are partner-supplied and must match the character class `[A-Za-z0-9._\-]{1,255}` so they round-trip safely through URL path segments. `/`, `?`, `#`, and whit
 - [Tags](https://docs.mercura.ai/openapi/articles/tags.md): ### Tags Articles carry **tags** — short labels (e.g. `"LED"`, `"Eigenmarke"`) your team manages in the Mercura admin UI under **Settings → Labels & text templates** (*Article labels*). Send them by *
 - [ETIM features](https://docs.mercura.ai/openapi/articles/etim-features.md): ### ETIM features Push ETIM classification features to sharpen how Mercura matches incoming LV positions against your catalogue. Each feature is one object: ```json { "article_number": "LEU-1500-50
 - [Translations (multilingual catalogues)](https://docs.mercura.ai/openapi/articles/translations-(multilingual-catalogues).md): ### Translations (multilingual catalogues) If your catalogue is maintained in several languages, send the translated display texts alongside each article in a `translations` map, keyed by **lowercase
 - [Soft-deleting articles](https://docs.mercura.ai/openapi/articles/soft-deleting-articles.md): ### Soft-deleting articles Set `is_deleted: true` on an article in a `POST /articles` payload to **hide it everywhere in Mercura** — it stops appearing in catalogue search, AI matching suggestions, an
 - [Lifecycle flags](https://docs.mercura.ai/openapi/articles/lifecycle-flags.md): ### Lifecycle flags Two more boolean flags are accepted on `POST /articles` and returned on the read endpoints (both default `false`): - **`is_diverse`** — marks a catch-all / placeholder ("diverse")
 - [POST /articles](https://docs.mercura.ai/openapi/articles/public_articles_bulk_upsert.md): Bulk-upsert articles (async). Accepts up to 100,000 articles per call. The body is validated synchronously; the actual upsert runs out-of-band on a worker. **Response.** - `202 Accepted` with `JobAck
 - [GET /articles](https://docs.mercura.ai/openapi/articles/public_articles_list.md): Cursor-paginated list of articles.
 - [GET /articles/{article_number}](https://docs.mercura.ai/openapi/articles/public_articles_get.md): Fetch one article by its partner-supplied `article_number`.
