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. details is normally null; for min_offer_assets_usd, the first below-minimum offer includes its loan token and configured raw-asset floor.
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.market_chain_mismatch: an offer embeds a chain id or Morpho V2 deployment address that does not match the requested chain.maturity: market maturity is outside the allowed maturity windows.loan_token: loan token is not supported on this chain or has no configured minimum.collateral_token: collateral token is not supported on this chain.oracle: oracle is not supported on this chain.market_triplet: loan token, collateral token, and oracle combination is not supported.rcf_threshold: market RCF threshold does not match its loan token and highest collateral LLTV.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: offer size is below the configured loan-token minimum;detailsprovides the raw-asset 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.blue_callback: a non-empty callback is not the maker's derived BlueBuyCallback carrying canonical Blue market params on a buy offer.buy_empty_callback: buy offers with empty callbacks are not accepted.sell_empty_callback: sell offers with empty callbacks are not accepted.
For enterprise access, use https://private.api.morpho.org as the base URL and send your API key in the x-api-key header. Request an API key.
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": "min_offer_assets_usd",
"details": {
"loan_token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"min_assets": "100014791"
}
},
{
"rule": "tick_spacing",
"details": null
}
]
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Limit must be greater than 0.",
"details": [
{
"field": "limit",
"issue": "Limit must be greater than 0."
}
],
"request_id": "req-123"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Limit must be greater than 0.",
"details": [
{
"field": "limit",
"issue": "Limit must be greater than 0."
}
],
"request_id": "req-123"
}
}{
"error": {
"code": "VALIDATION_ERROR",
"message": "Limit must be greater than 0.",
"details": [
{
"field": "limit",
"issue": "Limit must be greater than 0."
}
],
"request_id": "req-123"
}
}