Bulk QR Code Generator

Turn a list of text, URLs, or any strings into QR code images instantly — one call, many codes. 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. Pay-per-call at $0.01 USDC over x402 on Base or Solana — no account, no API key. OpenAPI 3.1.0; 1 operation(s): POST /generate.

OpenAPI Specification

done-qr-code-generator-openapi.yml Raw ↑
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 Mainnet or
    Solana Mainnet.
  x-pricing:
    model: pay-per-call
    currency: USDC
    network: Base Mainnet or Solana Mainnet
    price: $0.01
  x-keywords: []
  x-category: qr code
  x-provider-url: https://underscoredone.com
  x-agentcash-auth:
    mode: paid
  x-402:
    price: $0.01
    network: eip155:8453
    asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
    pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
    facilitator: https://api.cdp.coinbase.com/platform/v2/x402
    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
    networks:
    - network: eip155:8453
      asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
      pay_to: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
    - network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
      asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
      pay_to: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b
paths:
  /generate:
    post:
      tags:
      - qr code
      - qr code generator
      - qr
      - generate qr
      - text to qr code
      - qr code image
      - url to qr
      - wifi qr code
      - bulk qr codes
      - qr png
      - create qr code
      - qr code api
      - vcard qr
      - make qr code
      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'
        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 or Solana 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
tags:
- name: qr code
- name: qr code generator
- name: qr
- name: generate qr
- name: text to qr code
- name: qr code image
- name: url to qr
- name: wifi qr code
- name: bulk qr codes
- name: qr png
- name: create qr code
- name: qr code api
- name: vcard qr
- name: make qr code
x402Version: 2
x-payment-accepts:
- scheme: exact
  network: eip155:8453
  payTo: '0xE9740820225B3918b4ddd1292C7cA4Ca0e2C2F08'
  asset: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'
- scheme: exact
  network: solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
  payTo: 8ugAWAXDB8V18kiUrGZTq1oMvU3C6Fxs8hfC6rvzQT3b
  asset: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v