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

# POST /verify/v0/stamp

> Verify a single location stamp's internal validity

<Warning>
  **Research Preview** — This API is under development.
</Warning>

# Verify stamp

Verify a single location stamp's internal validity — checks cryptographic signatures, structure, and signal consistency. This endpoint does not assess how well the stamp supports a claim; use [verify proof](/api-reference/verify/proof) for that.

```
POST /verify/v0/stamp
```

## Request body

<ParamField body="stamp" type="LocationStamp" required>
  The location stamp to verify. See [LocationStamp](/api-reference/types#locationstamp) for the full type definition.

  Key fields: `lpVersion`, `locationType`, `location`, `srs`, `temporalFootprint`, `plugin`, `pluginVersion`, `signals`, `signatures`.
</ParamField>

## Example request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://staging-api.astral.global/verify/v0/stamp \
    -H "Content-Type: application/json" \
    -H "X-API-Key: your-api-key" \
    -d '{
      "stamp": {
        "lpVersion": "0.2",
        "locationType": "geojson-point",
        "location": { "type": "Point", "coordinates": [-122.4194, 37.7749] },
        "srs": "http://www.opengis.net/def/crs/OGC/1.3/CRS84",
        "temporalFootprint": {
          "start": 1706901000,
          "end": 1706901060
        },
        "plugin": "proofmode",
        "pluginVersion": "0.1.0",
        "signals": { "sensorData": "..." },
        "signatures": [{
          "signer": { "scheme": "device-pubkey", "value": "0xabcd..." },
          "algorithm": "secp256k1",
          "value": "0x...",
          "timestamp": 1706901030
        }]
      }
    }'
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch('https://staging-api.astral.global/verify/v0/stamp', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'your-api-key'
    },
    body: JSON.stringify({
      stamp: {
        lpVersion: '0.2',
        locationType: 'geojson-point',
        location: { type: 'Point', coordinates: [-122.4194, 37.7749] },
        srs: 'http://www.opengis.net/def/crs/OGC/1.3/CRS84',
        temporalFootprint: { start: 1706901000, end: 1706901060 },
        plugin: 'proofmode',
        pluginVersion: '0.1.0',
        signals: { sensorData: '...' },
        signatures: [{
          signer: { scheme: 'device-pubkey', value: '0xabcd...' },
          algorithm: 'secp256k1',
          value: '0x...',
          timestamp: 1706901030
        }]
      }
    })
  });

  const result = await response.json();
  ```
</CodeGroup>

## Response

<ResponseField name="valid" type="boolean" required>
  Overall validity — `true` only if all checks pass.
</ResponseField>

<ResponseField name="signaturesValid" type="boolean" required>
  Whether all cryptographic signatures verified successfully.
</ResponseField>

<ResponseField name="structureValid" type="boolean" required>
  Whether the stamp conforms to the expected structure for its plugin.
</ResponseField>

<ResponseField name="signalsConsistent" type="boolean" required>
  Whether internal signals are self-consistent.
</ResponseField>

<ResponseField name="details" type="object" required>
  Plugin-specific verification details. Contents vary by plugin.
</ResponseField>

## Example response

<Note>
  Example only. `details` contents are plugin-specific, and some fields shown here (for example `certificateChainValid`) correspond to checks that are **planned but not yet performed in v0**. See the [ProofMode plugin](/plugins/proofmode) for exactly what stamp verification does today.
</Note>

```json theme={null}
{
  "valid": true,
  "signaturesValid": true,
  "structureValid": true,
  "signalsConsistent": true,
  "details": {
    "plugin": "proofmode",
    "hashVerified": true,
    "certificateChainValid": true
  }
}
```

## Errors

Errors follow [RFC 7807](https://tools.ietf.org/html/rfc7807):

```json theme={null}
{
  "type": "https://astral.global/errors/invalid-input",
  "title": "Invalid Input",
  "status": 400,
  "detail": "stamp.signatures is required"
}
```

| Type              | Status | Description                                |
| ----------------- | ------ | ------------------------------------------ |
| `invalid-input`   | 400    | Malformed stamp or missing required fields |
| `not-implemented` | 501    | Plugin not supported                       |
| `internal`        | 500    | Internal verification error                |
| `rate-limited`    | 429    | Too many requests                          |
| `unauthorized`    | 401    | Invalid or missing API key                 |

<Card title="SDK: Location proofs" icon="code" href="/sdk/location-proofs">
  See the SDK documentation for client-side usage
</Card>
