{"openapi":"3.1.0","info":{"title":"Moove Payments API","description":"Create and manage Moove payment links programmatically.\n\n## Authentication\n\nSend your API key in the `X-API-Key` header:\n\n```\nX-API-Key: mk_live_...\n```\n\nKeys are created in the Moove Dashboard and shown **once**, at creation. Each key is a\ndown-scope of the user who issued it: it acts as that user and can only do a subset of\nwhat they can do. No endpoint here moves funds — a key can request a payment, and\npayments always settle to the key owner's own default wallet, so a leaked key cannot\nredirect money.\n\n## Scopes\n\nA key is issued with explicit scopes and a request is rejected if the key lacks the one\nits operation requires:\n\n| Scope | Grants |\n| --- | --- |\n| `payment_link:create` | Creating payment links |\n| `payment_link:read` | Listing payment links |\n\n## Errors\n\nErrors return a non-2xx status and a body of the form\n`{\"errors\": [{\"message\": \"...\", \"code\": \"...\"}]}`. A `422` means the request body\nfailed validation; the `message` names the field. A `409` means the account itself is not\nset up to receive payments (no default wallet or no handle) — do **not** retry, its owner\nhas to act first. Only `429` and `5xx` are worth retrying.\n\n## Rate limits\n\nRequests are rate limited per API key and per source IP — whichever is reached first\napplies. Exceeding a limit returns `429`; retry with backoff.","version":"1.0.0"},"servers":[{"url":"https://api.moove.xyz"}],"paths":{"/v1/payment-link":{"get":{"tags":["Payment Links"],"summary":"List payment links","description":"Returns the payment links belonging to the authenticated user, newest first, 10 per page. Use `offset` to page and `status` to filter.\n\nA key sees every link its owner can see, including links created from the dashboard or by a sibling key — so this is the endpoint to reconcile against.\n\nRequires the `payment_link:read` scope.","operationId":"get_payment_link_v1_payment_link_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["active","inactive","completed"],"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedListData_PaymentLinkData_"}}}},"401":{"description":"Missing, invalid or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"403":{"description":"Key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"409":{"description":"The account is not set up to receive payments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"422":{"description":"Request body failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"500":{"description":"Unexpected server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}}},"post":{"tags":["Payment Links"],"summary":"Create a payment link","description":"Creates a payment link and returns its id and shareable checkout `url` — send the payer to that URL.\n\nThe link settles to the authenticated user's default wallet, in that wallet's chain and token; `toAmount` is denominated in that token. The destination cannot be specified by the caller.\n\nRequires the `payment_link:create` scope.","operationId":"post_payment_link_v1_payment_link_post","security":[{"APIKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentLinkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentLinkCreationData"}}}},"401":{"description":"Missing, invalid or expired key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"403":{"description":"Key lacks the required scope","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"409":{"description":"The account is not set up to receive payments","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"422":{"description":"Request body failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"500":{"description":"Unexpected server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}}}}},"components":{"schemas":{"ApiErrorDetail":{"properties":{"message":{"type":"string","title":"Message"},"code":{"type":"string","title":"Code"}},"type":"object","required":["message","code"],"title":"ApiErrorDetail"},"ApiErrorResponse":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/ApiErrorDetail"},"type":"array","title":"Errors"}},"type":"object","required":["errors"],"title":"ApiErrorResponse","description":"The body returned by every failed request."},"ChainData":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"symbol":{"type":"string","title":"Symbol"},"chainType":{"type":"string","enum":["EVM","SVM","TVM","BVM"],"title":"Chaintype"},"logo":{"type":"string","title":"Logo"}},"type":"object","required":["id","name","symbol","chainType","logo"],"title":"ChainData"},"PaginatedListData_PaymentLinkData_":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PaymentLinkData"},"type":"array","title":"Data"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"nextOffset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nextoffset"}},"type":"object","required":["data","limit","offset"],"title":"PaginatedListData[PaymentLinkData]"},"PaymentLinkCreationData":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"}},"type":"object","required":["id","url"],"title":"PaymentLinkCreationData"},"PaymentLinkData":{"properties":{"id":{"type":"string","title":"Id"},"userId":{"type":"string","title":"Userid"},"toAmount":{"type":"string","title":"Toamount"},"destinationAddress":{"type":"string","title":"Destinationaddress"},"url":{"type":"string","title":"Url"},"dateCreated":{"type":"string","format":"date-time","title":"Datecreated"},"token":{"$ref":"#/components/schemas/TokenData"},"status":{"type":"string","enum":["active","completed","inactive"],"title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"maxUsage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxusage"},"receivedAmount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receivedamount"},"expirationDate":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expirationdate"},"transactionUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transactionurl"}},"type":"object","required":["id","userId","toAmount","destinationAddress","url","dateCreated","token","status"],"title":"PaymentLinkData"},"PaymentLinkRequest":{"properties":{"toAmount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string"}],"title":"Toamount","description":"Amount to request, denominated in the settlement token of the authenticated user's default wallet."},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Shown to the payer on the checkout page."},"maxUsage":{"anyOf":[{"type":"integer","maximum":2147483647.0,"minimum":1.0},{"type":"null"}],"title":"Maxusage","description":"How many payments the link accepts before it completes. Unlimited when omitted."},"expirationDate":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expirationdate","description":"ISO 8601 timestamp, in the future. After it passes the link stops accepting payments. Never expires when omitted."}},"type":"object","required":["toAmount"],"title":"PaymentLinkRequest","description":"A request for payment. Settles to the caller's default wallet."},"TokenData":{"properties":{"address":{"type":"string","title":"Address"},"decimals":{"type":"integer","title":"Decimals"},"symbol":{"type":"string","title":"Symbol"},"name":{"type":"string","title":"Name"},"logo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo"},"isNative":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isnative"},"isStablecoin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isstablecoin"},"currencyCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currencycode"},"commodityCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commoditycode"},"chain":{"$ref":"#/components/schemas/ChainData"},"priceUsd":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priceusd"},"isVerified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isverified"}},"type":"object","required":["address","decimals","symbol","name","logo","isNative","isStablecoin","currencyCode","commodityCode","chain"],"title":"TokenData"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}