Integration docs
List your shop on turg.fitness.ee
Two ways to connect your catalogue: if your shop exposes a supported product API we onboard you from just your URL; otherwise you expose one JSON feed. This is the developer reference for both.
Overview
turg.fitness.ee is a multi-vendor marketplace. We read your catalogue automatically (about once an hour), show your products under your own vendor page, and link every product back to your shop for the sale. Catalogue data only — we never touch orders, customers, or payments.
Ready to start? You don't have to read all of this — just submit your URL and we'll tell you which path applies. This page is here for the developer who builds the feed (Path B).
Which path is mine?
It depends on whether your shop already exposes a machine-readable product API.
/wp-json/wc/store/v1/products returns JSON → send us your URL, zero build./graphql answers without a token → send us your URL, zero build.https://your-shop.ee/wp-json/wc/store/v1/products?per_page=1. JSON list → Path A. A 404 / HTML page → the Store API is off (common) → Path B. The onboarding form detects this for you automatically.Path A — supported platform
Nothing to build. Send us your shop URL, confirm the public API is reachable, and optionally your display name + brand colour. We pull your catalogue, map your categories into our browse tree, and put you live — then re-read hourly.
Path B — the JSON feed
Expose one HTTPS endpoint that returns your whole catalogue as JSON. Implement what's below and you go live with no further integration work.
01Endpoint
A single GET over HTTPS, at any URL you control.
Content-Type: application/json; charset=utf-8
Content-Encoding: gzip # whole catalogue, one documentIf-None-Match matches your ETag — we skip the re-ingest.Retry-After. We back off and retry.02Auth
- A shared secret in a request header:
X-Feed-Token: <opaque string>. - We generate the token and share it out-of-band; we rotate it yearly or on request.
- Reject any request without the correct header — don't leave the feed world-readable. Never put the token in the URL.
03Freshness
This is what keeps prices and stock from going stale.
- Put
generated_at(ISO-8601 UTC) inside the body. - Emit an
ETagon every200; honourIf-None-Matchand return304when nothing changed. - Each product's
updated_atmoves whenever that product's price, stock, or content changes. - Regenerate hourly or on change, whichever is cheaper. A cron-built cached snapshot is fine.
Size: one document up to 10 MB gzipped (~2,000 products). Bigger — tell us, we'll add sharding. Don't invent your own pagination.
04Body shape
{
"schema_version": "1.0",
"generated_at": "2026-07-03T08:12:00Z",
"vendor_id": "the-slug-we-assign-you",
"currency": "EUR",
"products": [ ... ]
}schema_version must be "1.0". vendor_id is the stable slug we assign you. currency is ISO-4217 — we support EUR.
05Product object
Every field is required unless the table marks it optional.
{
"id": "31436",
"sku": "ON-WHEY-2270-CHOC",
"parent_id": "31430",
"type": "variation",
"permalink": "https://your-shop.ee/toode/whey-2270-sokolaad",
"updated_at": "2026-07-01T09:00:00Z",
"locales": {
"et": {
"name": "Gold Standard Whey 2270g šokolaad",
"slug": "gold-standard-whey-2270-sokolaad",
"short_description_html": "Kvaliteetne vadakuvalk…
",
"categories": [ { "id": "42", "slug": "valgud", "name": "Valgud" } ]
}
},
"price": "59.90",
"regular_price": "69.90",
"sale_price": "59.90",
"stock_status": "instock",
"stock_quantity": 17,
"manage_stock": true,
"brand": { "slug": "optimum-nutrition", "name": "Optimum Nutrition" },
"attributes": [ { "slug": "pa_maitse", "name": "Maitse", "value": "Šokolaad" } ],
"tags": ["whey", "post-workout"],
"images": ["https://your-shop.ee/img/whey-1.jpg"]
}| Field | Type | Req | Notes |
|---|---|---|---|
| id | string | yes | Your stable internal id. Never changes across feeds. |
| sku | string | yes | Stable across locales/feeds. Join key for variants + re-ingest. |
| parent_id | string · null | yes | Parent's id for a variation; explicit null otherwise. |
| type | enum | yes | simple · variable · variation · grouped · bundle. |
| permalink | URL | yes | Your product page — the buy button links here. |
| updated_at | ISO-8601 | yes | Moves on any change to this product. |
| locales | object | yes | Keyed by et/en/ru. Estonian required. |
| price | decimal str | yes | Current price, VAT-inclusive, as a string. |
| regular_price | decimal str | yes | Pre-discount; equals price when not on sale. |
| sale_price | decimal · null | yes | Sale price, or null. |
| stock_status | enum | yes | instock · outofstock · onbackorder. |
| stock_quantity | int · null | yes | Numeric stock, or null when unmanaged. |
| manage_stock | boolean | yes | Whether stock_quantity is authoritative. |
| brand | object | yes | { slug, name } — slug lowercase, hyphenated, stable. |
| attributes | array | yes | See below. Empty allowed but discouraged. |
| tags | string[] | opt | Lowercase, hyphenated labels. |
| images | URL[] | yes ≥1 | Full URLs only. First image is primary. |
06Locales
locales is keyed by language code. Send what you support; we ingest et (required) and optionally en / ru. Per-locale: name (required), slug (required), categories (required, ordered breadcrumb using your own category slugs — we map them to our browse tree), and optional short_description_html / description_html (safe HTML subset: p, ul, li, strong, em, br). A product with no et locale is skipped.
07Attributes & variants
Attributes are labelled key/value pairs — never unlabeled positional columns. The slug is the contract: don't rename it once published. value is always a string.
{ "slug": "pa_suurus", "name": "Suurus", "value": "L" }Useful slugs by category — send what applies:
- Supplements:
pa_maitse(flavour),pa_kogus-grammides(weight),pa_valjalaske-vorm(form),pa_servings. - Apparel & footwear:
pa_suurus(size),pa_varv(colour),pa_sugu(gender),pa_spordiala(sport),pa_material.
variable parent (parent_id:null, shared title/images/brand) plus one variation per option — each with its own sku and stock_status. That way a sold-out size shows as sold out. No per-option stock? A single simple product listing the options is accepted, but per-option stock is strongly preferred.08Validation & operating rules
- Validate against our JSON Schema on every regeneration. A failing feed is a hard error — we keep the last good ingest rather than publish a broken one.
- Don't change a
skuorbrand.slugafter first publication. - Removing a product — just drop it from the array; we diff and prune.
- Tell us before any breaking change; we pin
schema_version. - No customer, order, or payment data — catalogue only.
Schema & sample
Validate your feed against the JSON Schema on every build. Both files are stable, versioned URLs you can link your tooling at:
Ready to list your shop? Send us your URL and we'll take it from there.
Request onboarding →