# Thibault Van Renne - agents.md

> Machine-readable action surface for AI agents, shopping assistants, and
> automated crawlers acting on behalf of a person. Thibault Van Renne (TVR)
> is a Belgian ultra-luxury hand-knotted rug atelier, founded 2006 in
> Evergem, Belgium. Every rug is built to order in wool and natural silk.
> For brand facts and citations, see [/llms.txt](https://www.thibaultvanrenne.com/llms.txt)
> and [/llms-full.txt](https://www.thibaultvanrenne.com/llms-full.txt).

## Browse the Collection

- [All Collections](https://www.thibaultvanrenne.com/en/collections): Browse every hand-knotted collection. Localized at /tapijten (nl), /tapis (fr), /teppiche (de), /kollektsii (ru), /alfombras (es).
- [Collection detail pages](https://www.thibaultvanrenne.com/en/collections/legends): Each collection page (e.g. LEGENDS, KASHMIR, NATURE, GRUNGE) shows materials, sizes and the design configurator for that collection.
- [Limited Editions](https://www.thibaultvanrenne.com/en/limited-editions): One-off and small-series pieces outside the standard collections.
- [Outlet](https://www.thibaultvanrenne.com/en/outlet): In-stock discounted pieces, ready to ship, fixed prices, no custom sizing. API: `GET /api/webshop/outlet` returns the live JSON list of available pieces (add `?piece=<id-or-sku>` for a single piece). Each piece has a stable public `sku` (e.g. `TVR-OUT-001`) usable anywhere `id` is accepted; the internal Odoo lot number is never exposed.
- [Product feed](https://www.thibaultvanrenne.com/feeds/products.json): Structured JSON catalogue for merchant/agent crawlers - every outlet piece (fixed price, in stock, with its `sku`) plus one entry per configurator collection (made-to-order, `price_from` per m² and `lead_time_months`). Cached 5 minutes.
- [Google Merchant Center feed](https://www.thibaultvanrenne.com/feeds/merchant-center.tsv): TSV product feed for Google Merchant Center, outlet pieces only (made-to-order collections have no fixed price/stock and are excluded). Cached 5 minutes.
- [Stripe catalog feed](https://www.thibaultvanrenne.com/feeds/stripe-catalog.csv): CSV product feed for the Stripe Agentic Commerce Suite, outlet pieces only. A full snapshot, import with upsert mode. Cached 5 minutes.

## Configure a Custom Rug

Every collection page includes an on-page configurator: pick material, size (length x width) and colourway, and get an instant price with EU-destination VAT and shipping applied.

- Start at any collection page, e.g. [LEGENDS](https://www.thibaultvanrenne.com/en/collections/legends).
- API: `POST /api/webshop/quote` - body `{ collectionId, material, lengthCm, widthCm, buyerCountry, currency? }`, returns a `quote_id` valid 24 hours and a full price breakdown. This is the same endpoint the on-page configurator calls; it is not a public discovery feed.

## Buy Online (Webshop & Outlet)

- [Checkout](https://www.thibaultvanrenne.com/en/checkout): Pay online by card/SEPA or by bank transfer. Choose a 50% deposit (balance invoiced before shipment) or pay in full for a 5% discount. VAT is destination-based (EU private customers pay their own country's rate via OSS; EU businesses with a matching VAT number get 0% reverse-charge; outside the EU, 0% export).
- [Outlet checkout](https://www.thibaultvanrenne.com/en/outlet/checkout): Buy an in-stock outlet piece, full payment only, no deposit plan.
- API: `POST /api/checkout` creates the Stripe session for a quoted cart. Sanctioned destinations (RU, BY, KP, IR, SY) are blocked; Russian visitors are served by a separate Moscow representative (ru@thibaultvanrenne.com, +7 965 387 34 04) rather than the online checkout.
- Retrying a checkout call: `POST /api/webshop/checkout/intent`, `POST /api/webshop/outlet/checkout/intent`, and both bank-transfer routes accept an `Idempotency-Key` header. Resending the same request with the same key within 24h replays the original response instead of creating a second payment/order - safe to always send one.
- Payment itself is **not agent-callable yet** - no protocol TVR has evaluated (OpenAI/ACP, Google UCP, Stripe Agentic Commerce) currently offers a live checkout surface for a Belgian merchant; buyers (human or agent-assisted) complete payment on the pages above.
- Order status: `GET /api/agent/orders/{id}` (id = a Stripe PaymentIntent id or an Odoo order reference) is reserved for a normalized status lookup (`pending_payment`/`paid`/`confirmed`/`in_production`/`shipped`/`delivered`/`cancelled`). It currently returns HTTP 501 - not implemented yet - while the order backend is extended to support this lookup.
- No OpenAPI spec exists yet (no `/openapi.json`) - the endpoints below are documented here and nowhere else machine-readable.

### Cart flow, step by step: configurator collections

The cart is bound to a browser session cookie (`webshop_session`, httpOnly, 30 days) set by `POST /api/webshop/cart`. An agent that shares the buyer's real browser (e.g. a browser-embedded assistant) can carry that cookie through all three steps and hand the buyer a checkout page with the item already in their bag. An agent calling these APIs from its own server has no such cookie to share - it should still call step 1 for an accurate instant price, then send the buyer to the collection page (step 3's URL) to add the item and check out themselves, since payment is not agent-callable regardless (see above).

1. **Quote** - `POST /api/webshop/quote`
   ```json
   { "collectionId": "legends", "material": "wool+natural-silk", "lengthCm": 300, "widthCm": 200, "buyerCountry": "BE" }
   ```
   Returns a `quote_id` (valid 24h) and a full price breakdown (rug, shipping, VAT, totals).

2. **Add to cart** (same session/cookie only) - `POST /api/webshop/cart`
   ```json
   { "collectionId": "legends", "material": "wool+natural-silk", "lengthCm": 300, "widthCm": 200, "buyerCountry": "BE", "quoteId": "<quote_id from step 1>" }
   ```
   `GET /api/webshop/cart` lists the current session's items and running total.

3. **Checkout URL** - send the buyer to [/en/checkout](https://www.thibaultvanrenne.com/en/checkout) (locale-prefixed: /nl/, /fr/, /de/, /es/) to enter shipping details, pick a 50%-deposit or pay-in-full plan, and pay by card/SEPA or bank transfer. This is a page for a human to complete, not an API call.

### Outlet flow, step by step: in-stock pieces

1. **Find a piece** - `GET /api/webshop/outlet` (or `?piece=<sku>` for one piece, e.g. `TVR-OUT-014`). Each result carries its public `sku`, price, dimensions, material and live `available` (in stock / sold).
2. **Preview the total for the buyer's country** - `POST /api/webshop/outlet`
   ```json
   { "pieceId": "<id or sku from step 1>", "country": "DE" }
   ```
   Returns the destination-VAT price, shipping fee (free in Belgium, EUR 150 flat elsewhere in the EU, quoted separately outside the EU) and grand total.
3. **Checkout URL** - send the buyer to `https://www.thibaultvanrenne.com/en/outlet/checkout?piece=<sku>` (locale-prefixed) to pay (full payment only, no deposit plan).

## Request a Quote or Design Consultation

- [Contact](https://www.thibaultvanrenne.com/en/contact): Request a formal quote or a design consultation, by appointment at the Evergem showroom or remotely from photos of the space. This form has browser-only spam defenses (a render-timestamp check and, when configured, a Cloudflare Turnstile challenge) and is not a reliable target for a direct agent `POST` - use the API below instead.
- For an instant indicative price on a specific collection, use the configurator (above) rather than the contact form.
- API for agents: `POST /api/agent/quote-request` - body `{ name, email, message, country, consent: true, collection?, sku?, lengthCm?, widthCm? }`. `consent` must be the literal boolean `true`: the agent's explicit confirmation that the named person agreed to be contacted about this request. `collection`, `sku` and the size fields are optional context for a specific piece or configuration.
  ```json
  { "name": "Jane Doe", "email": "jane@example.com", "message": "Interested in LEGENDS around 300x200cm for a living room.", "country": "DE", "consent": true, "collection": "legends", "lengthCm": 300, "widthCm": 200 }
  ```
  Rate-limited to 20 requests/day per IP. Forwards into the same lead pipeline the website's own contact form uses, tagged as an agent-originated lead so the team can respond appropriately.

## Book a Showroom Visit

- [Contact / Book an appointment](https://www.thibaultvanrenne.com/en/contact): Schedule a private visit to the Evergem showroom (Noorwegenstraat 51, 9940 Evergem). Visits are by appointment only; there is free, ample parking directly in front and no reservation is needed for parking itself.
- API: `GET /api/appointments/available?date=YYYY-MM-DD` (or `?from=&to=`) returns open time slots; `POST /api/appointments` books one.

## Order a Sample

Physical wool and silk samples (the pom-pom colour library) are arranged personally rather than self-served online.

- Trade professionals (interior designers, architects, retailers, hospitality buyers): apply at [/en/trade](https://www.thibaultvanrenne.com/en/trade), no fee, typically answered within one business day. Once approved, sample sets can be requested through the [TVR Pro portal](https://www.thibaultvanrenne.com/en/pro) (authenticated).
- Private clients: request samples via [Contact](https://www.thibaultvanrenne.com/en/contact); for serious projects, Thibault arranges material samples personally.

## Verify a Rug Passport

- [Rug Passport](https://www.thibaultvanrenne.com/en/passport): Explains the per-piece authenticity certificate (a holographic label sewn into every carpet since 2014, plus an NFC-tagged passport on newer pieces).
- `https://www.thibaultvanrenne.com/passport/{serial}`: Looks up one specific rug's passport by its serial number. Private - only resolves for a serial printed on that physical rug; there is no public directory of serials.

## Trade Programme

- [Trade](https://www.thibaultvanrenne.com/en/trade): Apply for trade access (interior designers/decorators, architects, retailers, hospitality buyers, project managers). No fee, no obligation, reviewed personally. Once approved, trade pricing shows automatically in the configurator and at checkout.
- [Designers](https://www.thibaultvanrenne.com/en/designers): For interior designers and architects specifically - physical sample sets, rugs lent for editorial photoshoots, and a gated 3D model library.
- [TVR Pro](https://www.thibaultvanrenne.com/en/pro): The dealer/trade portal itself (login required) - orders, invoices, leads, media assets.

## Purchase Facts

- **Lead time:** 4 to 6 months from order confirmation at standard knot density, extending to 10 months or more only for very large formats or an extremely fine weave like 14/14.
- **Size:** made to order in any custom rectangular size; round rugs are woven as the full square and cut by hand, offered up to 25 metres in diameter. TVR also delivers at scale - the largest single delivery to date was 440 large hand-knotted rugs within eight months, for a multi-room/hospitality project.
- **Payment plans:** a 50% deposit today with the balance invoiced before shipment, or pay in full today for a 5% discount on the order (see `PAY_IN_FULL_DISCOUNT_PCT` in the checkout code).
- **Shipping:** configurator orders ship free EU-wide; outlet pieces ship free within Belgium and for a flat EUR 150 elsewhere in the EU. Outside the EU, shipping is quoted separately after purchase.
- **VAT:** prices are shown Belgian-VAT-inclusive. EU private buyers pay their own country's VAT automatically (OSS). EU businesses with a VAT number matching the shipping country get 0% intracommunity reverse-charge (validated live against VIES) - a mismatch between VAT-number country and shipping country falls back to destination VAT. Outside the EU: 0% VAT at checkout (DDU model) - the buyer is responsible for import VAT and duties at their own border.
- **Sanctioned destinations:** Russia, Belarus, North Korea, Iran and Syria are blocked from online purchase. Russian visitors are served by a separate Moscow representative (ru@thibaultvanrenne.com) rather than the webshop.
- **Rug Passport:** every carpet carries a holographic authenticity label (since 2014) and a QR-linked passport record; see the Verify a Rug Passport section above.
- **Care & washing:** TVR offers a professional cleaning/washing service for its own rugs and rugs it did not make, including pick-up and delivery at a cost - arranged via [Contact](https://www.thibaultvanrenne.com/en/contact), not self-service online.
- **Showroom:** Evergem, Belgium, by appointment only - see Book a Showroom Visit above.

## Agent Etiquette

- **Rate limits:** the general Nginx layer caps every endpoint at roughly 5 requests/second per IP. On top of that: `POST /api/agent/quote-request` is capped at 20 requests/day/IP, `GET /api/agent/orders/{id}` at 200 requests/day/IP, and the on-page chat assistant (`/api/chat`) at 50 messages/day/IP. `POST /api/webshop/quote` and the cart endpoints have no additional per-agent limit today beyond the Nginx layer - be a good citizen and don't hammer them.
- **Caching:** `/feeds/products.json`, `/feeds/merchant-center.tsv` and `/feeds/stripe-catalog.csv` are cached 5 minutes; `/agents.md`, `/llms.txt`, `/llms-full.txt` and `/.well-known/ucp` are cached 1 hour. Polling more often than that returns the same cached response.
- **Identify yourself:** send a `User-Agent` that names your agent and its operator (not a generic browser string), so legitimate agent traffic can be told apart from spoofed traffic.
- **Contact:** tvr@thibaultvanrenne.com for questions about these APIs, feeds, or this file.
- **Off-limits for automated/programmatic access:** [/pro](https://www.thibaultvanrenne.com/en/pro) (the authenticated dealer portal - do not probe or attempt to log in) and [/checkout](https://www.thibaultvanrenne.com/en/checkout) (a page for a human buyer to complete payment - do not script form submission against it; use the quote/cart APIs above and hand the buyer the URL instead).
- **No scraping `/passport/{serial}` pages.** Each is a private per-owner authenticity record, not a public directory - do not enumerate, guess, or crawl serial numbers.

## Knowledge Files

- [/llms.txt](https://www.thibaultvanrenne.com/llms.txt): Brand summary, key facts, and the full link index (collections, services, policies).
- [/llms-full.txt](https://www.thibaultvanrenne.com/llms-full.txt): Extended reference - full FAQ-depth detail on materials, process, pricing model, trade programme, and what TVR explicitly does not claim.
- [/.well-known/ucp](https://www.thibaultvanrenne.com/.well-known/ucp): Universal Commerce Protocol discovery manifest for the webshop.

## Business Identity & Contact

- Legal name: Thibault Van Renne BV (VAT BE0806530749)
- Address: Noorwegenstraat 51, 9940 Evergem, Belgium (private showroom, by appointment only)
- Phone: +32 9 281 00 38
- Email: info@thibaultvanrenne.com
- Languages: English, Dutch, French, German, Russian, Spanish

## Policies

- [Terms & Conditions](https://www.thibaultvanrenne.com/en/terms)
- [Privacy Policy](https://www.thibaultvanrenne.com/en/privacy-policy)
- [Cookie Policy](https://www.thibaultvanrenne.com/en/cookie-policy)
- [Return & Shipping Policy](https://www.thibaultvanrenne.com/en/return-shipping-policy): Custom hand-knotted carpets are made to order and exempt from the 14-day EU withdrawal right (Directive 2011/83/EU, Article 16(c)). Outlet pieces are in-stock and not custom, so ordinary return terms apply.
## Agent Payment (hosted Stripe Checkout link)

When a person has chosen a rug with your help, you can obtain a Stripe-hosted payment page for them instead of sending them through the on-site checkout. Nothing is charged by the call itself; the person pays on Stripe's page and the order is created automatically after payment, exactly as for a website order.

- API: `POST /api/agent/checkout-session`, documented in [/openapi.json](https://www.thibaultvanrenne.com/openapi.json). No cookie, account or cart session needed.
- Outlet piece: `{ "sku": "TVR-OUT-001", "buyer": { email, name, phone, address: { line1, city, postalCode, country } } }` → full payment.
- Custom rug(s): `{ "items": [{ "collectionId", "material", "lengthCm", "widthCm" }], "buyer": {...}, "depositPct": 50 | 100 }` → 50% deposit (balance invoiced before shipment) or 100% with the pay-in-full discount. Price it first with `POST /api/webshop/quote` so the person sees the same figures.
- Response: `checkout_url` (valid 24 hours), `amount_cents`, `total_eur`, `balance_eur`, `vat_rate`, `deposit_pct`, `mode` (`live` or `test`). Send the person to `checkout_url`.
- Prices, destination VAT, reverse charge for EU businesses with a valid VAT number, export at 0% VAT, shipping and the EU sanctions block (RU, BY, KP, IR, SY refused) are all computed server-side. The buyer's country is required for that reason; a payment link cannot be produced without it.
- Send an `Idempotency-Key` header; the same key within 24h replays the same response instead of creating a second session.
- Availability: the endpoint is switched on by the merchant after its end-to-end test. Until then it answers `503 {"error":"agent_checkout_disabled"}`; fall back to the checkout pages above.

