> ## 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.

# SDK authentication

> Sign people in on Proofable. Authenticate your server with a key or gate check.

Default: no wallet or passkey code in your app. Visitors sign in or complete checks on `proofable.me/verify` via `VerifyGate`, `getHostedCheckoutUrl`, or MCP OAuth.

| Where | What | Wallets or keys in your app |
| - | - | - |
| Browser: access gate | `VerifyGate` + `gateId` | No |
| Browser: sign-in | `getHostedCheckoutUrl` + `intent: 'login'` | No |
| Server | `ProofableClient` + `gateCheck` with the same `gateId` | No |
| Automation as your profile | `ProofableClient` + server key (`npk_*`) | No |
| Advanced server | `verifyFromApp` after per-user approval | No |
| Browser (exception) | `client.verify({ wallet })` | Yes. [Signing format](../verification/signing-format) |

## VerifyGate (browser)

```jsx theme={"system"}
import { VerifyGate } from '@proofable/sdk/widgets';

<VerifyGate gateId="gate_your-app-name">
  <ProtectedContent />
</VerifyGate>;
```

## Hosted sign-in (browser)

[Hosted sign-in](../verification/hosted).

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

const url = getHostedCheckoutUrl({
  gateId: 'gate_your-app-name',
  returnUrl: 'https://app.example.com/auth/callback',
});
```

**Sign-in only:**

```javascript theme={"system"}
const loginUrl = getHostedCheckoutUrl({
  intent: 'login',
  returnUrl: 'https://app.example.com/auth/callback',
});
```

## Server reuse

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

const client = new ProofableClient();

const result = await client.gateCheck({
  gateId: 'gate_your-app-name',
  address: user.accountAddress,
});

if (result.data?.gate?.allRequiredSatisfied !== true) {
  // Send the visitor back to VerifyGate or Proofable sign-in
}
```

## Server keys

For servers, CI, and MCP when browser sign-in is unavailable. Create keys under [Profile → Account](https://proofable.me/profile?tab=account).

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

// Server only. Never ship npk_* in a browser bundle
const client = new ProofableClient({ apiKey: process.env.PROOFABLE_ACCESS_KEY });
```

The SDK sends `Authorization: Bearer <npk_...>`.

## IDE and MCP sign-in

Run `proofable setup`. Default is browser OAuth. Set `PROOFABLE_ACCESS_KEY` first only for servers and CI.

See [MCP setup](../mcp/setup).

## Advanced: `verifyFromApp`

After one-time user approval ([app link](../agents/agent-delegation)), your backend can create proofs without a per-request signature:

```javascript theme={"system"}
const client = new ProofableClient({
  appId: 'acme-web',
  appOrigin: 'https://app.example.com',
  apiKey: process.env.PROOFABLE_ACCESS_KEY, // optional. Your builder profile
});

await client.verifyFromApp({
  user: { walletAddress: user.accountAddress },
  verifier: 'ownership-basic',
  content: 'Hello Proofable',
});
```

Full detail: [Server integrations](../integrations/server).

## Advanced

[API authentication](../api/authentication)


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