Release
The path above is illustrative. You host this endpoint; Moov Money POSTs to the URL you register for this operation. See Setup.
Release a previously-placed hold, returning the held funds to the sender.
The request body is a RequestEnvelope; the inner JWE payload conforms to
ReleaseRequestJWTPayload. The response body is a ResponseEnvelope;
the inner JWE payload conforms to ReleaseResponseJWTPayload.
Outcomes (200 OK; release has no denied outcome):
approved: hold released.failed: you could not release the hold.
Idempotency: you must return the same outcome (and same
releaseReference if approved) for repeated requests with the same
idempotencyKey. Releasing an already-released hold must return
approved; reuse the original releaseReference if you can look
it up.
Retries: Moov Money will retry on 408, 429, 5xx, and transport
errors. Return other 4xx for terminal validation failures.
curl -X POST https://fi.example.com/ledger/release \
-H "Content-Type: application/json" \
-d '{
"request": "eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIiwidHlwIjoiSldUIiwiY3R5IjoiSldUIn0.…"
}'{
"response": "eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIiwidHlwIjoiSldUIiwiY3R5IjoiSldUIn0.…"
}Request
request field. All business fields (amounts, references, idempotency
key) travel inside the JWE claims, not in the outer JSON.request
string
requiredRequest claims
POST release.exp
integer<int64>
requiredmoov
object
requiredMoov claims
moov
payoutID
string
requiredproviderID
string
requiredholdReference
string
requiredauthorize.reason
stringcancelled (user-initiated) or expired (hold TTL
exceeded). Lets you distinguish these in your ledger.idempotencyKey
string
requiredidempotencyKey you saw
on authorize as already processed if it turns up on release or
capture, and vice versa.
Moov Money currently derives per-payout keys that may collide across
the three endpoints; treating them as endpoint-scoped is required for
correctness.typ
string<enum>
requiredrelease on this operation.releaseiat
integer<int64>
requiredResponse claims
POST release.exp
integer<int64>
requiredmoov
object
requiredMoov claims
moov
reason
stringdenied/failed; optional for approved.outcome
string<enum>
requiredHigh-level decision. Release has no denied outcome: either you
released the hold (approved) or you did not (failed).
approved: the hold is released.releaseReferenceis required.failed: you could not release the hold.
approved,
failedreleaseReference
stringoutcome=approved; omit when outcome=failed.idempotencyKey
string
requirediat
integer<int64>
requiredResponse
response field. All business fields (outcome, references, echoed
idempotency key) travel inside the JWE claims, not in the outer JSON.response
string
required