{"openapi":"3.1.0","info":{"title":"CodeQR (BYOK) API","version":"0.1.0","description":"CodeQR (BYOK) lets an AI assistant read your own CodeQR data through the CodeQR API with a key you supply (CodeQR API key (Settings, API Keys)). Read-only: 7 tools (list_links, count_links, get_link, list_qr_codes, count_qr_codes, get_qr_code, list_tags). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever sent to...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-codeqr.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-codeqr/docs"},"termsOfService":"https://connectorbay.com/byok-codeqr/terms"},"servers":[{"url":"https://byok-codeqr.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-codeqr/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_links":{"post":{"operationId":"list_links","summary":"List short links with destination, clicks, leads, sales, tags and dates; filter by domain, tag, folder or search text; s","description":"List short links with destination, clicks, leads, sales, tags and dates; filter by domain, tag, folder or search text; sort by date, clicks or last click. Passwords and notification tokens are left out. Use for \"Which of my CodeQR short links got the most clicks\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_slug":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Slug of your CodeQR project (for app.codeqr.io/acme it is acme); needed when the key is not tied to one project.","title":"Project Slug"},"domain":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only links or codes on this domain, for example ac.me.","title":"Domain"},"tag_names":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only items with these tag names, comma separated (case insensitive).","title":"Tag Names"},"folder_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only items in this folder id.","title":"Folder Id"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Match on slug and destination URL.","title":"Search"},"show_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Include archived items (default false).","title":"Show Archived"},"sort":{"anyOf":[{"enum":["createdAt","clicks","lastClicked"],"type":"string"},{"type":"null"}],"default":"createdAt","description":"Sort field.","title":"Sort"},"with_tags":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Include tags in each link (default false).","title":"With Tags"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number (default 1).","title":"Page"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Items per page (1 to 100, default 100).","title":"Page Size"}},"title":"list_linksArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/count_links":{"post":{"operationId":"count_links","summary":"Count short links with the same filters as list_links; group by domain to count per domain. Use for \"How many short link","description":"Count short links with the same filters as list_links; group by domain to count per domain. Use for \"How many short links do I have in CodeQR\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_slug":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Slug of your CodeQR project (for app.codeqr.io/acme it is acme); needed when the key is not tied to one project.","title":"Project Slug"},"domain":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only links or codes on this domain, for example ac.me.","title":"Domain"},"tag_names":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only items with these tag names, comma separated (case insensitive).","title":"Tag Names"},"folder_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only items in this folder id.","title":"Folder Id"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Match on slug and destination URL.","title":"Search"},"show_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Include archived items (default false).","title":"Show Archived"},"group_by":{"anyOf":[{"const":"domain","type":"string"},{"type":"null"}],"default":null,"description":"Group the count by domain.","title":"Group By"}},"title":"count_linksArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_link":{"post":{"operationId":"get_link","summary":"Get one short link by project slug, domain and key, or by link id, with destination, clicks, leads, sales and tags. Use ","description":"Get one short link by project slug, domain and key, or by link id, with destination, clicks, leads, sales and tags. Use for \"How is my CodeQR link codeqr.link/promo doing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_slug":{"description":"Slug of your CodeQR project.","maxLength":100,"title":"Project Slug","type":"string"},"domain":{"description":"Domain of the link.","maxLength":200,"title":"Domain","type":"string"},"key":{"description":"Slug of the link, for example promo.","maxLength":200,"title":"Key","type":"string"},"link_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Link id (alternative to the key).","title":"Link Id"}},"required":["project_slug","domain","key"],"title":"get_linkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_qr_codes":{"post":{"operationId":"list_qr_codes","summary":"List QR codes with type, destination, scans, leads, sales, tags and dates; filter by type, format, domain, tag or folder","description":"List QR codes with type, destination, scans, leads, sales, tags and dates; filter by type, format, domain, tag or folder. Passwords and the contact, wifi or crypto payloads are left out. Use for \"Which of my CodeQR QR codes are scanned most\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_slug":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Slug of your CodeQR project (for app.codeqr.io/acme it is acme); needed when the key is not tied to one project.","title":"Project Slug"},"domain":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only links or codes on this domain, for example ac.me.","title":"Domain"},"tag_names":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only items with these tag names, comma separated (case insensitive).","title":"Tag Names"},"folder_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only items in this folder id.","title":"Folder Id"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Match on slug and destination URL.","title":"Search"},"show_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Include archived items (default false).","title":"Show Archived"},"format":{"anyOf":[{"enum":["static","dynamic"],"type":"string"},{"type":"null"}],"default":null,"description":"static or dynamic QR codes.","title":"Format"},"type":{"anyOf":[{"enum":["url","text","email","wifi","phone","vcard","crypto","sms","facetime","geo","latlog","pix","whatsapp"],"type":"string"},{"type":"null"}],"default":null,"description":"QR code type.","title":"Type"},"sort":{"anyOf":[{"enum":["createdAt","scans","lastClicked"],"type":"string"},{"type":"null"}],"default":"createdAt","description":"Sort field.","title":"Sort"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number (default 1).","title":"Page"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Items per page (1 to 100, default 100).","title":"Page Size"}},"title":"list_qr_codesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/count_qr_codes":{"post":{"operationId":"count_qr_codes","summary":"Count QR codes with the same filters as list_qr_codes. Use for \"How many QR codes do I have in CodeQR\".","description":"Count QR codes with the same filters as list_qr_codes. Use for \"How many QR codes do I have in CodeQR\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_slug":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Slug of your CodeQR project (for app.codeqr.io/acme it is acme); needed when the key is not tied to one project.","title":"Project Slug"},"domain":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only links or codes on this domain, for example ac.me.","title":"Domain"},"tag_names":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Only items with these tag names, comma separated (case insensitive).","title":"Tag Names"},"folder_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only items in this folder id.","title":"Folder Id"},"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Match on slug and destination URL.","title":"Search"},"show_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Include archived items (default false).","title":"Show Archived"},"format":{"anyOf":[{"enum":["static","dynamic"],"type":"string"},{"type":"null"}],"default":null,"description":"static or dynamic QR codes.","title":"Format"},"type":{"anyOf":[{"enum":["url","text","email","wifi","phone","vcard","crypto","sms","facetime","geo","latlog","pix","whatsapp"],"type":"string"},{"type":"null"}],"default":null,"description":"QR code type.","title":"Type"},"group_by":{"anyOf":[{"const":"domain","type":"string"},{"type":"null"}],"default":null,"description":"Group the count by domain.","title":"Group By"}},"title":"count_qr_codesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_qr_code":{"post":{"operationId":"get_qr_code","summary":"Get one QR code by project slug, domain and key, or by id, with type, destination, scans and tags. Use for \"How many tim","description":"Get one QR code by project slug, domain and key, or by id, with type, destination, scans and tags. Use for \"How many times was my CodeQR menu QR code scanned\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"project_slug":{"description":"Slug of your CodeQR project.","maxLength":100,"title":"Project Slug","type":"string"},"domain":{"description":"Domain of the QR code.","maxLength":200,"title":"Domain","type":"string"},"key":{"description":"Slug of the QR code, for example menu.","maxLength":200,"title":"Key","type":"string"},"qr_code_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"QR code id (alternative to the key).","title":"Qr Code Id"}},"required":["project_slug","domain","key"],"title":"get_qr_codeArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tags":{"post":{"operationId":"list_tags","summary":"List the tags used to organise links and QR codes (id, name, colour). Use for \"Which tags do I use in CodeQR\".","description":"List the tags used to organise links and QR codes (id, name, colour). Use for \"Which tags do I use in CodeQR\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"sort_by":{"anyOf":[{"enum":["name","createdAt"],"type":"string"},{"type":"null"}],"default":"name","description":"Sort field.","title":"Sort By"},"sort_order":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"asc","description":"Sort order.","title":"Sort Order"},"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Match on tag name.","title":"Search"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number (default 1).","title":"Page"},"page_size":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"Items per page (1 to 100, default 100).","title":"Page Size"}},"title":"list_tagsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}