Payment intents

Every request goes to https://api.lemak.cash. About the reference.

Create payment intent

POST /v1/payment_intents

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
Idempotency-Key requiredheaderstringAt most 255 characters.
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.

Request body

application/json

PaymentIntentCreate

FieldTypeDescription
amount requiredinteger (int64)Minimum 1.
currency requiredstringPattern ^[A-Z]{3}$.
merchant_order_id requiredstringAt most 255 characters.
payment_method optionalstring
channel_preference optionalstring
description optionalstring
customer optionalstring
return_url optionalstring (uri)The page the payer returns to after a successful payment. It must be an absolute https URL on a host name, with no user info. An IP literal and localhost are refused, in test mode too. Any other value answers 400 invalid_return_url. At most 2048 characters.
expires_in optionalintegerSeconds.
metadata optionalobjectA map of string keys to string values.

Responses

201

Created, or the replay of an earlier identical request.

application/json

PaymentIntent

FieldTypeDescription
id requiredstring
object requiredpayment_intent
mode requiredstringOne of live, test.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
merchant_order_id requiredstring
status requiredstringOne of created, requires_payment, processing, succeeded, channel_settled, failed, expired, canceled.
payment_method optionalstring
fee optionalMoney
Fields of fee
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
fx optionalFxLock
Fields of fx
FieldTypeDescription
locked requiredboolean
lock_point optionalstringOne of on_create, on_paid, on_channel_settled.
rate optionalstringA decimal string. A rate is never a float on the wire.
quote_currency optionalstringPattern ^[A-Z]{3}$.
locked_at optionalstring (date-time)
net optionalMoneyWhat the merchant receives, in the settlement currency.
Fields of net
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
available_at optionalstring (date-time)
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
checkout_url optionalstring (uri)The hosted checkout page. It is returned by the call that creates the intent and by no other, because the store keeps only a digest of the session token.
created requiredstring (date-time)
expires_at optionalstring (date-time)
metadata optionalobjectA map of string keys to string values.

Errors

Every error answers with the error object.

StatusWhen
400A parameter is invalid. A refused return_url answers invalid_return_url.
409The idempotency key is in flight, or the merchant order id is taken.
422The idempotency key was reused with a different body.
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl -X POST https://api.lemak.cash/v1/payment_intents \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: <Idempotency-Key>" \
  -H "Api-Version: 2026-09-01" \
  -H "Content-Type: application/json" \
  -d '{
  "amount": 1000,
  "currency": "PHP",
  "merchant_order_id": "<merchant_order_id>"
}'

List payment intents

GET /v1/payment_intents

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.
limit optionalqueryintegerMinimum 1. Maximum 100. Default 20.
starting_after optionalquerystringThe id of the last object on the previous page.
status optionalquerystringOne of created, requires_payment, processing, succeeded, channel_settled, failed, expired, canceled.
merchant_order_id optionalquerystring
created[gte] optionalquerystring (date-time)

Responses

200

A page of payment intents, newest first.

application/json

PaymentIntentList

FieldTypeDescription
object requiredlist
data requiredarray of PaymentIntent
Fields of data
FieldTypeDescription
id requiredstring
object requiredpayment_intent
mode requiredstringOne of live, test.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
merchant_order_id requiredstring
status requiredstringOne of created, requires_payment, processing, succeeded, channel_settled, failed, expired, canceled.
payment_method optionalstring
fee optionalMoney
Fields of fee
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
fx optionalFxLock
Fields of fx
FieldTypeDescription
locked requiredboolean
lock_point optionalstringOne of on_create, on_paid, on_channel_settled.
rate optionalstringA decimal string. A rate is never a float on the wire.
quote_currency optionalstringPattern ^[A-Z]{3}$.
locked_at optionalstring (date-time)
net optionalMoneyWhat the merchant receives, in the settlement currency.
Fields of net
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
available_at optionalstring (date-time)
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
checkout_url optionalstring (uri)The hosted checkout page. It is returned by the call that creates the intent and by no other, because the store keeps only a digest of the session token.
created requiredstring (date-time)
expires_at optionalstring (date-time)
metadata optionalobjectA map of string keys to string values.
has_more requiredboolean

