curl -i "https://test402.com/api/x402?offerReceipt=jws&quirk=expired-offer"
Returns 402 whose signed offer has a validUntil in 2020. Spec §4.6: a client should check expiration before paying, and the server may reject a payment against an expired offer.
The signature is minted per request and shown here as a placeholder, and the offer’s validUntil is always 300s past the moment you ask. Run the curl to see the real artifact.
Response it will return (HTTP 402)PAYMENT-REQUIRED: eyJ4NDAyVmVyc2lvbiI6MiwiZXJyb3IiOiJQQVlNRU5ULVNJR05BVFVSRSBoZWFkZXIgaXMgcmVxdWlyZWQiLCJyZXNvdXJjZSI6eyJ1cmwiOiJodHRwczovL3Rlc3Q0MDIuY29tL2FwaS94NDAyP29mZmVyUmVjZWlwdD1qd3MmcXVpcms9ZXhwaXJlZC1vZmZlciIsImRlc2NyaXB0aW9uIjoidGVzdDQwMiBjaGFsbGVuZ2UiLCJtaW1lVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSwiYWNjZXB0cyI6W3sic2NoZW1lIjoiZXhhY3QiLCJuZXR3b3JrIjoiZWlwMTU1Ojg0NTMyIiwiYW1vdW50IjoiMTAwIiwiYXNzZXQiOiIweDAzNkNiRDUzODQyYzU0MjY2MzRlNzkyOTU0MWVDMjMxOGYzZENGN2UiLCJwYXlUbyI6IjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMiIsIm1heFRpbWVvdXRTZWNvbmRzIjozMDAsImV4dHJhIjp7Im5hbWUiOiJVU0RDIiwidmVyc2lvbiI6IjIiLCJhc3NldFRyYW5zZmVyTWV0aG9kIjoiZWlwMzAwOSJ9fV0sImV4dGVuc2lvbnMiOnsiaHR0cHM6Ly90ZXN0NDAyLmNvbS9leHRlbnNpb25zL2ZhY2lsaXRhdG9yIjp7ImlkIjoieDQwMm9yZyIsInVybCI6Imh0dHBzOi8veDQwMi5vcmcvZmFjaWxpdGF0b3IifSwib2ZmZXItcmVjZWlwdCI6eyJpbmZvIjp7Im9mZmVycyI6W3siZm9ybWF0IjoiandzIiwiYWNjZXB0SW5kZXgiOjAsInNpZ25hdHVyZSI6IjxzaWduZWQgcGVyIHJlcXVlc3QgLS0gcnVuIHRoZSBjdXJsIHRvIHNlZSBpdD4ifV19LCJzY2hlbWEiOnsiJHNjaGVtYSI6Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIiwidHlwZSI6Im9iamVjdCIsInByb3BlcnRpZXMiOnsib2ZmZXJzIjp7InR5cGUiOiJhcnJheSIsIml0ZW1zIjp7InR5cGUiOiJvYmplY3QiLCJwcm9wZXJ0aWVzIjp7ImZvcm1hdCI6eyJ0eXBlIjoic3RyaW5nIiwiY29uc3QiOiJqd3MifSwiYWNjZXB0SW5kZXgiOnsidHlwZSI6ImludGVnZXIifSwic2lnbmF0dXJlIjp7InR5cGUiOiJzdHJpbmciLCJkZXNjcmlwdGlvbiI6IkpXUyBjb21wYWN0IHNlcmlhbGl6YXRpb24gY29udGFpbmluZyB0aGUgb2ZmZXIgcGF5bG9hZCJ9fSwicmVxdWlyZWQiOlsiZm9ybWF0Iiwic2lnbmF0dXJlIl19fX0sInJlcXVpcmVkIjpbIm9mZmVycyJdfX19fQ==
{
"x402Version": 2,
"error": "PAYMENT-SIGNATURE header is required",
"resource": {
"url": "https://test402.com/api/x402?offerReceipt=jws&quirk=expired-offer",
"description": "test402 challenge",
"mimeType": "application/json"
},
"accepts": [
{
"scheme": "exact",
"network": "eip155:84532",
"amount": "100",
"asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
"payTo": "0x0000000000000000000000000000000000000402",
"maxTimeoutSeconds": 300,
"extra": {
"name": "USDC",
"version": "2",
"assetTransferMethod": "eip3009"
}
}
],
"extensions": {
"https://test402.com/extensions/facilitator": {
"id": "x402org",
"url": "https://x402.org/facilitator"
},
"offer-receipt": {
"info": {
"offers": [
{
"format": "jws",
"acceptIndex": 0,
"signature": "<signed per request -- run the curl to see it>"
}
]
},
"schema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"offers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"format": {
"type": "string",
"const": "jws"
},
"acceptIndex": {
"type": "integer"
},
"signature": {
"type": "string",
"description": "JWS compact serialization containing the offer payload"
}
},
"required": [
"format",
"signature"
]
}
}
},
"required": [
"offers"
]
}
}
},
"note": "test402 scenario. quirk=expired-offer"
}