JENNi Portal API

The partner self-service portal: what a signed-in partner USER does with their account — see who they are and which keys their tenant holds, ask JENNi for a key, more scope, production access or help, follow those requests, and claim an approved key (the one moment its secret is shown). Where the deployment advertises `self_serve.keys` (`GET /provider/v1/portal/me`), a sandbox tenant also mints its own keys (`POST /provider/v1/portal/keys`) and rotates or revokes them (`POST /provider/v1/portal/keys/{id}/transitions`) without an operator; `GET /provider/v1/portal/health` is the integration card — tenant, key summary and recent ingestion in one read that degrades section by section instead of failing. These routes are called with a partner access token (`Authorization: Bearer …`, obtained from identity-service's public `POST /v1/partner/auth/login`), never with an API key: a key on a portal route is a `403`, and a partner token on a key route is a `401`. provider-bff forwards each call to identity-service, which owns partner accounts, requests, grants and keys; identity's own refusal comes back with its status and problem `type`. Ships dark behind `ENABLE_PORTAL_ROUTES`.

GitHub OpenAPI

Operations 38

GET /provider/v1/portal/api-requests List redacted API request evidence #
GET /provider/v1/portal/api-requests/{id} Get redacted API request evidence #
GET /provider/v1/portal/grants List your key grants #
POST /provider/v1/portal/grants/{id}/transitions Claim a grant (mint the key) #
GET /provider/v1/portal/health Integration health card #
GET /provider/v1/portal/integrations List connector integrations with health evidence #
GET /provider/v1/portal/integrations/{id} Get one connector integration #
POST /provider/v1/portal/keys Mint an API key (self-serve) #
POST /provider/v1/portal/keys/{id}/transitions Rotate or revoke an API key #
GET /provider/v1/portal/me Session: who is signed in #
GET /provider/v1/portal/merchants List authorized merchants #
GET /provider/v1/portal/merchants/{id} Get an authorized merchant #
GET /provider/v1/portal/notification-preferences Get notification preferences #
PATCH /provider/v1/portal/notification-preferences Update notification preferences #
GET /provider/v1/portal/products/{id} Get one authorized canonical product #
GET /provider/v1/portal/requests List your requests #
POST /provider/v1/portal/requests Ask JENNi for something #
GET /provider/v1/portal/requests/{id} Read one request #
GET /provider/v1/portal/runs List provider runs #
GET /provider/v1/portal/runs/{id} Get a provider run #
GET /provider/v1/portal/runs/{id}/items List provider run item outcomes #
POST /provider/v1/portal/sessions/current/transitions Sign out #
GET /provider/v1/portal/stores List authorized stores #
GET /provider/v1/portal/stores/{store_id} Get an authorized store #
GET /provider/v1/portal/stores/{store_id}/channel-grants List channel grants #
POST /provider/v1/portal/stores/{store_id}/channel-grants Create a channel grant #
POST /provider/v1/portal/stores/{store_id}/channel-grants/{grant_id}/transitions Revoke a channel grant #
GET /provider/v1/portal/stores/{store_id}/health Get bounded store health #
GET /provider/v1/portal/stores/{store_id}/listings List eligibility and publication evidence separately #
GET /provider/v1/portal/stores/{store_id}/products List canonical products and levels for a store #
GET /provider/v1/portal/support/cases List support cases #
POST /provider/v1/portal/support/cases Create a support case #
GET /provider/v1/portal/support/cases/{id} Get a support case #
POST /provider/v1/portal/support/cases/{id}/transitions Reply, resolve, or reopen a support case #
POST /provider/v1/portal/team/invites Invite a developer #
POST /provider/v1/portal/team/invites/accept Accept an invite #
GET /provider/v1/portal/team/members List the team #
POST /provider/v1/portal/team/members/{id}/transitions Remove a member or change a role #

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-portal-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-portal-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 Portal 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 (536 KB total) ---
# Full source: https://artifacts.apis.io/jennipro-com/openapi/jennipro-com-portal-api-openapi.yml