> ## Documentation Index
> Fetch the complete documentation index at: https://docs.4mica.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify a payment

> Validate an x402 payment payload without issuing a guarantee.

`POST /verify`

Use verification as a preflight before expensive work. It checks the decoded
payment envelope against the original payment requirements without contacting
4Mica Core.

## Request body

<ParamField path="x402Version" type="number" post={["1|2"]}>
  If omitted, the facilitator resolves the version from `paymentPayload`.
</ParamField>

<ParamField path="paymentPayload" type="object" required />

<ParamField path="paymentPayload.x402Version" type="number" required post={["1|2"]} />

<ParamField path="paymentPayload.scheme" type="string" />

<ParamField path="paymentPayload.network" type="string" />

<ParamField path="paymentPayload.payload.claims" type="object" required />

<ParamField path="paymentPayload.payload.claims.user_address" type="string" required />

<ParamField path="paymentPayload.payload.claims.recipient_address" type="string" required />

<ParamField path="paymentPayload.payload.claims.req_id" type="string" required />

<ParamField path="paymentPayload.payload.claims.amount" type="string" required />

<ParamField path="paymentPayload.payload.claims.asset_address" type="string" required />

<ParamField path="paymentPayload.payload.claims.timestamp" type="number" required />

<ParamField path="paymentPayload.payload.claims.version" type="number" required post={["1|2"]} />

<ParamField path="paymentPayload.payload.signature" type="string" required />

<ParamField path="paymentPayload.payload.scheme" type="string" required placeholder="eip712" />

<ParamField path="paymentRequirements" type="object" required />

<ParamField path="paymentRequirements.scheme" type="string" required />

<ParamField path="paymentRequirements.network" type="string" required />

<ParamField path="paymentRequirements.maxAmountRequired" type="string" />

<ParamField path="paymentRequirements.amount" type="string" />

<ParamField path="paymentRequirements.payTo" type="string" required />

<ParamField path="paymentRequirements.asset" type="string" required />

<ParamField path="paymentRequirements.extra" type="object" nullable />

## Responses

<ResponseField name="isValid" type="boolean" required />

<ResponseField name="invalidReason" type="string" nullable />

<ResponseField name="certificate" type="object" nullable>
  Verification does not issue a certificate.
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://x402.4mica.xyz/verify" \
    -H "Content-Type: application/json" \
    -d '{
      "x402Version": 1,
      "paymentPayload": {
        "x402Version": 1,
        "scheme": "4mica-credit",
        "network": "eip155:84532",
        "payload": {
          "claims": {
            "user_address": "0x1111111111111111111111111111111111111111",
            "recipient_address": "0x2222222222222222222222222222222222222222",
            "req_id": "0x1",
            "amount": "0x186a0",
            "asset_address": "0x3333333333333333333333333333333333333333",
            "timestamp": 1782122400,
            "version": 1
          },
          "signature": "0xSignedPayment",
          "scheme": "eip712"
        }
      },
      "paymentRequirements": {
        "scheme": "4mica-credit",
        "network": "eip155:84532",
        "maxAmountRequired": "100000",
        "payTo": "0x2222222222222222222222222222222222222222",
        "asset": "0x3333333333333333333333333333333333333333"
      }
    }'
  ```

  ```javascript title="Fetch" theme={null}
  const body = { x402Version: 1, paymentPayload, paymentRequirements };
  const response = await fetch("https://x402.4mica.xyz/verify", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });
  console.log(await response.json());
  ```

  ```javascript title="Axios" theme={null}
  import axios from "axios";
  const body = { x402Version: 1, paymentPayload, paymentRequirements };
  const { data } = await axios.post("https://x402.4mica.xyz/verify", body);
  console.log(data);
  ```

  ```python Python theme={null}
  import requests
  body = {
      "x402Version": 1,
      "paymentPayload": payment_payload,
      "paymentRequirements": payment_requirements,
  }
  print(requests.post("https://x402.4mica.xyz/verify", json=body).json())
  ```

  ```go Go theme={null}
  package main
  import ("bytes"; "encoding/json"; "fmt"; "io"; "net/http")
  func main() {
    body, _ := json.Marshal(map[string]any{
      "x402Version": 1,
      "paymentPayload": paymentPayload,
      "paymentRequirements": paymentRequirements,
    })
    response, _ := http.Post("https://x402.4mica.xyz/verify", "application/json", bytes.NewReader(body))
    defer response.Body.Close()
    result, _ := io.ReadAll(response.Body)
    fmt.Println(string(result))
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 Valid theme={null}
  { "isValid": true, "invalidReason": null, "certificate": null }
  ```

  ```json 200 Invalid theme={null}
  {
    "isValid": false,
    "invalidReason": "Payment amount does not match the advertised requirements",
    "certificate": null
  }
  ```

  ```json 400 Bad Request theme={null}
  { "error": "Invalid payment payload" }
  ```
</ResponseExample>

## Status codes

| Code  | Description                                        |
| ----- | -------------------------------------------------- |
| `200` | Verification completed. Check `isValid`.           |
| `400` | The request body or payment envelope is malformed. |
| `500` | The facilitator could not complete verification.   |

Call [`POST /settle`](/api-reference/facilitator/settle) when you are ready to
accept the guarantee.
