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 the products your feed's rules select, each priced by the first rule that matches it, newest cursor last.
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 | earrings | bracelet | necklace | pendant | brooch | cufflinks | other | Restrict to these categories. Categories your rules do not cover simply match nothing. |
costMinMinor | integer | Minimum cost price, in cents, inclusive. |
costMaxMinor | integer | Maximum cost price, in cents, inclusive. |
cursor | integer | The |
limit | integer default 50 |
The whole feed, first page
{}Rings only, at least €1,000.00 of cost
{
"categories": [
"ring"
],
"costMinMinor": 100000
}The page after a previous response
{
"cursor": 412,
"limit": 100
}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
{
"items": [
{
"id": "2b0478f5-8ef3-41e0-9f1c-a0dcc9a2d993",
"title": "Colette solitaire",
"description": "A narrow-shouldered solitaire.",
"category": "ring",
"tags": [
"solitaire",
"bridal"
],
"materialsNote": "18k white gold",
"costMinor": 150000,
"retailMinor": 181500,
"currency": "EUR",
"matchedRuleId": 2,
"updatedAt": "2026-08-31T18:10:43.594543+00:00"
}
],
"nextCursor": null
}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. |
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. |
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 | earrings | bracelet | necklace | pendant | brooch | cufflinks | other | Restrict to these categories. Categories your rules do not cover simply match nothing. |
costMinMinor | integer | Minimum cost price, in cents, inclusive. |
costMaxMinor | integer | Maximum cost price, in cents, inclusive. |
cursor | integer | The |
limit | integer default 50 |
SearchResponse
| Field | Type | Description |
|---|---|---|
itemsrequired | array of object | |
nextCursorrequired | integer | null | Pass as |
Product
| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | Stable identifier for this product. Use it as your own catalogue key. |
titlerequired | string | |
description | string | null | |
categoryrequired | ring | earrings | bracelet | necklace | pendant | brooch | cufflinks | other | |
tagsrequired | array of string | |
materialsNote | string | null | Free text from the designer, e.g. "18k white gold". |
costMinorrequired | integer | What DYJ charges you to produce this piece, in cents. This is your cost, not a recommended price, and it is confidential to your account. |
retailMinorrequired | integer | Your selling price, in cents, computed from
No other account can see it, and DYJ never charges it — it exists so your store and your dashboard agree without you recomputing anything. |
currencyrequired | string | EUR only in v1. |
matchedRuleIdrequired | integer | Which of your rules priced this product. Rules are ordered and the FIRST match wins, so this tells you why a product costs what it does. |
updatedAtrequired | string (date-time) |
Category
ring | earrings | bracelet | necklace | pendant | brooch | cufflinks | other — one of: ring, earrings, bracelet, necklace, pendant, brooch, cufflinks, other
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. |