API reference
Generated from dyj-market-v1.yaml, version 1.0.0.
Base URL: https://api.dyj.one/v1
List the products currently in a feed
Returns one page of the products your feed's rules select, each priced by the first rule that matches it, in a stable order — plus how many there are in all, and the currency every amount is in.
Filters narrow; they never widen. Every field in the request body is applied *on top of* your rules. There is no parameter that can reach a product your rules do not already select — asking for a category no rule covers returns an empty list, not an error.
A POST for a read is deliberate: the filters are structured, and putting them in a
body keeps them out of proxy logs that sit next to your Authorization header.
Path parameters
| Name | Type | Description |
|---|---|---|
feedIdrequired | string (uuid) | Your feed's public id, from the Integration tab of the feed in your dashboard. It identifies a feed; it does not authorise access — the secret key does that. |
Request body (optional)
| Field | Type | Description |
|---|---|---|
categories | array of ring | earring | necklace | bracelet | pendant | brooch | bangle | stud | hoop | drop_earring | tennis_bracelet | tennis_necklace | cuff | Restrict to these categories. Categories your rules do not cover simply match nothing. |
listingPriceMin | number | Lowest |
listingPriceMax | number | Highest |
metals | array of yellow_gold | white_gold | rose_gold | platinum | silver | sterling_silver | Restrict to pieces containing ANY of these metals. |
stones | array of diamond | sapphire | ruby | emerald | moissanite | aquamarine | topaz | amethyst | garnet | opal | tourmaline | tanzanite | none | Restrict to these primary stones. |
stoneOrigins | array of natural | lab_grown | none | Restrict to natural or lab-grown stones. |
occasions | array of engagement | wedding | anniversary | everyday | gift | statement | Restrict to pieces tagged with ANY of these occasions. |
audiences | array of women | men | unisex | children | Restrict to these audiences. |
pageNumber | integer default 1 | 1-based. A page past the end returns an empty |
pageSize | integer default 50 | Products per page. Fifty is the ceiling; the response echoes what applied. |
The whole feed, first page
{}Rings only, costing you at least €1,000.00
{
"categories": [
"ring"
],
"listingPriceMin": 1000
}The second page of fifty
{
"pageNumber": 2,
"pageSize": 50
}Responses
| Status | Description |
|---|---|
200 | The current contents of the feed. |
400 | The request body did not validate. Unknown fields are rejected rather than ignored — a silently dropped filter would let you believe it applied. |
401 | Missing, malformed, unknown, or revoked key — all four answer identically, on purpose. The remedy is the same in every case: check the key, or rotate it. |
402 | Your DYJ plan is not live. The feed resumes the moment it is. |
404 | No such feed, or not yours, or disabled. Merged deliberately: an authenticated stranger must not be able to learn that a feed id exists. |
429 | Too many requests for this key. Limits are per key, not per IP, so adding servers does not add quota. Back off and retry; a full catalogue sync should page steadily rather than fan out. |
200 example
{
"data": [
{
"id": "2b0478f5-8ef3-41e0-9f1c-a0dcc9a2d993",
"title": "Colette solitaire",
"sku": "DYJ-M-1042",
"specificationVersion": 1,
"metalDetails": [
{
"type": "white_gold",
"fineness": 750,
"finish": "polished",
"approximateWeightGrams": null
}
],
"stones": [
{
"id": "center-1",
"role": "center",
"type": "diamond",
"origin": "lab_grown",
"shape": "round",
"count": 1,
"totalCaratWeight": 1,
"dimensionsMm": null,
"setting": "prong",
"component": null
}
],
"saleUnit": {
"type": "piece",
"pieceCount": 1
},
"includedComponents": [
"mounting",
"center_stones"
],
"sizing": {
"mode": "ring_size",
"system": "EU",
"unit": null,
"options": [
{
"id": "eu-54",
"value": "54"
}
],
"referenceOptionId": "eu-54"
},
"production": {
"mode": "made_to_order",
"leadTimeBusinessDays": {
"min": 15,
"max": 20
}
},
"dimensions": {
"bandWidthMm": 2.1
},
"description": "A narrow-shouldered solitaire.",
"category": "ring",
"tags": [
"solitaire",
"bridal"
],
"materialsNote": "18k white gold",
"metals": [
"white_gold"
],
"stone": "diamond",
"stoneOrigin": "lab_grown",
"occasions": [
"engagement"
],
"audience": "women",
"price": {
"listingPrice": 1500,
"totalPrice": 1815,
"discount": 0,
"totalPriceInEur": 1815,
"costTerms": {
"taxTreatment": "quote_required",
"shippingTreatment": "excluded"
}
},
"updatedAt": "2026-08-31T18:10:43.594543+00:00",
"photos": [
{
"url": "https://media.dyj.one/p/public/i/482/solitaire-product-shot-k7q.webp",
"category": "product_shot"
},
{
"url": "https://media.dyj.one/p/public/i/482/solitaire-try-on-m2x.webp",
"category": "try_on"
}
],
"embed": {
"configUrl": "https://dyj-server.c00.cc/viewer/v1/market/config/2b0478f5-8ef3-41e0-9f1c-a0dcc9a2d993?licenseKey=dyj_live_0123",
"posterUrl": "https://media.dyj.one/p/public/i/482/solitaire-poster-3fa.webp"
}
}
],
"pagination": {
"pageNumber": 1,
"pageSize": 50,
"totalRecordsFound": 1
},
"currency": {
"title": "Euro",
"shortTitle": "EUR",
"rate": 1,
"updatedAt": "2026-09-03T09:00:00.000Z"
}
}400 example
{
"message": [
"property listingIds should not exist"
],
"error": "Bad Request",
"statusCode": 400
}402 example
{
"error": "plan_required",
"message": "This account has no live plan"
}404 example
{
"error": "feed_not_found",
"message": "Feed not found"
}{
"error": "feed_disabled",
"message": "This feed is disabled"
}Fetch one product from a feed
Returns a single product, priced exactly as search prices it.
A product is reachable by id only if your rules still select it. A product that
exists on the marketplace but is not in your feed answers 404, identically to one
that does not exist at all — so this endpoint cannot be used to discover what else is
on the platform.
Path parameters
| Name | Type | Description |
|---|---|---|
feedIdrequired | string (uuid) | Your feed's public id, from the Integration tab of the feed in your dashboard. It identifies a feed; it does not authorise access — the secret key does that. |
listingIdrequired | string (uuid) | The product's `id` from a search response. |
Responses
| Status | Description |
|---|---|
200 | The product, in the same envelope as search minus the pagination. |
401 | Missing, malformed, unknown, or revoked key — all four answer identically, on purpose. The remedy is the same in every case: check the key, or rotate it. |
402 | Your DYJ plan is not live. The feed resumes the moment it is. |
404 | No such product in this feed. Returned for an unknown id, a product outside your feed, and a delisted one alike. |
429 | Too many requests for this key. Limits are per key, not per IP, so adding servers does not add quota. Back off and retry; a full catalogue sync should page steadily rather than fan out. |
200 example
{
"data": {
"id": "2b0478f5-8ef3-41e0-9f1c-a0dcc9a2d993",
"title": "Colette solitaire",
"sku": "DYJ-M-1042",
"specificationVersion": 1,
"metalDetails": [
{
"type": "white_gold",
"fineness": 750,
"finish": "polished",
"approximateWeightGrams": null
}
],
"stones": [
{
"id": "center-1",
"role": "center",
"type": "diamond",
"origin": "lab_grown",
"shape": "round",
"count": 1,
"totalCaratWeight": 1,
"dimensionsMm": null,
"setting": "prong",
"component": null
}
],
"saleUnit": {
"type": "piece",
"pieceCount": 1
},
"includedComponents": [
"mounting",
"center_stones"
],
"sizing": {
"mode": "ring_size",
"system": "EU",
"unit": null,
"options": [
{
"id": "eu-54",
"value": "54"
}
],
"referenceOptionId": "eu-54"
},
"production": {
"mode": "made_to_order",
"leadTimeBusinessDays": {
"min": 15,
"max": 20
}
},
"dimensions": {
"bandWidthMm": 2.1
},
"description": "A narrow-shouldered solitaire.",
"category": "ring",
"tags": [
"solitaire",
"bridal"
],
"materialsNote": "18k white gold",
"metals": [
"white_gold"
],
"stone": "diamond",
"stoneOrigin": "lab_grown",
"occasions": [
"engagement"
],
"audience": "women",
"price": {
"listingPrice": 1500,
"totalPrice": 1815,
"discount": 0,
"totalPriceInEur": 1815,
"costTerms": {
"taxTreatment": "quote_required",
"shippingTreatment": "excluded"
}
},
"updatedAt": "2026-08-31T18:10:43.594543+00:00",
"photos": [],
"embed": null
},
"currency": {
"title": "Euro",
"shortTitle": "EUR",
"rate": 1,
"updatedAt": "2026-09-03T09:00:00.000Z"
}
}402 example
{
"error": "plan_required",
"message": "This account has no live plan"
}404 example
{
"error": "not_found",
"message": "Product not found"
}Liveness
Unauthenticated. Reports that the API process is serving; it does not probe the database.
Responses
| Status | Description |
|---|---|
200 | Serving. |
Schemas
SearchRequest
All fields optional. Every one narrows the result; none can widen it.
| Field | Type | Description |
|---|---|---|
categories | array of ring | earring | necklace | bracelet | pendant | brooch | bangle | stud | hoop | drop_earring | tennis_bracelet | tennis_necklace | cuff | Restrict to these categories. Categories your rules do not cover simply match nothing. |
listingPriceMin | number | Lowest |
listingPriceMax | number | Highest |
metals | array of yellow_gold | white_gold | rose_gold | platinum | silver | sterling_silver | Restrict to pieces containing ANY of these metals. |
stones | array of diamond | sapphire | ruby | emerald | moissanite | aquamarine | topaz | amethyst | garnet | opal | tourmaline | tanzanite | none | Restrict to these primary stones. |
stoneOrigins | array of natural | lab_grown | none | Restrict to natural or lab-grown stones. |
occasions | array of engagement | wedding | anniversary | everyday | gift | statement | Restrict to pieces tagged with ANY of these occasions. |
audiences | array of women | men | unisex | children | Restrict to these audiences. |
pageNumber | integer default 1 | 1-based. A page past the end returns an empty |
pageSize | integer default 50 | Products per page. Fifty is the ceiling; the response echoes what applied. |
SearchResponse
The envelope every search answers in. Every amount in data is in currency.
| Field | Type | Description |
|---|---|---|
datarequired | array of object | |
paginationrequired | object | |
currencyrequired | object | The currency of every amount in the response, stated once. EUR is the only currency
in v1, so |
ProductResponse
The detail envelope — search's, without pagination.
| Field | Type | Description |
|---|---|---|
datarequired | object | |
currencyrequired | object | The currency of every amount in the response, stated once. EUR is the only currency
in v1, so |
Pagination
| Field | Type | Description |
|---|---|---|
pageNumberrequired | integer | The page this response is. |
pageSizerequired | integer | The page size that applied — what you asked for, clamped to the ceiling. |
totalRecordsFoundrequired | integer | How many products the feed selects in all, after your filters — the number behind "page 3 of 7". Membership is live, so it can change between two pages of one walk; see the sync guide for how to read a walk whose total moved. |
Currency
The currency of every amount in the response, stated once. EUR is the only currency
in v1, so rate is 1; the block exists so a second currency can arrive without the
shape of a product changing.
| Field | Type | Description |
|---|---|---|
titlerequired | string | |
shortTitlerequired | string | ISO 4217 code. |
raterequired | number | Against EUR, the platform's base currency. |
updatedAtrequired | string (date-time) | When |
Price
Decimal amounts in the response's currency. Confidential to your account — no designer and no other business sees them.
| Field | Type | Description |
|---|---|---|
listingPricerequired | number | What DYJ charges you to produce this piece. Your cost, not a recommended price. |
totalPricerequired | number | Your selling price, computed from
DYJ never charges it — it exists so your store and your dashboard agree without you recomputing anything. |
discountrequired | number | Reserved. Always |
totalPriceInEurrequired | number |
|
costTermsrequired | CostTerms | null | Terms for DYJ listingPrice only, not your shopper tax/shipping policy. Null on legacy offers; quote_required is not a final delivered total. |
CostTerms
| Field | Type | Description |
|---|---|---|
taxTreatmentrequired | included | excluded | quote_required | |
shippingTreatmentrequired | included | excluded | quote_required |
MetalDetail
| Field | Type | Description |
|---|---|---|
typerequired | yellow_gold | white_gold | rose_gold | platinum | silver | sterling_silver | |
finenessrequired | integer | Confirmed purity in parts per thousand; 750 means 18K gold, 925 sterling silver. |
finishrequired | string | null | |
approximateWeightGramsrequired | number | null | Approximate metal weight for the complete sale unit at sizing.referenceOptionId. Null means unknown. |
StoneGroup
| Field | Type | Description |
|---|---|---|
idrequired | string | |
rolerequired | center | accent | main | |
typerequired | diamond | sapphire | ruby | emerald | moissanite | aquamarine | topaz | amethyst | garnet | opal | tourmaline | tanzanite | |
originrequired | natural | lab_grown | |
shaperequired | string | |
color | string | null | Confirmed stone body color, such as white, teal, or champagne. Custom color labels remain supported. Null or absent means unknown; color does not imply natural or lab-grown origin. |
countrequired | integer | Number supplied in this group across the complete sale unit, including both pieces of a pair. |
totalCaratWeightrequired | number | null | Confirmed total for the group across the sale unit; never a per-stone weight. Null means unknown. |
dimensionsMmrequired | StoneDimensions | null | Individual stone dimensions, only when they apply to every stone in the group. |
settingrequired | string | null | |
componentrequired | string | null | Optional label identifying a piece in an asymmetric pair or set. |
StoneDimensions
| Field | Type | Description |
|---|---|---|
lengthrequired | number | null | |
widthrequired | number | null | |
depthrequired | number | null |
SaleUnit
Prices, metal weights, stone counts and group carat weights cover this complete unit. piece=1, pair=2, set=2?100.
| Field | Type | Description |
|---|---|---|
typerequired | piece | pair | set | |
pieceCountrequired | integer |
Sizing
One fixed approved material/stone specification and price applies to every size. Fixed mode has no selectable options. Reference option anchors approximate metal weight and nominal dimensions.
| Field | Type | Description |
|---|---|---|
moderequired | ring_size | length | fixed | |
systemrequired | EU | US | UK | | |
unitrequired | mm | | |
optionsrequired | array of object | |
referenceOptionIdrequired | string | null |
Production
| Field | Type | Description |
|---|---|---|
moderequired | made_to_order | |
leadTimeBusinessDaysrequired | object | Atelier estimate after payment and final specification confirmation, excluding shipping transit. min is no greater than max. |
Dimensions
Nominal millimeter measurements per piece at sizing.referenceOptionId. Only applicable measurements are populated.
| Field | Type | Description |
|---|---|---|
lengthMm | number | null | |
widthMm | number | null | |
heightMm | number | null | |
bandWidthMm | number | null | |
thicknessMm | number | null |
PhotoCategory
Where a gallery image came from. For an image the designer generated in DYJ Studio it is the generation mode they chose — the same four the Studio screen offers. Uploaded photographs, renders and the 3D poster carry their kind. A prepared reference image is other.
product_shot | try_on | lifestyle_scene | campaign_shot | product_photo | render | poster | other — one of: product_shot, try_on, lifestyle_scene, campaign_shot, product_photo, render, poster, other
Product
| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | Stable identifier for this product. Use it as your own catalogue key. |
skurequired | string | Stable public Marketplace reference, distinct from the creator's internal catalog reference. Never changes on reapproval. |
specificationVersionrequired | integer | null | Reviewed specification version; null on legacy products. A price-only update keeps this version while updatedAt advances. |
metalDetailsrequired | array | null of object | Confirmed materials, or null when no structured specification has been reviewed. |
stonesrequired | array | null of object | Supplied homogeneous stone groups. Null means no reviewed information; [] confirms stone-free. Request stones/stoneOrigins filters still select the primary stone only. |
saleUnitrequired | SaleUnit | null | |
includedComponentsrequired | array | null of mounting | center_stones | accent_stones | main_stones | chain | earring_backs | clasp | Exactly what the atelier supplies. An illustrative center stone absent here and from stones is not included. |
sizingrequired | Sizing | null | |
productionrequired | Production | null | |
dimensionsrequired | Dimensions | null | |
titlerequired | string | |
description | string | null | |
categoryrequired | ring | earring | necklace | bracelet | pendant | brooch | bangle | stud | hoop | drop_earring | tennis_bracelet | tennis_necklace | cuff | |
tagsrequired | array of string | |
materialsNote | string | null | Free text from the designer, e.g. "18k white gold". |
metalsrequired | array of yellow_gold | white_gold | rose_gold | platinum | silver | sterling_silver | Every metal in the piece; a two-tone ring lists two. |
stonerequired | Stone | The primary stone; |
stoneOriginrequired | StoneOrigin |
|
occasionsrequired | array of engagement | wedding | anniversary | everyday | gift | statement | Zero or more. Empty when the designer did not say. |
audiencerequired | women | men | unisex | children | |
pricerequired | object | Decimal amounts in the response's |
updatedAtrequired | string (date-time) | |
photosrequired | array of object | The product gallery, in display order. Each URL is a stable public image URL:
it carries no key, is cacheable (immutable — a changed image gets a new URL), and
is safe to place in an |
embedrequired | Embed | null | The per-product half of the interactive 3D view, or
Omit the The view works only on the domains registered under My Account → Developer, and only while this product is in one of your feeds. When it leaves (delisted, blocked, no longer matching your rules) the tag shows the poster with a neutral notice — never an error, never a broken box. |
Embed
| Field | Type | Description |
|---|---|---|
configUrlrequired | string (uri) | Product configuration for the viewer. Carries your public key already; use verbatim. |
posterUrlrequired | string | null (uri) | Still image shown before the 3D view loads (and instead of it when unavailable).
A stable public image URL like the gallery's: no key, cacheable. |
Category
ring | earring | necklace | bracelet | pendant | brooch | bangle | stud | hoop | drop_earring | tennis_bracelet | tennis_necklace | cuff — one of: ring, earring, necklace, bracelet, pendant, brooch, bangle, stud, hoop, drop_earring, tennis_bracelet, tennis_necklace, cuff
Metal
yellow_gold | white_gold | rose_gold | platinum | silver | sterling_silver — one of: yellow_gold, white_gold, rose_gold, platinum, silver, sterling_silver
Stone
diamond | sapphire | ruby | emerald | moissanite | aquamarine | topaz | amethyst | garnet | opal | tourmaline | tanzanite | none — one of: diamond, sapphire, ruby, emerald, moissanite, aquamarine, topaz, amethyst, garnet, opal, tourmaline, tanzanite, none
StoneOrigin
natural | lab_grown | none — one of: natural, lab_grown, none
Occasion
engagement | wedding | anniversary | everyday | gift | statement — one of: engagement, wedding, anniversary, everyday, gift, statement
Audience
women | men | unisex | children — one of: women, men, unisex, children
Error
| Field | Type | Description |
|---|---|---|
errorrequired | string | A stable machine-readable code. Branch on this, not on the message. |
messagerequired | string | Human-readable. May be reworded without notice. |