{"openapi":"3.1.0","info":{"title":"Bulk QR Code Generator","description":"Send a list of texts — website addresses, phone numbers, plain words, WiFi details, anything — and get back a ready-to-use QR code image for each one. Every QR code comes as a base64-encoded PNG you can drop straight into a webpage or save to disk. Great for marketing campaigns, event tickets, product labels, menus, or any situation where you need many QR codes in one go. Empty entries are quietly skipped. Each input is limited to 700 characters. You must send at least one non-empty entry.","version":"1.0.0","contact":{"name":"_done","url":"https://forms.gle/5KzuSFH7p8hHtDmz7","email":"info@underscoredone.com"},"x-openapi-url":"https://qr-code-generator.underscoredone.com/openapi.json","x-logo":{"url":"https://underscoredone.com/logo.png","altText":"_done"},"x-guidance":"POST a JSON body with a key 'texts' containing an array of strings. Each string becomes one QR code. The response is an array of objects in the same order as the non-empty inputs, each containing 'text' (the original string) and 'qr_base64' (a data URI string starting with 'data:image/png;base64,' ready for use in an HTML img src or file save). Strings longer than 700 characters or that are empty after stripping whitespace are rejected with a 400 error identifying the offending index. The output is fully deterministic: the same input text always produces the same base64 PNG. Use the 'size' parameter (integer, pixels, default 600, range 100–1200) to control image width. Use 'error_correction' parameter (L, M, Q, H — default H) to control scan reliability.","x-ai-instructions":"POST a JSON body with a key 'texts' containing an array of strings. Each string becomes one QR code. The response is an array of objects in the same order as the non-empty inputs, each containing 'text' (the original string) and 'qr_base64' (a data URI string starting with 'data:image/png;base64,' ready for use in an HTML img src or file save). Strings longer than 700 characters or that are empty after stripping whitespace are rejected with a 400 error identifying the offending index. The output is fully deterministic: the same input text always produces the same base64 PNG. Use the 'size' parameter (integer, pixels, default 600, range 100–1200) to control image width. Use 'error_correction' parameter (L, M, Q, H — default H) to control scan reliability.","x-provider":"_done — single-purpose utility APIs for developers and AI agents. Pay per call with USDC on Base.","x-pricing":{"model":"pay-per-call","currency":"USDC","network":"Base Mainnet","price":"$0.01"},"x-keywords":["qr code","qr code generator","qr","barcode","url to qr","text to qr","qr image","png","svg","link shortening","mobile","scan","contactless","conversion","generation","utility","api","ai-agent","pay-per-call","usdc","x402"],"x-category":"conversion","x-provider-url":"https://underscoredone.com","x-402":{"price":"$0.01","network":"eip155:8453","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","pay_to":"0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08","facilitator":"https://facilitator.payai.network","scheme":"exact","description":"Send a list of texts — website addresses, phone numbers, plain words, WiFi details, anything — and get back a ready-to-use QR code image for each one. Every QR code comes as a base64-encoded PNG you can drop straight into a webpage or save to disk. Great for marketing campaigns, event tickets, product labels, menus, or any situation where you need many QR codes in one go. Empty entries are quietly skipped. Each input is limited to 700 characters. You must send at least one non-empty entry.","mime_type":"application/json"}},"paths":{"/generate":{"post":{"tags":["Conversion"],"summary":"Convert a list of texts into QR code PNG images in one request","description":"Turn a list of texts into QR code PNG images. Empty entries are skipped. At least one real entry must be in the list.","operationId":"generate_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QRRequest"},"examples":{"typical":{"summary":"Typical input","value":{"texts":["https://example.com","https://example.com/product/42","WiFi:T:WPA;S:GuestNetwork;P:welcome123;;","Phone: +1-800-555-0199"],"size":600,"error_correction":"H"}},"zero_or_empty":{"summary":"Zero or empty input","value":{"texts":["","   ",""],"size":600,"error_correction":"H"}},"negative_or_invalid":{"summary":"Invalid input (400 error)","value":{"texts":["hello"],"size":50,"error_correction":"Z"}},"large":{"summary":"Large input","value":{"texts":["https://example.com/page/1","https://example.com/page/2","https://example.com/page/3","https://example.com/page/4","https://example.com/page/5","https://example.com/page/6","https://example.com/page/7","https://example.com/page/8","https://example.com/page/9","https://example.com/page/10","https://example.com/page/11","https://example.com/page/12","https://example.com/page/13","https://example.com/page/14","https://example.com/page/15","https://example.com/page/16","https://example.com/page/17","https://example.com/page/18","https://example.com/page/19","https://example.com/page/20"],"size":1200,"error_correction":"H"}}}}},"required":true},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QRResponse"},"examples":{"success":{"summary":"Successful response","value":{"api_version":"1.0.0","count":2,"results":[{"text":"https://example.com","qr_base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAYAAAC+ZpjcAA..."},{"text":"Phone: +1-800-555-0199","qr_base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAYAAAC+ZpjcAA..."}]}}}}}},"422":{"description":"Unprocessable — a required field is missing or the wrong type. Check the detail field for specifics.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"array"}}}}}},"402":{"description":"Payment required. Send a signed USDC payment on Base Mainnet using the x402 protocol.","headers":{"X-Payment-Response":{"description":"x402 payment challenge — base64-encoded JSON with payment details.","schema":{"type":"string"}}}},"400":{"description":"Bad request — your input failed validation or could not be processed. Check the detail field for specifics.","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"}}}}}}},"x-ai-instructions":"POST a JSON body with a key 'texts' containing an array of strings. Each string becomes one QR code. The response is an array of objects in the same order as the non-empty inputs, each containing 'text' (the original string) and 'qr_base64' (a data URI string starting with 'data:image/png;base64,' ready for use in an HTML img src or file save). Strings longer than 700 characters or that are empty after stripping whitespace are rejected with a 400 error identifying the offending index. The output is fully deterministic: the same input text always produces the same base64 PNG. Use the 'size' parameter (integer, pixels, default 600, range 100–1200) to control image width. Use 'error_correction' parameter (L, M, Q, H — default H) to control scan reliability.","x-guidance":"POST a JSON body with a key 'texts' containing an array of strings. Each string becomes one QR code. The response is an array of objects in the same order as the non-empty inputs, each containing 'text' (the original string) and 'qr_base64' (a data URI string starting with 'data:image/png;base64,' ready for use in an HTML img src or file save). Strings longer than 700 characters or that are empty after stripping whitespace are rejected with a 400 error identifying the offending index. The output is fully deterministic: the same input text always produces the same base64 PNG. Use the 'size' parameter (integer, pixels, default 600, range 100–1200) to control image width. Use 'error_correction' parameter (L, M, Q, H — default H) to control scan reliability.","x-payment-info":{"price":{"fixed":{"mode":"fixed","currency":"USD","amount":"0.01"}},"protocols":[{"x402":{}}]}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"QRRequest":{"properties":{"texts":{"items":{"type":"string"},"type":"array","title":"Texts","description":"The list of things you want turned into QR codes — website addresses, phone numbers, plain text, WiFi credentials, anything you like. Each entry must be 700 characters or fewer. Empty entries are skipped. At least one real entry is required."},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size","description":"How wide (and tall — QR codes are square) the output image should be, measured in pixels. Must be between 100 and 1200. Defaults to 600 if you leave it out.","default":600},"error_correction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Correction","description":"How much damage or dirt the QR code can survive and still scan correctly. Choose L (least tough, smallest code), M, Q, or H (most tough, slightly larger code). Defaults to H, which is best for printed labels or stickers.","default":"H"}},"type":"object","required":["texts"],"title":"QRRequest","example":{"error_correction":"H","size":600,"texts":["https://example.com","https://example.com/product/42"]}},"QRResponse":{"properties":{"api_version":{"type":"string","title":"Api Version","description":"API version","default":"1.0.0"},"count":{"type":"integer","title":"Count","description":"How many QR codes were generated — matches the number of non-empty entries you sent."},"results":{"items":{"$ref":"#/components/schemas/QRResult"},"type":"array","title":"Results","description":"One entry for each non-empty text you sent, in the same order, each containing the original text and its QR code image."}},"type":"object","required":["count","results"],"title":"QRResponse","example":{"api_version":"1.0.0","count":1,"results":[{"qr_base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...","text":"https://example.com"}]}},"QRResult":{"properties":{"text":{"type":"string","title":"Text","description":"The original text that was turned into this QR code."},"qr_base64":{"type":"string","title":"Qr Base64","description":"The QR code image as a data URI string starting with 'data:image/png;base64,' — paste it straight into an HTML img src or decode it to save as a PNG file."}},"type":"object","required":["text","qr_base64"],"title":"QRResult"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"siwx":{"type":"apiKey","in":"header","name":"SIGN-IN-WITH-X","description":"CAIP-122 wallet signature for repeat access after payment"}}},"servers":[{"url":"https://qr-code-generator.underscoredone.com","description":"Production"}]}