JENNi Retailers API

## Bring a retailer onto JENNi A **retailer** is a business you are bringing onto JENNi — the merchant whose stores you will push inventory for. Registering it gives the merchant a place in the JENNi Console to claim; until they do, the retailer exists but has no owner. You register, you deliver the claim link, you can watch the claim land. ### The flow 1. `POST /provider/v1/retailers` with **your** `external_retailer_id` and the retailer's name — `201` with a `retailer_id`. Store it. Registering the same `external_retailer_id` again is a `200` with the same retailer, never a second one. 2. `POST /provider/v1/retailers/{retailer_id}/claim-links` — `201` with a `url` of the form `{CLAIM_URL_BASE}/claim?r=&t=`: `r` names the retailer being claimed and `t` is a single-use secret that expires at `expires_at` (7 days unless you shorten it). **The URL is shown once** — JENNi keeps only a hash of the token. Deliver it to the merchant yourself (JENNi sends nothing); if it is lost, issue a new link, which supersedes the old one. 3. `GET /provider/v1/retailers/{retailer_id}` — `claim.status` moves from `provisioned` to `invited` (a live link exists) to `claimed` (the merchant signed in and owns it), with `claimed_at` and a secret-free summary of the latest link. Poll it, or show it to your users as onboarding progress. 4. When you register the retailer's stores with `POST /provider/v1/stores`, send the `retailer_id` so JENNi can tie the store to the merchant who claimed it. ### Which key Reads (`GET`) accept a read, write or ingest key. The two `POST`s need a write or ingest key and an `Idempotency-Key` header. Everything is scoped to the provider on your key: no route takes a `provider_id`, and a retailer another provider registered is a `404 retailer-not-found` — exactly the response for an id that was never issued. ### Finding a retailer again `GET /provider/v1/retailers?external_retailer_id=…` returns the retailer you registered under that id (or an empty page). A paged listing of all your retailers, with `claim_status`, `cursor` and `limit`, is planned on the same route and will not break this call. ### Availability This surface is rolling out per environment. Where it is not enabled yet every call answers `503 retailers-unavailable` — retryable, and never a `404` you could mistake for a typo. Everything else in this API works regardless.

GitHub OpenAPI

Operations 4

GET /provider/v1/retailers Find a retailer by your own id #
POST /provider/v1/retailers Register a retailer #
GET /provider/v1/retailers/{retailer_id} Read one retailer #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/jennipro-com:jennipro-com-retailers-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

jennipro-com-retailers-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  contact:
    email: partners@jennipro.com
    name: JENNi partner integrations
  description: 'One API, read by four kinds of partner. **Get started** (left) is the same for everyone:

    sign up, get a key, make five calls. Then pick who you are: each card names the guide to

    read first and the API sections you will actually call, in that order. The sidebar is

    grouped the same way; everything cross-cutting (errors, paging, limits, versioning) sits

    under **Reference** at the end.


    POS systems


    You run the point of sale, inventory or product-data system for retailers, and you push their catalog and live stock into JENNi.


    What you do: register each store, open a run, push products and stock levels (or a full snapshot), close the run, read back what landed.


    Read, then call: POS: catalog & inventory → Stores · Runs · Catalog · Inventory


    First call: POST /provider/v1/stores


    Live in production.


    Brands


    You own the product content — titles, images, descriptions, GTINs — for products that retailers stock, and you want JENNi''s listings to carry your version.


    What you do: send product records through the same ingestion lane a POS uses, then make sure each one clears the readiness bar, because a record that lands but is not ready is never sold.


    Read, then call: Brands → Product readiness → Catalog (listed under POS systems)


    First call: GET /provider/v1/products


    Same lane as POS. Brand-to-retailer matching is handled by JENNi, not by an API call.


    Marketplaces & channels


    You are a demand channel — a marketplace, delivery app or storefront — that lists JENNi merchants'' stock and sends orders back.


    What you do: read one store''s shelf at a time, poll or receive changes, and agree an order path with JENNi (orders in are a JENNi-built adapter, not a public endpoint).


    Read, then call: Marketplace & channel → Channel · Events · Webhooks


    First call: GET /channel/v1/stores


    The read contract is settled and documented; it is enabled per channel — the guide says what is callable today.


    Fulfillment & delivery


    You pick, pack, ship or hand over orders for JENNi merchants.


    What you do: today, plan. The fulfillment service has no partner-callable route; the guide documents what is built so you can scope against it.


    Read: Fulfillment & delivery


    First call: none yet — talk to your JENNi contact.


    Planning only today; talk to your JENNi contact before building.


    ## Before your first call


    - **Get a credential:** *Sign in / Sign up* (top right) → verify your email → *Request a

    key*. JENNi approves it and you claim the secret once — Quickstart walks

    through it.

    - **Base URLs:** `https://prod.jennipro.net` is production; `https://dev.jennipro.app` is the

    sandbox, with its own credentials issued on request.

    - **Credential:** `X-Jenni-Api-Key: .` on every request — see

    Authentication and Scopes. Your tenant and provider come

    from the key; no tenant id ever travels in a path or body.

    - **Errors** are RFC-7807 `application/problem+json`; branch on `type`, quote

    `X-Request-Id` to support — see Errors.

    - **Writes** carry `Idempotency-Key`; lists page with `cursor` + `limit` — see

    Idempotency and Pagination.


    Where a capability is not yet available to partners, the page says so in place.'
  title: JENNi Catalog & Inventory Ingestion Retailers API
  version: '2026-09-20'
servers:
- description: Production
  url: https://prod.jennipro.net
- description: Development / integration sandbox
  url: https://dev.jennipro.app
security:
- PartnerApiKey: []
tags:


# --- truncated at 32 KB (72 KB total) ---
# Full source: https://artifacts.apis.io/jennipro-com/openapi/jennipro-com-retailers-api-openapi.yml