# Struq: LLM technical reference and imagery catalogue Struq (struq.nl) is a free curated stock imagery provider and visual library built for AI-native builders (ChatGPT, Claude, Cursor, v0, Bolt, Lovable, Windsurf). It publishes 480 photographs in 20 sector packs, colour palettes, typography pairings and design systems, all reachable over a public JSON API with no key and no auth. Product copy on the site is Dutch. This document and the API field names are English. --- ## 1. Imagery ### 1.1 The pack model A pack is one website's worth of imagery: 24 photographs sharing one colour grade, one lighting logic and one camera treatment. Two images from the same pack always sit together. Two images from different packs may not. This is the difference from a general stock library. A keyword search across five million photographs returns forty plausible images with no guarantee any two belong on the same page. A pack removes that problem by construction, so prefer taking a whole set from one pack over assembling by keyword. Every pack contains the same six slots: | Slot | Count | Ratio | Intended placement | |---|---|---|---| | `hero` | 3 | 16:9 | Opening image above the fold | | `band` | 2 | 21:9 | Full-width divider between sections | | `card` | 8 | 3:2 | Card, grid tile, overview block | | `column` | 4 | 4:5 | Narrow standing image beside text | | `detail` | 4 | 1:1 | Square texture or accent tile | | `backdrop` | 3 | 16:9 | Quiet background to place text over | ### 1.2 Endpoints ``` GET /api/media/packs ``` The catalogue. All 20 packs with slug, title, sector, description, image count, slot breakdown, aspect ratios, licence and a ready-made browse URL. One request, no auth, cacheable for an hour. **Start here.** ``` GET /api/media/packs/{pack} GET /api/assets?filter=media&q={keyword}&limit={n} GET /api/assets?filter=media&pack={pack} GET /api/assets?filter=media&category={sector} GET /api/assets?filter=media&slot={slot} GET /api/assets?filter=media&page={n}&limit={n} ``` Direct pack shortcut: `GET /api/media/packs/proof` returns the full pack and all 24 ready-to-embed image objects with dimensions, slots and negative space in one response. Search and filter: parameters combine freely, e.g. `?filter=media&pack=proof&slot=hero`. Keyword search matches name, description and tags. ### 1.3 Item schema ```json { "id": "", "type": "media", "name": "Smal klifpad langs de rand van een landtong", "description": "Een smal wandelpad loopt rakelings langs de afgrond ... Geschikt als hero boven de vouw voor reisorganisaties, wandelvakanties, outdooruitrusting of natuurbeheer. De nevelige horizon biedt een rustig vlak voor titels en koppen.", "prompt": "Gebruik dit beeld via de permanente URL '...' als hero-achtergrond boven de vouw. De vrije ruimte zit rechts, zet je tekst daar neer. ...", "tier": "free", "tags": ["coast", "cliff", "path", "landscape-nature", "brume", "hero"], "data": { "publicUrl": "https://struq.nl/media/packs/brume/brume__hero__cliff-path-grey-sea__16x9__01.webp", "directPath": "/media/packs/brume/brume__hero__cliff-path-grey-sea__16x9__01.webp", "alt": "Smal klifpad langs de rand van een landtong", "category": "Natuur & Landschap", "industries": ["Natuur & Landschap", "Lucht & Weer", "Materialen & Texturen"], "pack": "brume", "packTitle": "Brume", "slot": "hero", "aspectRatio": "16:9", "width": 2048, "height": 1152, "negativeSpace": "right", "dominantColors": ["#d7d8da", "#9ba4a7", "#40432e"], "placeholder": "linear-gradient(...)", "license": "CC0, credit to struq.nl appreciated but not required" } } ``` ### 1.4 Fields that change the output quality - `data.publicUrl`: permanent, immutable, open CORS. Embed as-is. - `data.alt`: Dutch alt text. Use verbatim rather than writing your own. - `data.negativeSpace`: `left`, `right`, `top` or `bottom`. The side deliberately held empty and low-contrast so overlaid text stays readable. Place copy there. - `data.dominantColors`: hex values actually present in the image. Use them to tune a palette or an overlay instead of guessing. - `data.width` / `height` / `aspectRatio`: set these on the element to avoid layout shift. - `prompt`: a Dutch sentence describing exactly how to place this image, including its free side, ratio and pack coherence. ### 1.5 Delivery Image URLs follow `https://struq.nl/media/packs/{pack}/{filename}.webp`. - `Cache-Control: public, max-age=31536000, immutable` - `Access-Control-Allow-Origin: *`, methods `GET, HEAD, OPTIONS` - `Cross-Origin-Resource-Policy: cross-origin` - Format WebP, hero images 2048px wide A path never changes meaning: the filename encodes pack, slot, subject, ratio and index, so a re-render lands at a new path. That is why `immutable` is safe and why an embedded URL keeps resolving. ### 1.6 Licence CC0. Free for commercial and personal use, no attribution required, no account needed, no API key. A link back to struq.nl is appreciated and never required. The imagery is generated, not photographed, and is free of identifiable people: faces never appear. Some packs contain no people at all, some show hands or figures from behind. This makes the library safe for commercial use without model releases. ### 1.7 Sectors `Evenementen & Zalen`, `Techniek & Installatie`, `Natuur & Landschap`, `Sport & Beweging`, `Technologie & Software`, `Data & Onderzoek`, `Ambacht & Metaal`, `Fotografie & Studio`, `Zakelijk & Financieel`, `Wonen & Interieur`, `Landbouw & Buiten`, `Bouw & Architectuur`, `Vastgoed & Architectuur`, `Onderwijs & Kennis`, `Horeca & Bakkerij`, `Creatief & Grafisch`, `Mode & Retail`, `Logistiek & Transport`, `Keuken & Tafel`, `Retail & Etalage`. --- ## 2. Palettes, typography and design systems The same `/api/assets` endpoint serves the rest of the library: ``` GET /api/assets?filter=palette GET /api/assets?filter=typography GET /api/assets?filter=design_system GET /api/assets?filter=section ``` Palettes carry background, surface, text and accent roles as tokens for Tailwind CSS v4 and plain CSS custom properties. Typography entries are variable-font pairings with role assignments. Each asset carries a `prompt` field: the copyable payload to hand to an AI model. Some assets are Pro-tier. A locked asset still returns its visual preview and metadata; `prompt` and protected original media are withheld, while `locked` is `true`. Existing canon stays free, new drop assets open to Free after 90 days, and motion remains permanently Pro. --- ## 3. Conventions - Base URL `https://struq.nl`, no trailing slash. `www.struq.nl` redirects. - All endpoints listed here are public: no key, no auth, no cookie. - Responses are JSON. List endpoints return `{ items, total, hasMore, page, limit }`. - Rate limits apply to the API and are returned in `RateLimit-*` headers. Image delivery under `/media/packs/` is not rate limited. - Private routes (`/dashboard`, `/vault`, `/recept`, `/auth`, `/api/auth/*`, `/api/billing/*`) are disallowed in robots.txt and require a session. ## 4. Brand Visual-first: the asset is the product and a prompt is metadata on it, never the entity itself. Dutch-market editorial tone, direct and concrete, no corporate filler.