---
title: "Phase 2: submit a verification request"
method: POST
path: "/api/v1/verification"
tags: ["Verification"]
---

# Phase 2: submit a verification request

`POST /api/v1/verification`

## Request

- Base URL: `https://api.proofable.me`
- URL: `https://api.proofable.me/api/v1/verification`
- Auth: none required

For raw HTTP callers, this request must continue a prior POST /api/v1/verification/standardize call using the same body and signedTimestamp. Do not treat this as a one-step schema-only POST; sign the exact signerString from phase 1 and submit that signature here.

## Request body

- VerificationRequest: Phase 2 of the raw HTTP verification handshake. For raw HTTP callers, first call POST /api/v1/verification/standardize with this same body (minus signature), sign the returned signerString, then submit this body with signature. Treat this as a continuation of the standardized request, not as an independent one-step POST.
  - `verifierIds` string[], required
  - `data` union, required
    - union
      - union: Ownership proofs require owner plus at least one durable anchor: content, contentHash, or reference.id. Use reference and provenance to keep proofs linkable and explain origin without storing unnecessary raw content.
        - object
          - `content` string, required: Exact text/content being claimed (max 50KB inline). Use when you want Proofable to derive the ownership anchor from the submitted content.
          - `contentHash` string: Pre-computed ownership-basic verifier hash (32-byte hex). If content is also provided, the verifier integrity-checks that they match.
          - `contentType` string: MIME type hint
          - `owner` string, required: Owner identifier (must match request walletAddress). Supports EVM (0x..), Solana (base58), NEAR (account IDs), and other universal address formats depending on chain context.
          - `reference` object: Stable pointer to the thing being proven. Use this for files, URLs, releases, repository paths, transactions, prior proofs, or external records.
            - `type` 'ipfs' | 'ipfs-hash' | 'url' | 'license-nft' | 'contract' | 'qhash' | 'ethereum-tx' | 'on-chain-tx' | 'tx' | 'file' | 'doc' | 'media' | 'username-claim' | 'job' | 'job-status' | 'other', required: Reference type
            - `id` string, required: Stable reference identifier such as a URL, CID, transaction hash, repository path, file key, or prior proof qHash.
            - `title` string: Human-readable title for proof pages, inventory, and agent/tool summaries.
            - `description` string: Short explanation of what the reference points to.
            - `mime` string: MIME type when the reference points to a file or media artifact.
            - `name` string: File, artifact, or object name when available.
            - `size` integer: Referenced object size in bytes when available.
          - `provenance` object: Origin metadata for the claim. Use declaredKind and aiContext to make AI-assisted or agent-created work understandable without changing proof identity.
            - `declaredKind` 'human' | 'ai' | 'mixed' | 'unknown': Declared origin of the claimed content.
            - `aiContext` object: AI or agent generation context when declaredKind is ai or mixed.
              - …
        - object
          - `content` string: Exact text/content being claimed (max 50KB inline). Use when you want Proofable to derive the ownership anchor from the submitted content.
          - `contentHash` string, required: Pre-computed ownership-basic verifier hash (32-byte hex). If content is also provided, the verifier integrity-checks that they match.
          - `contentType` string: MIME type hint
          - `owner` string, required: Owner identifier (must match request walletAddress). Supports EVM (0x..), Solana (base58), NEAR (account IDs), and other universal address formats depending on chain context.
          - `reference` object: Stable pointer to the thing being proven. Use this for files, URLs, releases, repository paths, transactions, prior proofs, or external records.
            - `type` 'ipfs' | 'ipfs-hash' | 'url' | 'license-nft' | 'contract' | 'qhash' | 'ethereum-tx' | 'on-chain-tx' | 'tx' | 'file' | 'doc' | 'media' | 'username-claim' | 'job' | 'job-status' | 'other', required: Reference type
            - `id` string, required: Stable reference identifier such as a URL, CID, transaction hash, repository path, file key, or prior proof qHash.
            - `title` string: Human-readable title for proof pages, inventory, and agent/tool summaries.
            - `description` string: Short explanation of what the reference points to.
            - `mime` string: MIME type when the reference points to a file or media artifact.
            - `name` string: File, artifact, or object name when available.
            - `size` integer: Referenced object size in bytes when available.
          - `provenance` object: Origin metadata for the claim. Use declaredKind and aiContext to make AI-assisted or agent-created work understandable without changing proof identity.
            - `declaredKind` 'human' | 'ai' | 'mixed' | 'unknown': Declared origin of the claimed content.
            - `aiContext` object: AI or agent generation context when declaredKind is ai or mixed.
              - …
        - object
          - `content` string: Exact text/content being claimed (max 50KB inline). Use when you want Proofable to derive the ownership anchor from the submitted content.
          - `contentHash` string: Pre-computed ownership-basic verifier hash (32-byte hex). If content is also provided, the verifier integrity-checks that they match.
          - `contentType` string: MIME type hint
          - `owner` string, required: Owner identifier (must match request walletAddress). Supports EVM (0x..), Solana (base58), NEAR (account IDs), and other universal address formats depending on chain context.
          - `reference` object, required: Stable pointer to the thing being proven. Use this for files, URLs, releases, repository paths, transactions, prior proofs, or external records.
            - `type` 'ipfs' | 'ipfs-hash' | 'url' | 'license-nft' | 'contract' | 'qhash' | 'ethereum-tx' | 'on-chain-tx' | 'tx' | 'file' | 'doc' | 'media' | 'username-claim' | 'job' | 'job-status' | 'other', required: Reference type
            - `id` string, required: Stable reference identifier such as a URL, CID, transaction hash, repository path, file key, or prior proof qHash.
            - `title` string: Human-readable title for proof pages, inventory, and agent/tool summaries.
            - `description` string: Short explanation of what the reference points to.
            - `mime` string: MIME type when the reference points to a file or media artifact.
            - `name` string: File, artifact, or object name when available.
            - `size` integer: Referenced object size in bytes when available.
          - `provenance` object: Origin metadata for the claim. Use declaredKind and aiContext to make AI-assisted or agent-created work understandable without changing proof identity.
            - `declaredKind` 'human' | 'ai' | 'mixed' | 'unknown': Declared origin of the claimed content.
            - `aiContext` object: AI or agent generation context when declaredKind is ai or mixed.
              - …
      - VerifierDataOwnershipSocial
        - `provider` 'discord' | 'github' | 'facebook' | 'x' | 'linkedin' | 'telegram' | 'coinbase', required: OAuth provider to verify against.
        - `internalSocialToken` string, required: Opaque token from the hosted link session after the user authorizes; not your app API key.
        - `walletAddress` string: Wallet bound to the social account when applicable.
      - VerifierDataOwnershipPseudonym
        - `pseudonymId` string, required: Stable handle for this identity within `namespace` (lowercase alphanumeric, dots, hyphens, underscores; 3–32 chars).
        - `namespace` string: Logical partition so the same `pseudonymId` can exist in different apps or communities. Omit to write `proofable`. Legacy `neus` writes remap to `proofable`; existing `neus:<handle>` proofs still resolve.
        - `displayName` string: Optional display label for UX; omit or minimize PII if you do not need it.
        - `metadata` object: Optional app-defined structured fields (keep small; avoid secrets).
      - VerifierDataOwnershipDnsTxt
        - `domain` string, hostname, required: Hostname to verify (TXT lookup at _proofable.<domain> or _neus.<domain>).
        - `walletAddress` string: Optional in data when options.walletAddress supplies the signer; filled in if omitted. If present, it must match the signing wallet and any allowed delegation rules. The TXT record must use wallet= with the same address Proofable checks.
      - VerifierDataOwnershipOrgOauth
        - `provider` 'google' | 'microsoft' | 'email', required: How the work email is confirmed: Google Workspace or Microsoft sign-in, or email (a one-time code sent to the work address).
        - `internalSocialToken` string, required: Opaque token from the hosted org sign-in or work-email code session; not your app API key.
        - `walletAddress` string: Wallet to associate with the verified org identity.
        - `expectedOrgDomain` string, hostname: Optional DNS hostname for the organization (e.g. company.com) to match against the IdP directory.
      - VerifierDataContractOwnership
        - `contractAddress` string, required
        - `chainId` integer, required
        - `walletAddress` string
        - `method` 'owner' | 'admin' | 'accessControl'
      - VerifierDataProofOfHuman
        - `provider` 'zkpassport'
        - `proofs` unknown[], required
          - unknown
        - `queryResult` object, required
        - `scope` string
        - `neusPersonhoodId` string: Salted SHA-256 personhood ID for sybil resistance (not returned in API responses)
        - `assuranceLevel` 'low' | 'medium' | 'high': Verification confidence level derived from proof claims
        - `claims` object: Privacy-preserving boolean/numeric verification claims
        - `traits` object: Provider-specific verification metadata
        - `expiresAt` number: Unix timestamp (ms) when the proof expires
      - union
        - object
          - `ownerAddress` string
          - `contractAddress` string, required
          - `tokenId` string, required
          - `tokenType` 'erc721' | 'erc1155'
          - `chainId` integer, required
          - `chain` string: CAIP-2 for Solana (e.g. solana:mainnet)
          - `blockNumber` integer
        - object
          - `ownerAddress` string
          - `contractAddress` string, required
          - `tokenId` string, required
          - `tokenType` 'erc721' | 'erc1155'
          - `chainId` integer
          - `chain` string, required: CAIP-2 for Solana (e.g. solana:mainnet)
          - `blockNumber` integer
      - union
        - object
          - `ownerAddress` string
          - `contractAddress` string, required
          - `minBalance` string, required
          - `chainId` integer, required
          - `chain` string: CAIP-2 for Solana (e.g. solana:mainnet)
          - `blockNumber` integer
        - object
          - `ownerAddress` string
          - `contractAddress` string, required
          - `minBalance` string, required
          - `chainId` integer
          - `chain` string, required: CAIP-2 for Solana (e.g. solana:mainnet)
          - `blockNumber` integer
      - VerifierDataWalletRisk
        - `provider` 'webacy'
        - `walletAddress` union, required
          - string
          - string
          - string, ton-address
          - string, sui-address
          - string, sei-address
          - string, bitcoin-address
          - string, stellar-address
        - `chain` 'eth' | 'base' | 'bsc' | 'pol' | 'opt' | 'arb' | 'sol' | 'ton' | 'sei' | 'sui' | 'btc' | 'stellar'
        - `chainId` integer
      - union
        - object
          - `primaryAccountId` string, caip10-account, required
          - `secondaryAccountId` string, caip10-account, required
          - `primaryChainRef` string
          - `secondaryChainRef` string
          - `primaryWalletAddress` string
          - `secondaryWalletAddress` string
          - `signature` string, required
          - `chain` string
          - `signatureMethod` string, required
          - `signedTimestamp` integer, required
          - `relationshipType` 'primary' | 'personal' | 'org' | 'affiliate' | 'agent' | 'linked'
          - `label` string
        - object
          - `primaryAccountId` string, caip10-account
          - `secondaryAccountId` string, caip10-account
          - `primaryChainRef` string
          - `secondaryChainRef` string
          - `primaryWalletAddress` string, required
          - `secondaryWalletAddress` string, required
          - `signature` string, required
          - `chain` string, required
          - `signatureMethod` string, required
          - `signedTimestamp` integer, required
          - `relationshipType` 'primary' | 'personal' | 'org' | 'affiliate' | 'agent' | 'linked'
          - `label` string
      - VerifierDataAiContentModeration
        - `content` string, required
        - `contentType` 'image/jpeg' | 'image/png' | 'image/webp' | 'image/gif' | 'text/plain' | 'text/markdown' | 'text/x-markdown' | 'application/json' | 'application/xml', required
        - `provider` 'google-vision' | 'google-perspective'
      - VerifierDataAgentIdentity: Register an agent identity signed by the agent wallet. Uses CAIP-2 chain references; proof output may include CAIP-10 account identifiers. Provide chain context as agentChainRef in data and/or as chain (CAIP-2) or chainId (EVM) on the verification request. Does not grant permissions; use agent-delegation for authority.
        - `agentId` string, required
        - `agentChainRef` string, required: CAIP-2 network reference for agentWallet (for example eip155:8453). Supply in data or on the verification request as chain (CAIP-2) or chainId (EVM).
        - `agentWallet` string, required
        - `agentAccountId` string, caip10-account: Optional CAIP-10 account identifier for agentWallet. May be injected when inputs are normalized from wallet + chain context.
        - `agentLabel` string
        - `agentType` 'ai' | 'bot' | 'service' | 'automation' | 'agent'
        - `avatar` string: Public agent avatar/logo URL or ipfs:// URI.
        - `description` string
        - `capabilities` object: Agent capabilities as boolean flags
          - `wallet` boolean
          - `signing` boolean
          - `spending` boolean
          - `publishing` boolean
          - `search` boolean
          - `browser` boolean
          - `mcp` boolean
          - `webhooks` boolean
          - `receipts` boolean
          - `proofs` boolean
          - `delegation` boolean
        - `instructions` string
        - `skills` object[]: Agent skills as structured objects
          - `id` string, required
          - `label` string
          - `version` string
          - `provider` string
          - `kind` 'native' | 'integration' | 'plugin' | 'mcp' | 'toolkit'
          - `configId` string: Optional opaque integration or provider configuration reference. Not a secret, not an OAuth token, not credential material.
          - `enabled` boolean
        - `services` object[]
          - `name` string, required
          - `endpoint` string, uri, required
          - `version` string
        - `defaultRuntime` object: Default runtime display hints, NOT security-authoritative; delegation runtimePolicy overrides these. These are convenience metadata for UI and tooling, not proof of which model/provider the agent actually uses.
          - `provider` string: Default inference provider label (e.g., "openrouter", "openai").
          - `model` string: Default inference model label (e.g., "kimi-k2.6", "gpt-5.4").
          - `mode` string: Default inference mode (e.g., "openai-chat", "openai-responses").
          - `origin` 'hermes' | 'openclaw' | 'opencode' | 'cursor' | 'claude' | 'codex' | 'hosted' | 'other': Runtime origin for wrap-and-connect imports. Display metadata only. Local frameworks share this token with `proofable mount --apply`. hosted/other have no implied adapter.
      - VerifierDataAgentDelegation: Delegation from a controller account to an agent; the controller signs. Use CAIP-2 chain references per wallet, or set chain or chainId on the verification request when both parties share the same network context. Proof output may include CAIP-10 account identifiers.
        - `controllerChainRef` string, required: CAIP-2 network reference for controllerWallet. Supply in data or on the verification request as chain (CAIP-2) or chainId (EVM).
        - `controllerWallet` string, required
        - `controllerAccountId` string, caip10-account: Optional CAIP-10 account identifier for controllerWallet. May be injected when inputs are normalized from wallet + chain context.
        - `agentChainRef` string, required: CAIP-2 network reference for agentWallet. Supply in data or on the verification request as chain (CAIP-2) or chainId (EVM).
        - `agentWallet` string, required
        - `agentAccountId` string, caip10-account: Optional CAIP-10 account identifier for agentWallet. May be injected when inputs are normalized from wallet + chain context.
        - `agentId` string
        - `maxSpend` string: Maximum amount for one proposed payment, encoded as a whole-number string in token base units. This field is not a cumulative balance. USDC uses six decimal places.
        - `allowedPaymentTypes` string[]
        - `receiptDisclosure` 'none' | 'summary' | 'full'
        - `expiresAt` integer
        - `instructions` string
        - `model` string: Preferred inference model label (backward compat; prefer runtimePolicy.allowedModelClasses for structured policy). Owner-view-only: not included in public proof responses.
        - `provider` string: Preferred inference provider label (backward compat; prefer runtimePolicy.allowedProviders for structured policy). Owner-view-only: not included in public proof responses.
        - `runtimePolicy` object: Runtime execution policy, security-authoritative, overrides identity defaultRuntime. Owner-view-only: not included in public proof responses. Only include when model/provider constraints affect the permission boundary.
          - `allowedProviders` string[]: Allowed inference provider labels (e.g., ["openrouter", "openai"]).
          - `allowedModelClasses` string[]: Allowed model class patterns (e.g., ["gpt-4.1-*", "approved-public-content-models"]).
          - `requiresHumanApproval` boolean: Whether the agent must pause for explicit human approval before irreversible actions.
          - `secretsExposedToReceipt` boolean: Whether the delegation policy allows secrets to appear in action proofs (default false).
        - `allowedActions` string[], required: Required. The canonical actions this agent may perform (e.g., ["read_context", "read_proofs", "execute_jobs"]). Nothing outside this list is granted. make_payment also requires allowedPaymentTypes and maxSpend. Owner-view-only: not included in public proof responses.
        - `deniedActions` string[]: Explicit denylist of action types the agent may NOT perform. Takes precedence over allowedActions. Owner-view-only: not included in public proof responses.
        - `allowedOrigins` string[]: For an app acting as the agent (agentId = app id): the exact web origins it may act from, or "*" for server-to-server callers.
        - `approvalPolicy` object: Approval requirements for the delegated agent. Owner-view-only: not included in public proof responses.
          - `humanApprovalRequiredForNewClaims` boolean: Whether the agent must get human approval before creating new proof claims on behalf of the controller.
          - `preApprovedContentOnly` boolean: Whether the agent may only publish content pre-approved by the controller.
    - VerificationDataNamespaced
    - string
  - `walletAddress` string, required: Signer wallet address (who authenticates the request). For raw HTTP, this must match the walletAddress used during POST /api/v1/verification/standardize and the wallet that produced signature.
  - `subjectWallet` string: Optional: Wallet being verified (delegated subject). Must match signed payload for verifiers that support delegated subjects (allowsDelegatedSubject: true). Defaults to walletAddress if omitted. Only valid when all verifiers in verifierIds support allowsDelegatedSubject: true.
  - `signature` string: Required unless authenticated session is present. For raw HTTP, sign the exact signerString returned by POST /api/v1/verification/standardize for this same request body.
  - `signedTimestamp` number: Required unless authenticated session is present. For raw HTTP, this must exactly match the signedTimestamp used during POST /api/v1/verification/standardize.
  - `chainId` integer: Advanced/optional. EVM signing context; defaults to Base mainnet (8453) when omitted and remains independent from the optional protocol hub. For non-EVM, use chain (CAIP-2). For chain-specific asset claims (NFT, token, contract), set chainId inside verifier data, not here.
  - `chain` string: CAIP-2 signer-chain identifier. Non-EVM wallets must provide it (for example solana:mainnet); EVM wallets may provide eip155:<id> or use the Base mainnet default.
  - `signatureMethod` string
  - `options` object: Optional verification options. By default the proof persists offchain with no on-chain transaction.
    - `publishToHub` boolean: Opt in to an on-chain hub registry transaction when targetChains is empty. Default false: offchain receipt only.
    - `targetChains` integer[]: Optional chain IDs for cross-chain propagation. Empty (default) = no cross-chain spokes.
    - `enableIpfs` boolean: Pin proof metadata to IPFS (public proofs only).
    - `privacyLevel` 'private' | 'public'
    - `publicDisplay` boolean
  - `meta` object

