Skip to main content
Create a payment link, hand the payer its URL, take payment status from webhooks, and reconcile against the list endpoint.
Base URL https://api.moove.xyz. Generated against openapi.json.

endpoint
required
Requires the payment_link:create scope.
Creates a payment link and returns its id and shareable checkout url — send the payer to that URL.
The 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.

Body

number | string
required
Amount to request, denominated in the settlement token of the authenticated user’s default wallet. Must be greater than 0.Send it as a string to avoid floating-point rounding.It must also fit the settlement token’s decimal precision. The amount is quantised to the token’s decimals; if that changes the value, the request is rejected with 422 INVALID_PAYMENT_LINK_AMOUNT.USDC has 6 decimals, so against a USDC wallet:Different tokens have different precision, and the limit is the destination wallet’s token, not yours. Read token.decimals from the list endpoint if you need to round before sending.
string
Shown to the payer on the checkout page. Maximum 500 characters.
integer
How many payments the link accepts before it completes. Minimum 1. Unlimited when omitted.
string
ISO 8601 timestamp, in the future. After it passes the link stops accepting payments. Never expires when omitted.

Request

Response

string
required
The payment link’s id.
string
required
The shareable checkout URL. Send the payer here.
200
Create returns only id and url — not the full record. Status, token and amounts require the list endpoint. This is deliberate: the caller’s job is to produce a link, and a second round-trip to learn the URL would accomplish nothing.

Requires the payment_link:read scope.
Returns the payment links belonging to the authenticated user, newest first, 10 per page.
A key sees every link its owner can see — including links created from the dashboard or by a sibling key. This is the endpoint to reconcile against.

Query parameters

string
Filter by status. One of active, inactive, completed. Omit for all.
integer
default:"0"
Page offset. Follow nextOffset from the previous response.

Request

Response

PaymentLinkData[]
required
The page of results.
integer
required
Results per page. Fixed at 10.
integer
required
The offset this page was fetched at.
integer | null
Offset for the next page. null at the end.
200
Pagination →
No authentication. This endpoint is public.
Returns a single payment link by id, enriched with its owner’s public profile.
This endpoint is unauthenticated by design, and its response is public.It is what the hosted checkout page calls to render a link: the payer has no Moove account and no API key, so requiring either would make the link unpayable. Anyone holding a link id can read it.It returns the owner’s public profile — handle, username, profile image — the same fields their Moove Profile already shows. It does not expose anything private to the account. Treat a link id as a shareable secret: it is not a credential, but it does identify a request for payment.

Request

Response

Every field of PaymentLinkData — as returned by list — plus:
UserData
required
The link owner’s public profile.
string | null
A PaymentLinkData field, populated only here. null until the link is completed; then the moove.xyz page for its most recent settled payment, https://moove.xyz/tx/{id}. Not a block-explorer link.
Use this to build your own checkout page against a link you created. For reconciliation across many links, use list — it is scoped to your key and pages properly.

Errors


Errors

Branch on code, never on message.
A malformed body is also a 422, raised by request validation before it reaches any of the above. errors carries one entry per problem: message describes the rule that failed and code is a validation type such as missing, greater_than or json_invalid. The field is not named.
422
INVALID_API_KEY deliberately covers unknown, revoked and deactivated keys with one message. Distinguishing them would tell an attacker whether a guessed key ever existed.
A 409 means the key owner has no default wallet or no handle. Nothing in your code can fix it — surface it to the user.
Errors →

Get paid without polling

Webhooks

Register an HTTPS endpoint and Moove POSTs a signed body when a link is paid, and again when a payment completes it. Deactivation and expiry send no event. Keep GET /v1/payment-link for reconciling those, and anything a delivery missed.

Not in the API

Deactivating a link is a dashboard action, not an API call. Manage links at moove.xyz/dashboard/payment-link.Registering a webhook endpoint is also a console action, at moove.xyz/business/manage/webhooks. Both are done by a signed-in person, not by a key.

Next

Pagination

Page through every link.

Moove Agentic Payments

Build the integration with a prompt.

Moove Payment Links

The dashboard side.