Errors

Every error answers with the error object.

StatusWhen
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl https://api.lemak.cash/v1/payment_intents \
  -H "Authorization: Bearer sk_test_..." \
  -H "Api-Version: 2026-09-01"

Payment intent

GET /v1/payment_intents/{id}

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
id requiredpathstringPattern ^pi_[0-9A-Za-z]+$.
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.

Responses

200

The payment intent.

application/json

PaymentIntent

FieldTypeDescription
id requiredstring
object requiredpayment_intent
mode requiredstringOne of live, test.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
merchant_order_id requiredstring
status requiredstringOne of created, requires_payment, processing, succeeded, channel_settled, failed, expired, canceled.
payment_method optionalstring
fee optionalMoney
Fields of fee
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
fx optionalFxLock
Fields of fx
FieldTypeDescription
locked requiredboolean
lock_point optionalstringOne of on_create, on_paid, on_channel_settled.
rate optionalstringA decimal string. A rate is never a float on the wire.
quote_currency optionalstringPattern ^[A-Z]{3}$.
locked_at optionalstring (date-time)
net optionalMoneyWhat the merchant receives, in the settlement currency.
Fields of net
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
available_at optionalstring (date-time)
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
checkout_url optionalstring (uri)The hosted checkout page. It is returned by the call that creates the intent and by no other, because the store keeps only a digest of the session token.
created requiredstring (date-time)
expires_at optionalstring (date-time)
metadata optionalobjectA map of string keys to string values.

Errors

Every error answers with the error object.

StatusWhen
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl https://api.lemak.cash/v1/payment_intents/pi_123 \
  -H "Authorization: Bearer sk_test_..." \
  -H "Api-Version: 2026-09-01"

Cancel payment intent

POST /v1/payment_intents/{id}/cancel

Only a payment intent in created or requires_payment can be canceled.

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
id requiredpathstringPattern ^pi_[0-9A-Za-z]+$.
Idempotency-Key requiredheaderstringAt most 255 characters.
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.

Responses

200

The canceled payment intent.

application/json

PaymentIntent

FieldTypeDescription
id requiredstring
object requiredpayment_intent
mode requiredstringOne of live, test.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
merchant_order_id requiredstring
status requiredstringOne of created, requires_payment, processing, succeeded, channel_settled, failed, expired, canceled.
payment_method optionalstring
fee optionalMoney
Fields of fee
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
fx optionalFxLock
Fields of fx
FieldTypeDescription
locked requiredboolean
lock_point optionalstringOne of on_create, on_paid, on_channel_settled.
rate optionalstringA decimal string. A rate is never a float on the wire.
quote_currency optionalstringPattern ^[A-Z]{3}$.
locked_at optionalstring (date-time)
net optionalMoneyWhat the merchant receives, in the settlement currency.
Fields of net
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
available_at optionalstring (date-time)
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
checkout_url optionalstring (uri)The hosted checkout page. It is returned by the call that creates the intent and by no other, because the store keeps only a digest of the session token.
created requiredstring (date-time)
expires_at optionalstring (date-time)
metadata optionalobjectA map of string keys to string values.

Errors

Every error answers with the error object.

StatusWhen
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl -X POST https://api.lemak.cash/v1/payment_intents/pi_123/cancel \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: <Idempotency-Key>" \
  -H "Api-Version: 2026-09-01"

Create payment attempt

POST /v1/payment_intents/{id}/attempts

Start one payment attempt against a channel and return the payment credential. The PaymentAttempt object is not in this spec yet. PRODUCT.md §12.2 names the route and defines no response object. M3 adds the object.

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
id requiredpathstringPattern ^pi_[0-9A-Za-z]+$.
Idempotency-Key requiredheaderstringAt most 255 characters.
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.

Request body

application/json

object

FieldTypeDescription
payment_method requiredstring
channel optionalstring

Responses

201

The attempt and its payment credential. An intent that already holds a pending attempt answers with that one, so a second call places no second order with the channel.

application/json

PaymentAttempt