## Response `200`

OK

- VerificationCompleteResponse
  - `success` true, required
  - `status` string, required
  - `message` string, required
  - `data` object, required
    - `receipt` ReceiptDescriptor: New signed issuance uses caip-380-envelope. The neus-receipt value remains only for historical and not-yet-migrated response compatibility.
      - `format` 'caip-380-envelope' | 'neus-receipt', required
      - `portable` boolean, required
    - `portableProof` PortableProofEnvelope: Complete signed Proofable envelope. The signer may be a user wallet or the Proofable service issuing its own statement; the proof owner may differ. Owner exact-qHash reads return it. Anonymous exact-qHash reads return it only when the proof is public and portable disclosure is enabled.
      - `qHash` string, required
      - `did` string, required
      - `walletAddress` string, required
      - `verifierIds` string[], required
      - `data` object, required
      - `signedTimestamp` number, required
      - `chainId` number
      - `chain` string
      - `signature` string, required
      - `signatureMethod` string, required
  - `creditInfo` object

## Other responses

- `202`: Accepted
- `400`: Invalid request
- `401`: Invalid signature
- `403`: Forbidden
- `404`: Not found
- `409`: Conflict
- `429`: Rate limited
- `500`: Server error
- `503`: Service unavailable

---

[API](https://skmtc.dev/proofable/apis/proofable-api.md) · [All operations](https://skmtc.dev/proofable/apis/proofable-api/llms.txt) · [OpenAPI document](https://skmtc.dev/proofable/apis/proofable-api/revisions/ab03d40cb38f?raw)
