Verification

Every cell on a Gridz profile can be independently verified. You don't have to trust gridz.bio — verification runs in your browser (or your own script) against Base EAS and the GridzResolver.

On the website

Every profile page has a Verify profile button in the toolbar (formerly "Query & verify"). It opens a live scanner that checks each field against on-chain EAS attestations and shows a green check when verified.

The website loads verification from GET /api/verify/… (browsers cannot call Base RPC directly due to CORS). When all on-chain cells pass verification, the profile header shows a single ✓ Verified badge. Use the toolbar Verify profile button for a per-field breakdown.

If you see a Draft badge, verification uses the published on-chain profile, not local browser edits.

Verify API (one request)

Fetch the grid plus a full verification report — same checks as the website modal:

GET https://gridz.bio/api/verify/demo.gridz.eth

{
  "ok": true,
  "subject": "demo.gridz.eth",
  "grid": { ... },
  "report": {
    "ok": true,
    "cells": [{ "key": "alias", "result": { "status": "verified", "proof": "eas-onchain" } }],
    "root": { "status": "verified", "proof": "manifest" }
  }
}

Offline verification (TypeScript)

For eas-onchain cells loaded from the API, pass an EAS RPC context so verifyGrid can fetch attestations from Base:

import { verifyGrid } from "@gridz/core";
import { createPublicClient, http } from "viem";
import { base } from "viem/chains";

const { grid } = await fetch("https://gridz.bio/api/profile/kevin.gridz.eth").then((r) => r.json());
const client = createPublicClient({ chain: base, transport: http("https://base.publicnode.com") });

const report = await verifyGrid(grid, {
  allowDelegated: true,
  eas: {
    chainId: 8453,
    easAddress: "0x4200000000000000000000000000000000000021",
    cellSchemaUid: "0x394d8e67b1470cbdb7fa6c7d15d15d295ca81d822b55267939751a8a686abb87",
    resolverAddress: "0x73c5e3944B780D4927c403d351A4F94875DC57B3",
    subjectEns: "kevin.gridz.eth",
    readContract: (args) => client.readContract(args),
  },
});

Offline verification (Python)

from gridz import verify_grid
import httpx

grid = httpx.get("https://gridz.bio/api/profile/kevin.gridz.eth").json()["grid"]
report = verify_grid(grid)

CLI

gridz grid verify grid.json

What verification proves

  • Each cell value matches its on-chain EAS attestation (schema, attester, not revoked).
  • The GridzResolver points at the same EAS UID and serves the same value via text().
  • Inline EIP-712 payloads (drafts / exports) additionally recover the signer locally.

Verification does not prove a human is "really" who they claim — it proves the cryptographic identity behind the ENS name signed the content.