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

# Create proofs from your server

> Create proofs for users who approved your app, and automate Proofable as your own profile, from backend code.

Add a [gate](/gates/sell-access), then check the result on the server with `gateCheck`. This page is for backends that create proofs directly, or that automate Proofable as their own profile.

## Choose a path

| Need | Use |
| - | - |
| Visitors verify in the browser and you check later | [Sell access with one gate](/gates/sell-access). No access key. |
| Your server creates proofs for a user who approved your app | `verifyFromApp` after one-time approval |
| MCP, CI, or raw HTTP as your own profile | An [access key](/deployment/access-keys) |

## Create proofs for approved users

After a user approves your app once, your server can create proofs for them without a signature on every request.

```javascript theme={"system"}
import { ProofableClient } from '@proofable/sdk';

// Server only. Never put this config in a browser bundle.
const client = new ProofableClient({
  appId: process.env.PROOFABLE_APP_ID,
  // Must match the origin the user approved, or use origin:* on the approval
  appOrigin: process.env.PROOFABLE_APP_ORIGIN, // for example https://app.example.com
  // Optional: bill and automate as your builder profile
  apiKey: process.env.PROOFABLE_ACCESS_KEY,
});

const proof = await client.verifyFromApp({
  user: { walletAddress: user.accountAddress },
  verifier: 'ownership-basic',
  content: { claim: 'User completed onboarding', source: 'your-app' },
});
```

This needs:

* An active user approval for your `appId` and site origin. [App link](/agents/agent-delegation#app-link)
* `X-Proofable-App` from `appId` and a matching `Origin` on each request. In Node, `appOrigin` sets both.

If the approval is missing, send the user through [Hosted Verify](/verification/hosted) first.

Creating proofs this way is different from publishing a listing, which bills hosted verification to your account.

## Automate as your profile

An access key identifies your builder profile for automation. Pass it as `apiKey` on the server. It does not replace per-user approval for creating proofs for other people. [Access keys](/deployment/access-keys)

## Billing

Published gates are the default billing source. Pass `gateId` to hosted checkout and `gateCheck`, and Proofable resolves the owner, usage, and payment from that gate. `appId` is public attribution for server flows and does not bill your account by itself. [Pricing](/pricing)

Next: [API authentication](/api/authentication)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.