Changelog
Every change to the public API, newest first. Each entry names the date and the hash of the API spec it produced. The API reference always shows the current spec. Event catalogue changes are at the end.
-
d931b77a2a4bplugin_infoaddsgarment_look(base|tee| null, D131 3):tee= the CC0 T-shirt look of atopproduct (category says t-shirt / tee / singlet, or the merchant picked "T-shirt");nullwhengarment_typeis null.- Reco answers add
candidates[].comparisons[].garment_cm(optional, D131 4): on a garment chart, the chart's garment measurement of that size (cm), for the 3D garment's ease. Absent on body charts.
-
6a4f79290de8- New
POST /v1/legal/subprocessor-subscriptions{email}(T13.04.02, D130 2): the sub-processor page's subscribe form. Always 202{status: "pending"}(never says whether the address was known); a confirm email is sent and the address counts only after its link. Docs origin only for browsers; 5 per hour per IP, 3 per day per address, 500 per day in total (429 withRetry-After); a bad address answers 422validation_failedwitherror.fields. - New
POST /v1/legal/subprocessor-subscriptions/confirmand/unsubscribe{token}: the email links. 200{status}, or 404not_foundfor an unknown, used or expired link. Unsubscribing deletes the address.
- New
-
bf9e4fbb4327- New
GET /v1/integration_check?client_id=(T12.08.04): the docs snippet generator's Verify button. Counts ofproduct,cartandtransaction_endof the last 15 minutes (count,test,invalidper event), never event data. Docs origin only for browsers,no-store, 30 calls a minute per IP (429 withRetry-After); a badclient_idanswers 422validation_failedwitherror.fields, an unknown client 404 (D130 8).
- New
-
3d616ab5f8b4- New
GET /v1/body/garments/{template}(T14.14.02, D127–D129): a garment GLB bound to the body model (bodyType,lod=1,look=base|tee,modelVersion), 302 to the current model version, then public, immutable, any origin, brotli else gzip. New error codegarment_not_built(404) forshoeandhelmet.
- New
-
a99313226cd6POST /v1/reco/social_proof: description wording only (the older widget keys); no schema change.
-
617d8f988528GET /v1/products/plugin_info: new added keygarment_type(T14.14.09):top,jacket,tights,shorts,one_piece,shoe,helmetornull, the 3D garment template of the product (merchant pick, else the linking rule's, else derived from the category). Additive; Fitle's keys are unchanged.
-
de2e4dac9201POST /v1/body/fittakes an optionalpopulation{age?, heightCm?, weightKg?, bodyShape?, sdCm?}(D126, re-predict body): the free dimensions are predicted again from the locks (a missing weight or height inferred from them) and the fit pulls them by their sd, so raising the waist alone gives a heavier body everywhere. The fit report then carriespopulation{predictorVersion, weightKg, weightInferred, heightCm, heightInferred, softCm, predictedCm}. Additive; without the field the fit is unchanged.
-
ec902a225f83POST /events/mixpanel/{name}is documented (S08.08, T08.08.02): the compatible product-analytics proxy body{payload, mixpanel_properties}, catalogue names and mapped older names (othersunknown_event), the same intake asPOST /events; stored UX events are forwarded later by the worker when the client has analytics forwarding.
-
dde2ae376f7cPOST /v1/reco/social_proofis built (S05.05, T05.05.03): it answers the §8 recommendation withmode: social_proof,social_proof_sizes(best first, 2 decimals, summing to 1), Fitle'sfirst_size,second_size,primary_system({name}) andsizing_chart_id(null without a chart), plusratio_high,social_proof_levelandsocial_proof_samples. Too little history answersstatus: no_matchwith the new message keySORRY_SOCIAL_PROOF; a product not in social-proof mode answers 404product_not_eligiblewithreason: not_social_proof. The501 mode_not_availableanswer and error code are removed.- Reco answers:
chart_idandchart_revisionmay be null (a social-proof product with no chart). Contract version unchanged (no field removed). - New
GETandPOST /v1/cross_sell_products(S07.12, T07.12.01, D125): one cross-sell tab (cross_sell_products_type:recentProducts,similarProducts,boughtBySimilarPeopleProducts,boughtTogetherProducts) with Fitle's query names; the POST takes the same names as a JSON body. Answers{eligible:true, type, products:[{id, name, image, url, price, currency, size}]}(at most 12), the D39 soft refusal withproducts: [], or{eligible:false, reason:"unknown_product", products:[]}; bad values 422validation_failedwitherror.fields.
-
4feab004389dGET /v1/plugins/frame_policy(T13.03.02-TC19): a serving client'sframe_ancestorsalso lists the environment's back-office origin (PUBLIC_ADMIN_URL), so the back office's live and reference-brands previews can frame the iframe page. Unknown and not-serving clients still get'none'.
-
301742c25547- New
GET /v1/plugins/frame_policy?cid=(T13.03.02, D118): theframe-ancestorsvalue for a client's widget iframe page ({frame_ancestors}and theX-Fmt-Frame-Ancestorsheader). The plugin host's ingress copies it into the iframe page'sContent-Security-Policy;'none'for an unknown, malformed or not-serving client.
- New
-
0b2ade28a274POST /events/pixel/shopify(T08.04.01):client_idmay also be a number written as text (Fitle's documented pixel sends'<client_id>', D19);tracking_id,shop_country,product_idandvariant_idmay benull(Fitle's pixel sendstracking_id: nullwhen the shop has no device id; the order is stored untracked).
-
f94b7d8e7abe- New
POST /v1/shopify/session(T12.01.01, T12.01.02): the Shopify app opens with its session token; the first open installs (token exchange, client link, metafield, web pixel, first import) and the answer is the shop's state. NewPOST /v1/shopify/webhooks: Shopify'sapp/uninstalled,app/scopes_updateand GDPR webhooks, HMAC-checked, 200 or 401 with an empty body.
- New
-
37ad0addeadf- New
GET /v1/shopify/app(the Shopify app's embedded home page, HTML) andGET /v1/shopify/home/status(its 5 setup checks for the shop of the Shopify session token; JSON, or HTML withAccept: text/html), andPOST /v1/shopify/home/dashboard-link(the app home's one-time back-office sign-in link), T12.01.05. - New
POST /v1/shopify/setup-requests(T12.01.06): the docs site's white-glove Shopify form. 201 with the ops ticket (never the collaborator request code); docs origin only; rate limited; 422validation_failedwith afield_errorsmap.
- New
-
8dc9b53004f8POST /v1/reco/shoes: a typedfoot_lengthis matched ±0.25 cm (D111), no longer ±0.5 cm; a typedhead_circumferencestays ±0.5 cm. Description text only.
-
979e53c4a963POST /v1/reco/shoesandPOST /v1/reco/headare built (S05.07): they answer the §8 recommendation withmode: shoes/mode: headand no longer list501 mode_not_available.foot_lengthis optional withheightor a shoe reference (10–34 cm);head_circumferenceis optional with a helmet reference (adults 50–65, children 48–58, babies 40–58 cm). Both acceptage,heightandweightwith the clothes limits. One example each added.POST /eventsand/debugitems (T08.01.01, D110): the event catalogue's envelope adds the optionalevent_id,schema_version(1),instance_id,product_id,brand_id,product_associated,ab_data,testEventandextra, with limits (user_agent≤ 2,048,shop_country≤ 8,channel≤ 64 characters).
-
601bb5a44b8cGET /v1/products/plugin_info: new keyfit_preferences(the ease profiles of a garment chart,[]for body charts, D105);sizing_adjustmentis the product's merchant offset (−1, 0, +1; T04.07.03, D104), still a number;usual_size_list(with its system and id) is also sent for every product with a chart when the merchant shows the usual-size path (D105).POST /v1/reco/clothes: a product with a merchant offset answersoffset_appliedandsizing_adjustment(the descriptions of both fields now cover classic answers; T04.07.03).
-
eda81ad2782a- Every public route is on
/v1(D102); the old paths are removed, with no aliases.POST /v3/reco/clothes→POST /v1/reco/clothes;GET /v2/plugins/customization→GET /v1/plugins/customization;GET /v2/plugin_references→GET /v1/plugin_references;GET /v2/plugin_sizing_charts→GET /v1/plugin_sizing_charts;GET /v2/sizes→GET /v1/sizes;GET /v2/sizing_charts/{id_or_slug}→GET /v1/sizing_charts/{id_or_slug};GET /v2/body/morph_basis→GET /v1/body/morph_basis. Request and answer bodies, auth, CORS, caching and limits do not change;X-Api-Versionisv1on every route.
- Every public route is on
-
3e7636fadfab- Reco answers add
deciding_measurement(D98, T07.09.09; an added optional field, contract version stays 2): the predicted primary measurement (vocabulary id) whose tape value would most raise the chance of the right size, ornull. The engine ischart-fit-3.0(D97, T05.03.07): the size is the most likely one in which no primary measurement is tight; the answer's shape does not change.
- Reco answers add
-
c903bf25a50e- Added
GET /v2/plugin_references?gender=&type_of_references=cloth|shoe|head&client_id=&number_of_most_used=andGET /v2/plugin_sizing_charts?client_id=&gender=&status=active&brand_id=&category=(S04.05 T04.05.02, D91): Fitle's wire format ({references, most_used_brands, client_brand}; the brand's charts withsize_systems),*, cached 10 minutes; the D39 soft refusal for a refused origin; 422 naming the field for a bad query. - Reco answers add
incoherent_references: [{index, reason}](T05.04.03, D91; an added field, contract version stays 2): references that contradict the body data or each other, by their place in the request'sreferences;reasonis one of Fitle's fiveINCOHERERANCE_WARNING_*keys. On every classic answer (empty when none is flagged); a flag never blocks the size. Classic recos now use the request'sreferences(S05.04): they adjust predicted zones within a cap and change only the size. - Reco answer contract version 2 (T04.04.03, D89):
size_conversionsis Fitle's per-size shape{M: {FR: {size_name: "38"}, UK: {size_name: "10"}}}for every chart size (primary system left out, at most 3 other systems, theshop_country's system first), present for every status. v1's{EU: "M", FR: "38"}is gone. POST /v1/reco/usual_sizeanswers (T05.06.03): the §8 answer withmode: usual_sizeand Fitle'sfound,name,size_order,precision, plusis_usual_size,offset_applied,sizing_adjustment.fit_feelingisnarrow|perfect|comfy,desired_fitslim|regular|oversize,size_system_idis optional and a sentsizing_adjustmentis ignored (D89). No more 501 for this path.- Reco requests take
auto(boolean, T05.08.01): the silent page-load reco; an incomplete profile withauto: trueanswersneeds_measurementsinstead of 422. - Added
GET /v2/sizes[?language=](T04.04.01): the size system catalogue{items: [{id, code, name, scope, gender, body_part, country_codes}]}, 13 clothing systems and the shoe scales, EU id 2 (D89); any origin, CDN 5 min, no write route (405). plugin_info:usual_size_list,usual_size_system_nameandpreferred_size_system_idare filled in usual-size mode (T05.06.01) and stay[],null,nullotherwise.- Body (S14.10): the fit report has
gapsCm(measured − requested for locked measure-only dimensions: hipsMax, inseam, torsoHeight; D90).GET /v1/body/schema'sETagalso names a digest of the vocabulary, so a vocabulary change under the same model version is a newETag;inseamis nowadvancedandtorsoHeightis in thebodygroup.
- Added
-
4edcedabc0f5- Added the body routes of S14.03:
GET /v1/body/schema(vocabulary + model version, any origin,ETagper model version),POST /v1/body/fit(202 + job;Idempotency-Keyheader, 409 for a reused key with another body, 429 per device, per client and at 100 queued fits),GET/DELETE /v1/body/jobs/{id}(statesqueued|running|done|failed|cancelled,retryAfterMs, 410 after 24 h, another client's job 404),GET /v1/body/results/{file}(<id>.glbwithmorphs=1,.jsonfit report,.obj; the MTL routes are gone) andGET /v2/body/morph_basis(302 to the model version, then an immutable GLB, any origin; T14.04.02). - Body routes list their error answers (400/422, 403, 404, 410, 429, 503) with an example each; GLB and OBJ answers are documented as binary. Predict and default are unchanged.
- Added the body routes of S14.03:
-
c867a71f6c6c- Added
GET /v1/plugins/origin_check?client_id=&origin=(T13.03.01): the widget iframe asks whether the page that framed it is an allowed domain of the client, before it posts anything to it. Answers{allowed}; never cached; a refused origin gets{allowed:false, reason:"not_whitelisted"}(D39).
- Added
-
cca02bee590b- Added the reco routes with Fitle's paths (S05.01):
POST /v3/reco/clothes(the CONTRACTS §8 answer: Fitle'scomfort[],sizing_chart_info,user_measurements,size_conversions, then ours), andPOST /v1/reco/shoes,/v1/reco/head,/v1/reco/social_proof,/v1/reco/usual_size(body checked, then 501mode_not_availableuntil S05.05–S05.07). Request examples per mode. New error codes:product_not_eligible(404, withreason),mode_not_available(501). A route called with another method answers 405 withAllow.
- Added the reco routes with Fitle's paths (S05.01):
-
a717d7b9dd8a- Added
POST /v1/body/predict?client_id=[&tracking_id=](T14.02.04): Simple-mode answers → every body measurement with its own sd (predicted/entered), the live body'smorphParams,modelVersion,predictorVersion,accuracyValidated:false; boys and girls getneeds_measurements. Rate limited per device. - Added
GET /v1/body/default?bodyType=[&modelVersion=](T14.01.03): 302 to the current model version, then the default body as a public, immutable artifact. - New error codes
validation_failed(422, witherror.fields: names only) andpredictor_not_available(501).
- Added
-
318ac4d1b0d3POST /eventsandPOST /events/pixel/shopifyanswer 202{received, accepted, rejected}once the call is queued (S08.02, D72);POST /eventsalso takes{events:[…]}. AddedPOST /debug(integration heartbeats, same forms and answer). New error codes:unknown_client,unknown_event,event_id_conflict(409),queue_unavailable(503).
-
caee300a758d- Added
GET /v2/sizing_charts/{id_or_slug}?client_id=[&system=](S04.01 T04.01.03): the published version of a size chart in the widget payload shape (measurements[]with=, or>/<constraints and the size label per system), plusid,version,revision,basis,sizesandease_cm. Cached 5 minutes at the CDN.
- Added
-
3e355978abc5PUT /wrong_sizing_chart_products: the body may carry up to 200page_sizes(was 100), matching the SDK (T06.03.02-TC20).
-
8e992ceb6d10PUT /wrong_sizing_chart_products: description andclient_product_idtext reworded (no behaviour change).
-
d9601bd3dfc8- Added
GET /v1/products/plugin_info?client_id=&client_product_id=[&available_sizes=](Fitle's path, S06.03 T06.03.01): the eligible answer (the D19-compatible keys, then ours; each field's description starts withD19 compatible:orAdded:), the not-eligible answer{eligible:false, reason}(D50) and the soft refusal (D39).
- Added
-
7ba02b42c08f- Added
PUT /wrong_sizing_chart_products?client_id=&client_product_id=(Fitle's path, S03.09 T03.09.03) with the optional body{page_sizes, status}. A request body that may be left out is no longer marked required.
- Added
-
5db0a5a18bd8- First generated reference:
GET /v1/brands/{brand_id}/client,GET /v2/plugins/customization,POST /events,POST /events/pixel/shopify,GET /v1/api_keys/me(D19 paths), with the shared error answers (400, 401, 403, 404, 413, 429, 503).
- First generated reference:
Event catalogue
Changes to the events you send, by catalogue version. See Event schemas.
0.2.0 ·
- Catalogue v1 published (D110): input and stored layers for every event,
schema_version: 1. - Added the shopper-flow events:
reco_displayed,size_validated,survey_dismissed, the physical-info, body-shape, bra, references, measure-offer and saved-body events (classux, 90 days). - Added
widget_click,tooltip_viewed,usual_size_add_to_cart,bracketing_start,returnschemas. recoandauto_recocarry the §8 answer fields, measurement-free;foundfollowsstatus.- Limits: ids ≤ 255 characters,
references≤ 10,alternatives≤ 20, one widget event ≤ 8 KB, order lines ≤ 500,feedback≤ 1,000 characters.
0.1.0 ·
- First intake schemas:
product,cart,transaction_end,reco,auto_reco,body_view_opened.