Authorize
The path above is illustrative. You host this endpoint; Moov Money POSTs to the URL you register for this operation. See Setup.
Authorize a payout and place a hold on the sender’s funding source.
The request body is a RequestEnvelope; the inner JWE payload conforms to
AuthorizeRequestJWTPayload. The response body is a ResponseEnvelope;
the inner JWE payload conforms to AuthorizeResponseJWTPayload.
Outcomes (200 OK):
approved: hold placed.denied: you declined (insufficient funds, fraud, step-up required, etc.). No hold placed.
For processing failures (ledger unavailable, transient errors), return
a retryable HTTP status: 408, 429, or a 5xx. Do not return 200
with an unmodeled outcome value; Moov Money will treat that as an
internal unknown result and discard the FI-supplied reason.
Idempotency: you must return the same outcome (and same
holdReference if approved) for repeated requests with the same
idempotencyKey. The scope of an authorize idempotencyKey is
Moov Money’s payout, so the same key will not be reused for a
different payout.
Retries: Moov Money will retry on 408, 429, 5xx, and transport
errors. Return other 4xx for terminal validation failures (bad JWE,
unknown provider, malformed claims).
curl -X POST https://fi.example.com/ledger/authorize \
-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 authorize.exp
integer<int64>
requiredmoov
object
requiredMoov claims
moov
payoutID
string
requiredproviderID
string
requiredexternalID
string
requiredfundingSource
string
requiredamount
object
requiredShow child attributes
moov.amount
currency
object
requiredShow child attributes
moov.amount.currency
decimalPlaces
integer<uint8>
requiredcode. Required.numericCode
stringname
stringcode
string
requiredvalue
string
requiredfraudScore
number<float>
required0.0 to 1.0. Higher means riskier.
You can factor this into your decision (e.g. require step-up
auth above a threshold).callerSubject
stringrequestID
stringidempotencyKey
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>
requiredauthorize on this operation.authorizeiat
integer<int64>
requiredResponse claims
POST authorize.exp
integer<int64>
requiredmoov
object
requiredMoov claims
moov
reason
stringdenied/failed; optional for approved.outcome
string<enum>
requiredHigh-level decision.
approved: you have placed a hold.holdReferenceis required.denied: you have refused this authorization (insufficient funds, fraud rules, step-up required, etc.). No hold placed.
If you cannot process the request (e.g. downstream ledger
unavailable), it should return a retryable HTTP status (408, 429,
5xx) rather than a 200 with a non-approved outcome. Moov Money
treats any authorize outcome other than approved or denied as an
internal unknown result and does not propagate FI-supplied reasons
for it. Do not use a 200 with an unmodeled outcome to communicate
processing failure.
approved,
deniedholdReference
stringoutcome=approved; must be supplied by Moov on later release and
capture calls for the same payout. Omit when outcome=denied.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