One try at a channel. An intent holds at most one PENDING attempt, and a failed one stays: the history of what was tried is what a dispute and a reconciliation are read against. The channel's own response body is NOT here — it is operator data, and a merchant reads the outcome rather than the wire.

FieldTypeDescription
id requiredstringPattern ^pa_[A-Z2-7]+$.
object requiredpayment_attempt
status requiredstringOne of pending, succeeded, failed.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
payment_method optionalstring
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
failure_code optionalstring
failure_message optionalstring
succeeded_at optionalstring (date-time)
created requiredstring (date-time)

Errors

Every error answers with the error object.

StatusWhen
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl -X POST https://api.lemak.cash/v1/payment_intents/pi_123/attempts \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: <Idempotency-Key>" \
  -H "Api-Version: 2026-09-01" \
  -H "Content-Type: application/json" \
  -d '{
  "payment_method": "<payment_method>"
}'

List payment attempts

GET /v1/payment_intents/{id}/attempts

Every attempt on one payment intent, oldest first, which is the order they were tried in. A failed attempt stays: it is what a dispute is read against.

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
id requiredpathstringPattern ^pi_[0-9A-Za-z]+$.
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.

Responses

200

Every attempt on the intent, oldest first.

application/json

PaymentAttemptList

FieldTypeDescription
object requiredlist
has_more requiredboolean
data requiredarray of PaymentAttempt
Fields of data
FieldTypeDescription
id requiredstringPattern ^pa_[A-Z2-7]+$.
object requiredpayment_attempt
status requiredstringOne of pending, succeeded, failed.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
payment_method optionalstring
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
failure_code optionalstring
failure_message optionalstring
succeeded_at optionalstring (date-time)
created requiredstring (date-time)

Errors

Every error answers with the error object.

StatusWhen
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl https://api.lemak.cash/v1/payment_intents/pi_123/attempts \
  -H "Authorization: Bearer sk_test_..." \
  -H "Api-Version: 2026-09-01"

Simulate payment intent

POST /v1/test/payment_intents/{id}/simulate

Test mode only. Tell the channel that serves this payment intent what to report, then deliver the callback it answers with on the same path a real delivery takes, signature check included. A live key, or a channel that cannot be told what to report, is refused. The Idempotency-Key is claimed like every other POST: a retry answers the stored result, and the same key on another intent is 422.

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
id requiredpathstringPattern ^pi_[0-9A-Za-z]+$.
Idempotency-Key requiredheaderstringAt most 255 characters.
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.

Request body

application/json

PaymentIntentSimulate

FieldTypeDescription
outcome requiredstringA payment outcome, or a dispute the channel reports on a paid intent. A dispute claims the whole ordered amount, and won or lost rules on the dispute opened before. A payment outcome replaces the outcome a magic amount set. One of succeeded, failed, pending, dispute_opened, dispute_won, dispute_lost.
failure_code optionalstringThe decline reason a failed outcome reports. It becomes the attempt failure_code. Allowed with outcome failed alone. One of insufficient_funds, payer_cancelled, risk_blocked.
amount optionalinteger (int64)Minor units the callback reports for a payment outcome. It defaults to the ordered amount. A different value is how a caller exercises the confirming query, which is what decides a success; the callback amount alone never does.
currency optionalstringPattern ^[A-Z]{3}$.

Responses

200

The payment intent, as it stands the moment the callback landed.

application/json

PaymentIntent

FieldTypeDescription
id requiredstring
object requiredpayment_intent
mode requiredstringOne of live, test.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
merchant_order_id requiredstring
status requiredstringOne of created, requires_payment, processing, succeeded, channel_settled, failed, expired, canceled.
payment_method optionalstring
fee optionalMoney
Fields of fee
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
fx optionalFxLock
Fields of fx
FieldTypeDescription
locked requiredboolean
lock_point optionalstringOne of on_create, on_paid, on_channel_settled.
rate optionalstringA decimal string. A rate is never a float on the wire.
quote_currency optionalstringPattern ^[A-Z]{3}$.
locked_at optionalstring (date-time)
net optionalMoneyWhat the merchant receives, in the settlement currency.
Fields of net
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
available_at optionalstring (date-time)
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
checkout_url optionalstring (uri)The hosted checkout page. It is returned by the call that creates the intent and by no other, because the store keeps only a digest of the session token.
created requiredstring (date-time)
expires_at optionalstring (date-time)
metadata optionalobjectA map of string keys to string values.

