{"openapi":"3.1.0","info":{"title":"QR Atelier API","version":"v1","description":"Turn a design, the JSON the studio saves in design files, into its QR code, drawn as SVG by the studio’s engine. No key or account. Classic codes aren’t scan-tested on the server: test them with a scanner, or open the design in the studio."},"servers":[{"url":"https://qratelier.app","description":"Production"},{"url":"https://qr.cfstcyr.com","description":"Production, the earlier address"}],"paths":{"/api/v1/codes":{"post":{"operationId":"createCode","summary":"Make a QR code from a design","description":"A classic design gives its classic code, byte for byte the studio’s. A picture design gives the automatic pick, scan-tested on the server. The answer is the SVG itself, or JSON with the SVG and the symbol’s details when Accept prefers application/json. The checks run in this order: preflight, method, rate limit, content type, body size, body, code.","requestBody":{"required":true,"description":"The design file envelope, at most 1,048,576 bytes. app and version are optional: a minimal call is just { \"design\": { ... } }.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeRequest"},"examples":{"link":{"summary":"A link","value":{"design":{"contentType":"url","contentValues":{"url":{"url":"https://example.com"}}}}},"wifi":{"summary":"A Wi-Fi network","value":{"design":{"contentType":"wifi","contentValues":{"wifi":{"ssid":"Studio","encryption":"WPA","password":"correct horse","hidden":false}},"ecl":"Q"}}},"styled":{"summary":"Colours, shapes and a frame","value":{"design":{"contentType":"text","contentValues":{"text":{"text":"Hello from the API"}},"style":{"foreground":{"type":"solid","color":"#006241"},"dotShape":"dots","eyeFrameShape":"rounded","eyeBallShape":"circle","frame":{"style":"banner-bottom","text":"Scan me","color":"#006241","textColor":"#ffffff"}}}}},"logo":{"summary":"A logo","description":"The code grows until it still reads with every module under the logo flipped.","value":{"design":{"contentType":"url","contentValues":{"url":{"url":"https://example.com"}},"style":{"logo":{"src":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMCAxMCI+PGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjUiIGZpbGw9IiNmNzVjMDAiLz48L3N2Zz4="}}}}}}}}},"responses":{"200":{"description":"The code: SVG by default, JSON with Accept: application/json.","headers":{"x-qr-version":{"schema":{"type":"integer","minimum":1,"maximum":40,"description":"QR version of the symbol."},"description":"QR version of the symbol."},"x-qr-ecl":{"schema":{"type":"string","enum":["L","M","Q","H"],"description":"Error correction level of the symbol."},"description":"Error correction level of the symbol."},"x-qr-mask":{"schema":{"type":"integer","minimum":0,"maximum":7,"description":"Mask pattern of the symbol."},"description":"Mask pattern of the symbol."},"x-qr-verified":{"schema":{"type":"string","enum":["true","false"]},"description":"true only for a picture code that passed the server’s scan test."}},"content":{"image/svg+xml":{"schema":{"type":"string","contentMediaType":"image/svg+xml"}},"application/json":{"schema":{"$ref":"#/components/schemas/CodeJson"}}}},"400":{"description":"invalid_json, invalid_design, unsupported_version","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_json":{"summary":"invalid_json","description":"The body is not valid JSON.","value":{"error":"invalid_json","message":"The body is not valid JSON."}},"invalid_design":{"summary":"invalid_design","description":"The body must be { \"design\": { \"contentType\", \"contentValues\", ... } } with a known content type and its values; \"version\" (optional) is a design version and \"app\" (optional) is \"qr-atelier\".","value":{"error":"invalid_design","message":"The body must be { \"design\": { \"contentType\", \"contentValues\", ... } } with a known content type and its values; \"version\" (optional) is a design version and \"app\" (optional) is \"qr-atelier\"."}},"unsupported_version":{"summary":"unsupported_version","description":"This design is from a newer version of QR Atelier than this API reads: send version 4.","value":{"error":"unsupported_version","message":"This design is from a newer version of QR Atelier than this API reads: send version 4."}}}}}},"405":{"description":"method_not_allowed","headers":{"allow":{"schema":{"type":"string","const":"POST, OPTIONS"},"description":"The methods the route answers."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"method_not_allowed":{"summary":"method_not_allowed","description":"Use POST.","value":{"error":"method_not_allowed","message":"Use POST."}}}}}},"413":{"description":"payload_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"payload_too_large":{"summary":"payload_too_large","description":"The body is over 1,048,576 bytes: send smaller pictures or logos.","value":{"error":"payload_too_large","message":"The body is over 1,048,576 bytes: send smaller pictures or logos."}}}}}},"415":{"description":"unsupported_media_type","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"unsupported_media_type":{"summary":"unsupported_media_type","description":"Send the body as JSON (Content-Type: application/json).","value":{"error":"unsupported_media_type","message":"Send the body as JSON (Content-Type: application/json)."}}}}}},"422":{"description":"invalid_content, content_too_long, logo_too_large, design_too_complex, invalid_picture, picture_too_large, invalid_logo, unsupported_render, picture_content_too_long","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"invalid_content":{"summary":"invalid_content","description":"The content is empty or invalid for its type: check contentValues[contentType].","value":{"error":"invalid_content","message":"The content is empty or invalid for its type: check contentValues[contentType]."}},"content_too_long":{"summary":"content_too_long","description":"The content is too long for any QR code at this error correction level: shorten it, or lower ecl.","value":{"error":"content_too_long","message":"The content is too long for any QR code at this error correction level: shorten it, or lower ecl."}},"logo_too_large":{"summary":"logo_too_large","description":"The logo covers too much of the code: no version still reads with it. Make it smaller.","value":{"error":"logo_too_large","message":"The logo covers too much of the code: no version still reads with it. Make it smaller."}},"design_too_complex":{"summary":"design_too_complex","description":"This design would draw too large an SVG (a long custom module shape repeated on a large code). Use a simpler shape or shorter content.","value":{"error":"design_too_complex","message":"This design would draw too large an SVG (a long custom module shape repeated on a large code). Use a simpler shape or shorter content."}},"invalid_picture":{"summary":"invalid_picture","description":"The picture must be a WebP, PNG or JPEG data: URL (base64) that decodes.","value":{"error":"invalid_picture","message":"The picture must be a WebP, PNG or JPEG data: URL (base64) that decodes."}},"picture_too_large":{"summary":"picture_too_large","description":"The picture is over 768 px on its long side: scale it down to 768 px, the size the studio stores.","value":{"error":"picture_too_large","message":"The picture is over 768 px on its long side: scale it down to 768 px, the size the studio stores."}},"invalid_logo":{"summary":"invalid_logo","description":"In picture mode the logo must be a WebP, PNG or JPEG data: URL (base64) of at most 1024 px, or a Lucide icon from the studio. Other SVG logos are refused: use a PNG instead.","value":{"error":"invalid_logo","message":"In picture mode the logo must be a WebP, PNG or JPEG data: URL (base64) of at most 1024 px, or a Lucide icon from the studio. Other SVG logos are refused: use a PNG instead."}},"unsupported_render":{"summary":"unsupported_render","description":"style.imageMode \"photo\" isn’t available through the API: use \"modules\" or \"halftone\", each with style.colorSource \"style\" or \"picture\".","value":{"error":"unsupported_render","message":"style.imageMode \"photo\" isn’t available through the API: use \"modules\" or \"halftone\", each with style.colorSource \"style\" or \"picture\"."}},"picture_content_too_long":{"summary":"picture_content_too_long","description":"Picture codes take short content: about 150, 120, 105 and 95 characters of a link at levels L, M, Q and H (versions 7, 7, 8 and 9). Shorten the content, or use a classic code.","value":{"error":"picture_content_too_long","message":"Picture codes take short content: about 150, 120, 105 and 95 characters of a link at levels L, M, Q and H (versions 7, 7, 8 and 9). Shorten the content, or use a classic code."}}}}}},"429":{"description":"rate_limited","headers":{"retry-after":{"schema":{"type":"integer","const":60},"description":"Seconds to wait before trying again."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"rate_limited":{"summary":"rate_limited","description":"Too many requests from this address: try again in 60 seconds.","value":{"error":"rate_limited","message":"Too many requests from this address: try again in 60 seconds."}}}}}},"500":{"description":"internal_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"examples":{"internal_error":{"summary":"internal_error","description":"The server couldn’t make this code. Try again later.","value":{"error":"internal_error","message":"The server couldn’t make this code. Try again later."}}}}}}},"x-qr-limits":[{"id":"maxBody","label":"Request body","value":1048576,"unit":"bytes","text":"1,048,576 bytes","description":"Logos are data: URLs inside the design and count toward it."},{"id":"rateIp","label":"Requests per address","value":60,"unit":"requests / 60 s","text":"60 requests / 60 s","description":"Per IPv4 address or IPv6 /64, counted per Cloudflare location. Refused requests count too."},{"id":"ratePicture","label":"Picture designs per address","value":10,"unit":"requests / 60 s","text":"10 requests / 60 s","description":"Among the requests above: picture codes cost up to two seconds of CPU."},{"id":"retryAfter","label":"Wait after a refusal","value":60,"unit":"s","text":"60 s","description":"Sent as Retry-After with 429."},{"id":"maxPictureSide","label":"Picture size","value":768,"unit":"px","text":"768 px","description":"On its long side, the size the studio stores."},{"id":"maxLogoSide","label":"Logo size in picture mode","value":1024,"unit":"px","text":"1,024 px","description":"On its long side."},{"id":"maxImageBytes","label":"Picture or logo file","value":524288,"unit":"bytes","text":"524,288 bytes","description":"Decoded size of each file in picture mode."},{"id":"maxPictureVersion","label":"Picture content length","value":{"L":7,"M":7,"Q":8,"H":9},"unit":"version","text":"L: version 7, M: version 7, Q: version 8, H: version 9","description":"The QR version the content’s classic code may need, per error correction level. Longer content rarely passes the scan test and needs a classic code."},{"id":"maxPictureDetail","label":"Picture detail","value":6,"unit":"versions","text":"6 versions","description":"Extra versions the search explores; more is lowered to it."},{"id":"designVersion","label":"Design version read","value":4,"unit":"version","text":"version 4","description":"Newer designs are refused with unsupported_version."}],"x-qr-max-bytes":1048576,"x-qr-cors":{"methods":["POST","OPTIONS"],"headers":["content-type","accept"],"expose":["x-qr-version","x-qr-ecl","x-qr-mask","x-qr-verified","retry-after"]},"x-qr-builder":"design"}}},"components":{"schemas":{"CodeRequest":{"type":"object","properties":{"app":{"type":"string","const":"qr-atelier","description":"Written by Save design file, so a design file posts as is."},"version":{"type":"integer","minimum":1,"maximum":4,"default":4,"description":"The design version, as in design files: 1 for files written before design version 3, then the design version itself. Older designs are migrated."},"design":{"$ref":"#/components/schemas/Design","description":"A design as saved by the studio. It needs a known contentType and a contentValues object; every other field falls back to its default when missing or invalid."}},"required":["design"]},"Design":{"type":"object","properties":{"contentType":{"type":"string","enum":["url","text","wifi","vcard","email","phone","sms","event","location","crypto","epc","whatsapp","telegram","app","paypal"],"x-qr-enum-labels":["Link","Text","Wi-Fi","Contact","Email","Phone","SMS","Event","Location","Crypto","SEPA","WhatsApp","Telegram","App","PayPal.me"],"description":"What the code holds. Only contentValues[contentType] is encoded."},"contentValues":{"type":"object","properties":{"url":{"type":"object","title":"Link","properties":{"url":{"title":"URL","x-qr-input":"url","description":"https:// is added when no scheme is given.","examples":["example.com/page"],"type":"string","default":""}},"description":"Open a website","required":["url"]},"text":{"type":"object","title":"Text","properties":{"text":{"title":"Text","x-qr-input":"textarea","examples":["Any text…"],"type":"string","default":""}},"description":"Plain text","required":["text"]},"wifi":{"type":"object","title":"Wi-Fi","properties":{"ssid":{"title":"Network name (SSID)","x-qr-input":"text","examples":["MyNetwork"],"type":"string","default":""},"encryption":{"title":"Security","x-qr-input":"select","type":"string","enum":["WPA","WEP","nopass"],"x-qr-enum-labels":["WPA / WPA2 / WPA3","WEP","None (open)"],"default":"WPA"},"hidden":{"title":"Hidden network","x-qr-input":"checkbox","type":"boolean","default":false},"password":{"title":"Password","x-qr-input":"password","format":"password","writeOnly":true,"x-qr-visible":"conditional","type":"string","default":""}},"description":"Join a Wi-Fi network","required":["ssid","password"]},"vcard":{"type":"object","title":"Contact","properties":{"firstName":{"title":"First name","x-qr-input":"text","type":"string","default":""},"lastName":{"title":"Last name","x-qr-input":"text","type":"string","default":""},"organization":{"title":"Organization","x-qr-input":"text","description":"A card needs a name, an organization, or both.","type":"string","default":""},"title":{"title":"Job title","x-qr-input":"text","x-qr-visible":"conditional","type":"string","default":""},"mobile":{"title":"Mobile","x-qr-input":"tel","type":"string","default":""},"workPhone":{"title":"Work phone","x-qr-input":"tel","type":"string","default":""},"email":{"title":"Email","x-qr-input":"email","type":"string","default":""},"website":{"title":"Website","x-qr-input":"url","type":"string","default":""},"street":{"title":"Street","x-qr-input":"text","type":"string","default":""},"city":{"title":"City","x-qr-input":"text","type":"string","default":""},"region":{"title":"State / province","x-qr-input":"text","type":"string","default":""},"postcode":{"title":"Postal code","x-qr-input":"text","type":"string","default":""},"country":{"title":"Country","x-qr-input":"text","type":"string","default":""},"note":{"title":"Note","x-qr-input":"textarea","type":"string","default":""},"format":{"title":"Format","x-qr-input":"select","description":"MeCard is shorter, and some older Android phones read it better. It has no job title.","type":"string","enum":["vcard","mecard"],"x-qr-enum-labels":["vCard","MeCard"],"default":"vcard"}},"description":"Save a contact card (vCard or MeCard)"},"email":{"type":"object","title":"Email","properties":{"to":{"title":"To","x-qr-input":"email","examples":["name@example.com"],"type":"string","default":""},"subject":{"title":"Subject","x-qr-input":"text","examples":["Hello"],"type":"string","default":""},"body":{"title":"Message","x-qr-input":"textarea","examples":["Message body"],"type":"string","default":""}},"description":"Compose an email","required":["to"]},"phone":{"type":"object","title":"Phone","properties":{"phone":{"title":"Phone number","x-qr-input":"tel","description":"Include the country code so it works abroad.","examples":["+1 555 123 4567"],"type":"string","default":""}},"description":"Call a number","required":["phone"]},"sms":{"type":"object","title":"SMS","properties":{"phone":{"title":"Phone number","x-qr-input":"tel","examples":["+1 555 123 4567"],"type":"string","default":""},"message":{"title":"Message","x-qr-input":"textarea","examples":["Optional prefilled message"],"type":"string","default":""}},"description":"Send a text message","required":["phone"]},"event":{"type":"object","title":"Event","properties":{"title":{"title":"Title","x-qr-input":"text","examples":["Birthday party"],"type":"string","default":""},"location":{"title":"Location","x-qr-input":"text","examples":["Optional"],"type":"string","default":""},"start":{"title":"Starts","x-qr-input":"datetime-local","type":"string","default":""},"end":{"title":"Ends","x-qr-input":"datetime-local","type":"string","default":""},"allDay":{"title":"All-day event","x-qr-input":"checkbox","description":"Only the dates are used.","type":"boolean","default":false},"timeZone":{"title":"Time zone","x-qr-input":"select","description":"With Fixed, people in other time zones see it converted to their local time.","x-qr-visible":"conditional","type":"string","enum":["floating","utc"],"x-qr-enum-labels":["Same clock time anywhere","Fixed, in my time zone"],"default":"floating"},"reminder":{"title":"Reminder","x-qr-input":"select","type":"string","enum":["none","start","10m","30m","1h","1d"],"x-qr-enum-labels":["No reminder","At the start","10 minutes before","30 minutes before","1 hour before","1 day before"],"default":"none"},"description":{"title":"Description","x-qr-input":"textarea","examples":["Optional"],"type":"string","default":""}},"description":"Add an event to a calendar","required":["title","start"]},"location":{"type":"object","title":"Location","properties":{"format":{"title":"Open in","x-qr-input":"select","description":"Google Maps and Apple Maps links also open on a computer, and can search an address.","type":"string","enum":["geo","google","apple"],"x-qr-enum-labels":["Phone’s map app","Google Maps","Apple Maps"],"default":"geo"},"address":{"title":"Address or place","x-qr-input":"text","description":"Or enter exact coordinates below.","examples":["Jean-Talon Market, Montréal"],"x-qr-visible":"conditional","type":"string","default":""},"lat":{"title":"Latitude","x-qr-input":"text","examples":["45.5017"],"x-qr-required":"conditional","type":"string","default":""},"lng":{"title":"Longitude","x-qr-input":"text","examples":["-73.5673"],"x-qr-required":"conditional","type":"string","default":""},"label":{"title":"Label","x-qr-input":"text","examples":["Main entrance"],"x-qr-visible":"conditional","type":"string","default":""}},"description":"Show a place on a map"},"crypto":{"type":"object","title":"Crypto","properties":{"currency":{"title":"Currency","x-qr-input":"select","type":"string","enum":["bitcoin","ethereum"],"x-qr-enum-labels":["Bitcoin (BTC)","Ethereum (ETH)"],"default":"bitcoin"},"address":{"title":"Wallet address","x-qr-input":"text","type":"string","default":""},"amount":{"title":"Amount","x-qr-input":"number","examples":["Optional"],"type":"string","default":""},"label":{"title":"Label","x-qr-input":"text","examples":["Optional"],"x-qr-visible":"conditional","type":"string","default":""}},"description":"Request a Bitcoin or Ethereum payment","required":["address"]},"epc":{"type":"object","title":"SEPA","properties":{"name":{"title":"Beneficiary name","x-qr-input":"text","type":"string","default":""},"iban":{"title":"IBAN","x-qr-input":"text","examples":["DE89 3704 0044 0532 0130 00"],"type":"string","default":""},"bic":{"title":"BIC","x-qr-input":"text","examples":["Optional in the EEA"],"type":"string","default":""},"amount":{"title":"Amount (EUR)","x-qr-input":"number","examples":["Optional"],"type":"string","default":""},"reference":{"title":"Reference / message","x-qr-input":"text","description":"Up to 140 characters. A valid RF creditor reference is sent as a creditor reference, anything else as a message.","type":"string","default":""}},"description":"SEPA credit transfer (EPC / GiroCode)","required":["name","iban"]},"whatsapp":{"type":"object","title":"WhatsApp","properties":{"phone":{"title":"Phone number","x-qr-input":"tel","description":"With the country code: WhatsApp needs the full international number.","examples":["+1 555 123 4567"],"type":"string","default":""},"message":{"title":"Message","x-qr-input":"textarea","examples":["Optional: the chat opens with this text"],"type":"string","default":""}},"description":"Open a WhatsApp chat with a number","required":["phone"]},"telegram":{"type":"object","title":"Telegram","properties":{"username":{"title":"Username","x-qr-input":"text","description":"A public username, or paste a t.me link.","examples":["@username"],"type":"string","default":""}},"description":"Open a Telegram chat with a username","required":["username"]},"app":{"type":"object","title":"App","properties":{"store":{"title":"Store","x-qr-input":"select","type":"string","enum":["apple","google"],"x-qr-enum-labels":["App Store","Google Play"],"default":"apple"},"appleId":{"title":"App ID","x-qr-input":"text","description":"The number after “id” in the app’s App Store link, or paste the link.","examples":["id284882215"],"x-qr-visible":"conditional","type":"string","default":""},"package":{"title":"Package name","x-qr-input":"text","description":"The id= part of the app’s Google Play link, or paste the link.","examples":["com.example.app"],"x-qr-visible":"conditional","type":"string","default":""}},"description":"Open an app on the App Store or Google Play","required":["appleId","package"]},"paypal":{"type":"object","title":"PayPal.me","properties":{"username":{"title":"PayPal.me name","x-qr-input":"text","description":"The name after paypal.me/, or paste your link (then enter its amount below).","examples":["yourname"],"type":"string","default":""},"amount":{"title":"Amount","x-qr-input":"number","examples":["Optional"],"type":"string","default":""},"currency":{"title":"Currency","x-qr-input":"select","type":"string","enum":["account","AUD","BRL","CAD","CHF","CZK","DKK","EUR","GBP","HKD","HUF","JPY","MXN","NOK","NZD","PLN","SEK","SGD","TWD","USD"],"x-qr-enum-labels":["Account’s currency","AUD","BRL","CAD","CHF","CZK","DKK","EUR","GBP","HKD","HUF","JPY","MXN","NOK","NZD","PLN","SEK","SGD","TWD","USD"],"default":"account"}},"description":"Ask for a payment on PayPal.me","required":["username"]}},"description":"The values of each content type, keyed by type."},"mode":{"default":"classic","type":"string","enum":["classic","image"],"description":"classic, or image for a picture code (needs picture)."},"ecl":{"default":"M","type":"string","enum":["L","M","Q","H"],"description":"Error correction level. A logo can raise it: the answer is the smallest level that still reads under the logo."},"style":{"type":"object","properties":{"foreground":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"solid"},"color":{"default":"#111111","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"}}},{"type":"object","properties":{"type":{"type":"string","enum":["linear","radial"]},"from":{"default":"#000000","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},"to":{"default":"#000000","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},"angle":{"type":"number"}}},{"type":"object","properties":{"type":{"type":"string","const":"palette"},"colors":{"type":"array","items":{}},"arrangement":{"default":"scatter","type":"string","enum":["scatter","diagonal","radial","picture"]}}}]},"background":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"solid"},"color":{"default":"#ffffff","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"}}},{"type":"object","properties":{"type":{"type":"string","enum":["linear","radial"]},"from":{"default":"#000000","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},"to":{"default":"#000000","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},"angle":{"type":"number"}}}]},"transparentBackground":{"default":false,"type":"boolean"},"dotShape":{"default":"square","type":"string","enum":["square","dots","rounded","extra-rounded","classy","diamond","star","heart","vertical","horizontal","tiny","custom"]},"dotScale":{"type":"number"},"eyeFrameShape":{"default":"square","type":"string","enum":["square","rounded","extra-rounded","circle","leaf","dots","custom"]},"eyeBallShape":{"default":"square","type":"string","enum":["square","rounded","circle","leaf","diamond","custom"]},"customShapes":{"default":{"dot":null,"eyeFrame":null,"eyeBall":null},"type":"object","properties":{"dot":{"default":null,"anyOf":[{},{"type":"null"}]},"eyeFrame":{"default":null,"anyOf":[{},{"type":"null"}]},"eyeBall":{"default":null,"anyOf":[{},{"type":"null"}]}}},"eyeFrameColor":{"anyOf":[{"type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},{"type":"null"}]},"eyeBallColor":{"anyOf":[{"type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},{"type":"null"}]},"margin":{"type":"number"},"cornerRadius":{"type":"number"},"logo":{"type":"object","properties":{"src":{"default":null,"anyOf":[{"type":"string","maxLength":2000000,"pattern":"^data:image\\/"},{"type":"null"}]},"size":{"type":"number"},"clearBehind":{"default":true,"type":"boolean"},"padding":{"type":"number"},"shape":{"default":"rounded","type":"string","enum":["square","rounded","circle"]},"icon":{"default":null,"anyOf":[{"oneOf":[{"type":"object","properties":{"source":{"type":"string","const":"lucide"},"name":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{0,99}$"},"color":{"anyOf":[{"type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},{"type":"null"}]},"tile":{"default":"none","type":"string","enum":["none","white","solid"]}}},{"type":"object","properties":{"source":{"type":"string","const":"dashboard"},"name":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{0,99}$"},"format":{"default":"svg","type":"string","enum":["svg","png"]},"variants":{"default":null,"anyOf":[{"type":"object","properties":{"dark":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{0,99}$"},"light":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{0,99}$"}}},{"type":"null"}]}}}]},{"type":"null"}]}}},"frame":{"type":"object","properties":{"style":{"default":"none","type":"string","enum":["none","banner-bottom","banner-top","box","ticket"]},"text":{"type":"string"},"color":{"default":"#111111","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"},"textColor":{"default":"#ffffff","type":"string","pattern":"^(#[0-9a-f]{3,8}|[a-z]+|(rgb|hsl)a?\\([\\d\\s.,%/]+\\))$"}}},"imageMode":{"default":"modules","type":"string","enum":["modules","halftone","photo"]},"colorSource":{"default":"style","type":"string","enum":["style","picture"]},"detail":{"default":"subject","type":"string","enum":["off","subject"]},"halftoneDither":{"default":"ordered","type":"string","enum":["ordered","diffusion","atkinson","threshold"]},"shape":{"default":"square","type":"string","enum":["square","circle"]},"ringFill":{"default":true,"type":"boolean"}},"description":"Colours, dot and eye shapes, quiet zone, logo and frame, as in the studio."},"picture":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"src":{"type":"string","maxLength":2000000,"pattern":"^data:image\\/"},"placement":{"anyOf":[{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"scale":{"type":"number"},"rotation":{"type":"number"},"flip":{"default":false,"type":"boolean"}}},{"type":"null"}]},"tone":{"anyOf":[{"type":"object","properties":{"brightness":{"type":"number"},"contrast":{"type":"number"},"midtones":{"type":"number"},"smooth":{"type":"number"}}},{"type":"null"}]},"mask":{"anyOf":[{"type":"object","properties":{"w":{"type":"number"},"h":{"type":"number"},"data":{"type":"string"}}},{"type":"null"}]},"text":{"anyOf":[{"type":"object","properties":{"value":{"type":"string"},"font":{"default":"sans","type":"string","enum":["sans","serif","rounded","mono","display"]},"solid":{"default":true,"type":"boolean"}}},{"type":"null"}]}}},{"type":"null"}],"description":"Picture mode: a base64 data: URL, at most 768 px and 524,288 bytes; invalid_picture lists the formats read."},"pictureSettings":{"type":"object","properties":{"strength":{"type":"number"},"detail":{"type":"number"},"clearance":{"type":"number"},"invert":{"default":false,"type":"boolean"},"background":{"default":"light","type":"string","enum":["light","dark"]},"lock":{"default":null,"anyOf":[{"type":"object","properties":{"ecl":{"type":"string","enum":["L","M","Q","H"]},"version":{"type":"integer","minimum":1,"maximum":40},"mask":{"default":null,"anyOf":[{"type":"integer","minimum":0,"maximum":7},{"type":"null"}]}}},{"type":"null"}]}},"description":"Picture mode: strength, invert, background, lock, clearance and detail (at most 6 versions)."},"variantIndex":{"type":["number","null"]},"retouch":{"anyOf":[{"type":"object","properties":{"key":{"type":"string"},"cells":{"type":"array","items":{}}}},{"type":"null"}],"description":"Ignored: retouches belong to a variant picked in the studio."}},"required":["contentType","contentValues"]},"CodeJson":{"type":"object","properties":{"svg":{"type":"string","contentMediaType":"image/svg+xml","description":"The code, a standalone SVG: no external references, no scripts."},"version":{"type":"integer","minimum":1,"maximum":40,"description":"QR version of the symbol."},"ecl":{"type":"string","enum":["L","M","Q","H"],"description":"Error correction level of the symbol."},"mask":{"type":"integer","minimum":0,"maximum":7,"description":"Mask pattern of the symbol."},"size":{"type":"integer","minimum":21,"description":"Width of the symbol, in modules."},"verified":{"type":"boolean","description":"True only for a picture code that passed the server’s scan test. Classic codes are always false."}},"required":["svg","version","ecl","mask","size","verified"]},"Error":{"type":"object","properties":{"error":{"type":"string","enum":["invalid_json","invalid_design","unsupported_version","invalid_content","content_too_long","logo_too_large","design_too_complex","invalid_picture","picture_too_large","invalid_logo","unsupported_render","picture_content_too_long","method_not_allowed","rate_limited","unsupported_media_type","payload_too_large","internal_error"],"description":"A stable machine code: branch on it, not on the message."},"message":{"type":"string","description":"What went wrong, for people. The wording may change."}},"required":["error","message"]}}},"x-qr-docs":{"title":"API reference","document":"/api/v1/openapi.json","description":"The QR Atelier code API: endpoints, request and response schemas, errors, limits, and a request builder that calls it from your browser.","sections":["builder","request","responses","errors","limits"],"snippets":["curl","fetch","python"]}}