{"openapi":"3.1.0","info":{"title":"MostlyQR API","version":"1.0.0","description":"Create and manage dynamic QR links."},"servers":[{"url":"https://mostlyqr.com/api"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your API key: `Authorization: Bearer mtq_live_…`"}}},"security":[{"bearerAuth":[]}],"paths":{"/v1/links":{"post":{"operationId":"createLink","summary":"Create a dynamic link","tags":["Links"],"parameters":[],"responses":{"200":{"description":"The created link"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["destination_url"],"properties":{"destination_url":{"type":"string"},"title":{"type":"string"}}}}}}},"get":{"operationId":"listLinks","summary":"List your links","tags":["Links"],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}}}},"/v1/links/{code}":{"get":{"operationId":"getLink","summary":"Get one link","tags":["Links"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}}},"patch":{"operationId":"updateLink","summary":"Repoint or rename a link","tags":["Links"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"destination_url":{"type":"string"},"title":{"type":"string"}}}}}}},"delete":{"operationId":"deleteLink","summary":"Delete a link","tags":["Links"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}}}},"/v1/links/{code}/analytics":{"get":{"operationId":"getLinkAnalytics","summary":"Scan analytics for a link","tags":["Analytics"],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}},{"name":"range","in":"query","required":false,"schema":{"type":"string","enum":["24h","7d","30d","all"]}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}}}},"/v1/batch/links":{"post":{"operationId":"createLinkBatch","summary":"Batch-create dynamic links (async job)","tags":["Batch"],"parameters":[],"responses":{"200":{"description":"Job accepted","content":{"application/json":{"schema":{"type":"object","properties":{"job_id":{"type":"string"},"total":{"type":"integer"},"queued":{"type":"boolean"},"errors":{"type":"array","items":{"type":"object"}}}}}}},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"links":{"type":"array","items":{"type":"object","required":["destination_url"],"properties":{"destination_url":{"type":"string"},"title":{"type":"string"},"folder":{"type":"string"}}}},"csv":{"type":"string","description":"Alternative to `links`: an RFC-4180 CSV with a header row (destination_url[,title][,folder])."},"folder_id":{"type":"string","description":"File every imported link under this folder."}}}}}}}},"/v1/batch/jobs/{id}":{"get":{"operationId":"getBatchJob","summary":"Poll a batch-import job","tags":["Batch"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job status","content":{"application/json":{"schema":{"type":"object","properties":{"job_id":{"type":"string"},"status":{"type":"string","enum":["queued","running","done","failed"]},"total":{"type":"integer"},"created":{"type":"integer"},"progress":{"type":"number"}}}}}},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}}}},"/v1/serialized/campaigns/{id}/mint":{"post":{"operationId":"mintSerializedCodes","summary":"Mint unique per-unit codes (async job)","tags":["Serialized"],"parameters":[{"name":"id","in":"path","required":true,"description":"campaign id","schema":{"type":"string"}}],"responses":{"200":{"description":"Mint job accepted","content":{"application/json":{"schema":{"type":"object","properties":{"job_id":{"type":"string"},"batch_id":{"type":"string"},"total":{"type":"integer"},"status":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["count"],"properties":{"count":{"type":"integer","description":"How many unique units to mint."},"batch_id":{"type":"string"},"label":{"type":"string"}}}}}}}},"/v1/serialized/jobs/{id}":{"get":{"operationId":"getSerializedJob","summary":"Poll a serialized mint job","tags":["Serialized"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Mint job status","content":{"application/json":{"schema":{"type":"object","properties":{"job_id":{"type":"string"},"status":{"type":"string"},"total":{"type":"integer"},"minted":{"type":"integer"},"batch_id":{"type":"string"},"campaign_id":{"type":"string"},"progress":{"type":"number"}}}}}},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}}}},"/v1/serialized/campaigns/{id}/export":{"post":{"operationId":"exportSerializedCodes","summary":"Build a print-ready export bundle (signed URL)","tags":["Serialized"],"parameters":[{"name":"id","in":"path","required":true,"description":"campaign id","schema":{"type":"string"}}],"responses":{"200":{"description":"Signed bundle URL","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"count":{"type":"integer"},"filename":{"type":"string"},"expires_in_ms":{"type":"integer"}}}}}},"401":{"description":"Missing or invalid API key"},"429":{"description":"Rate limit exceeded"}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"batch_id":{"type":"string"},"includeJsonl":{"type":"boolean"}}}}}}}}}}