Errors

Every error answers with the error object.

StatusWhen
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl -X POST https://api.lemak.cash/v1/test/payment_intents/pi_123/simulate \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: <Idempotency-Key>" \
  -H "Api-Version: 2026-09-01" \
  -H "Content-Type: application/json" \
  -d '{
  "outcome": "succeeded"
}'

Advance payment intent

POST /v1/test/payment_intents/{id}/advance

Test mode only. Move one timer of this payment intent to now: expiry moves expires_at, release moves available_at. Nothing else changes; the scheduled job that reads the timer acts on its next tick, on the same path it takes in live mode. A timer is never moved later, so a second call changes nothing. A live key is refused with test_mode_required, and a timer that is not running, such as release before channel_settled, is 409 invalid_state_transition.

Authentication

Bearer key. The merchant API key, sk_live_ or sk_test_. It reaches /v1 alone. A test key works from the moment the merchant exists. A live key answers 403 live_not_enabled until the merchant's review opens live mode, before any rate limit is spent.

Parameters

NameInTypeDescription
id requiredpathstringPattern ^pi_[0-9A-Za-z]+$.
Idempotency-Key requiredheaderstringAt most 255 characters.
Api-Version optionalheaderstringThe version this request is answered at. Absent, the account's pinned version applies, and an account is pinned to info.version on its first request. A version this service does not render is refused with 400 invalid_api_version. api/CHANGELOG.md lists every version. Pattern ^[0-9]{4}-[0-9]{2}-[0-9]{2}$.

Request body

application/json

PaymentIntentAdvance

FieldTypeDescription
clock requiredstringexpiry moves expires_at; release moves available_at. One of expiry, release.

Responses

200

The payment intent, with the timer moved.

application/json

PaymentIntent

FieldTypeDescription
id requiredstring
object requiredpayment_intent
mode requiredstringOne of live, test.
amount requiredinteger (int64)
currency requiredstringPattern ^[A-Z]{3}$.
merchant_order_id requiredstring
status requiredstringOne of created, requires_payment, processing, succeeded, channel_settled, failed, expired, canceled.
payment_method optionalstring
fee optionalMoney
Fields of fee
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
fx optionalFxLock
Fields of fx
FieldTypeDescription
locked requiredboolean
lock_point optionalstringOne of on_create, on_paid, on_channel_settled.
rate optionalstringA decimal string. A rate is never a float on the wire.
quote_currency optionalstringPattern ^[A-Z]{3}$.
locked_at optionalstring (date-time)
net optionalMoneyWhat the merchant receives, in the settlement currency.
Fields of net
FieldTypeDescription
amount requiredinteger (int64)Minor units. Never a decimal.
currency requiredstringPattern ^[A-Z]{3}$.
available_at optionalstring (date-time)
next_action optionalNextAction
Fields of next_action
FieldTypeDescription
type requiredstringOne of redirect, qr_code.
url optionalstring (uri)
qr_data optionalstring
checkout_url optionalstring (uri)The hosted checkout page. It is returned by the call that creates the intent and by no other, because the store keeps only a digest of the session token.
created requiredstring (date-time)
expires_at optionalstring (date-time)
metadata optionalobjectA map of string keys to string values.

Errors

Every error answers with the error object.

StatusWhen
Other400 bad parameter, 401 authentication, 402 payment failed, 403 forbidden, 404 not found, 409 conflict, 413 request_too_large (a body over 64 KiB), 422 idempotency key reused, 429 rate limited, 5xx api error.

Example

curl -X POST https://api.lemak.cash/v1/test/payment_intents/pi_123/advance \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: <Idempotency-Key>" \
  -H "Api-Version: 2026-09-01" \
  -H "Content-Type: application/json" \
  -d '{
  "clock": "expiry"
}'