marketplace
GET /v1/marketplace/{vertical}/{slug}
One live Zinn®, as anyone sees it.
Authentication
Send an API key as a bearer token. This endpoint does not state a specific permission in the specification, so give your key the least it needs and check the response rather than assuming.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X GET https://api.zinndigital.com/v1/marketplace/{vertical}/{slug} \
-H "Authorization: Bearer zdk_live_…"Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
Anonymous and SINGLE-VARIANT. No user-agent branch, no `Vary: Cookie`, no signed-in mode — docs/83 §3's rule is that Googlebot must see exactly what an anonymous visitor sees. A `domain` renders as `site****.com`; a `url` or `file` does not render at all. The full value is not in the tables this reads. ⛔ An unknown field kind is SKIPPED, never degraded to text: a page served by a newer engine than the deployed bundle must not print `12000` for a money field whose truth is `$120.00`, because a visitor has no way to tell a wrong number from a right one. ⛔ A listing whose stamped schema version has no history row is a **404**, not a render against the type's current head. Quietly showing different facts is worse than showing nothing.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
vertical (path) | string | Yes | — |
slug (path) | string | Yes | — |
locale (query) | string | No | Render every operator-authored string — field labels, help text, enum option labels — in this locale, falling back to the source language per string. ⛔ A query parameter rather… |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
source_locale | string | No | The language the **seller** wrote this listing in (#2606 slice E), or `""` when nothing has been translated and the question does not arise. ⭐ The owner's ruling was *"translate… |
copy_locale | string | No | The language `title` and `summary` are actually IN — the requested locale when a translation was served, `""` when they are the seller's own words. ⛔ Not the locale that was ask… |
id | string | Yes | — |
slug | string | Yes | — |
title | string | Yes | — |
summary | string | Yes | — |
marketplace_key | string | Yes | — |
images | MarketplaceImage[] | No | Cover first, so a client that renders only the first entry renders the right one without knowing the rule. Empty until the seller uploads one. |
storefront_layout | MarketplaceStorefrontLayout | No | How a vertical's results are laid out on the public storefront. Owner instruction 2026-08-08: *"layouts suited to what is sold — a guest post is a list/table, not a product card… |
category_path | string | No | — |
listing_type_key | string | Yes | — |
schema_version | integer | Yes | — |
vendor_display_name | string | Yes | The Zinner®'s public name — never the legal name held for identity checks. |
price_minor | integer | Yes | — |
price_max_minor | integer | Yes | — |
currency | string | Yes | — |
sales_count | integer | Yes | — |
published_at | string | No | — |
fields | MarketplacePublicField[] | Yes | — |
packages | MarketplacePackage[] | Yes | — |
Errors this endpoint can return
404