Validate a mempool payload
Use this endpoint before submitting an encoded payload to the mempool. It checks whether the router would accept the payload for indexing; it does not prove a later on-chain transaction will succeed. data.issues is empty when the payload passes. When issues are returned, each rule appears once for the whole payload, not once per offer.
Issue names you may see:
Payload format
payload_version: payload uses an unsupported version.payload_frame: payload is not valid hex or is missing required framing bytes.payload_gzip_length: declared compressed length does not match the payload bytes.payload_suffix_too_large: trailing attribution or suffix bytes exceed the allowed size.payload_decompression: compressed bytes cannot be decompressed or exceed size limits.payload_abi_decode: decompressed bytes are not a valid offer list.empty_payload: payload contains no offers.max_offers_per_tree: payload contains more offers than the chain allows.duplicate_offer_hash: the same offer appears more than once.
Chain and market support
unsupported_chain:chain_idis not supported.zero_morpho_offer_config: an offer embeds the zero Morpho V2 deployment address.maturity: market maturity is outside the allowed maturity windows.market_triplet: loan token, collateral token, and oracle combination is not supported.collateral_lltv: collateral loan-to-value tier is not enabled.max_lif: liquidation incentive setting is not enabled.max_collaterals: an offer uses too many collateral entries.
Offer terms
amount_missing: neithermax_unitsnormax_assetsis set.amount_conflict: bothmax_unitsandmax_assetsare set; choose one.min_offer_assets_usd: the loan token has no configured minimum, or offer size is below the chain's minimum value floor.min_tick: price tick is below the allowed range.max_tick: price tick is above the allowed range.tick_spacing: price tick is not on the allowed tick grid.min_duration: offer start/expiry window is too short.ratifier: ratifier contract is not accepted for the chain.
Batch consistency
mixed_maker: offers in one payload use different makers.mixed_ratifier: offers in one payload use different ratifiers.group_identity: group id does not match the offers in that group.group_consistency: offers sharing a group have conflicting terms or overlapping active windows.
Callbacks
non_empty_callback: callbacks with custom address or data are not accepted.
Query Parameters
Optional ISO-8601 UTC timestamp. Uses the policy snapshot active at the latest 15:00 UTC boundary at or before this timestamp; omitted uses the current time.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
curl -X POST "https://api.morpho.org/v0/midnight/mempool/validate?timestamp=2026-06-01T16%3A00%3A00Z" \ -H "Content-Type: application/json" \ -d '{ "chain_id": 1, "payload": "0x01000000..." }'{
"data": {
"issues": [
{
"rule": "amount_conflict"
},
{
"rule": "tick_spacing"
}
]
}
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "limit",
"issue": "Limit must be greater than 0."
}
],
"message": "Limit must be greater than 0.",
"request_id": "req-123"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "limit",
"issue": "Limit must be greater than 0."
}
],
"message": "Limit must be greater than 0.",
"request_id": "req-123"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"details": [
{
"field": "limit",
"issue": "Limit must be greater than 0."
}
],
"message": "Limit must be greater than 0.",
"request_id": "req-123"
}
}