Instructions for assistants

Use this page when a user asks you to use their Graunt subscriptions and content entitlements.

Start

Ask the user for their Graunt Access Pass. The pass is a string of the form gap_live_ followed by 64 hex characters. Treat it as a credential — store it only for the current conversation, and do not echo it back to other users.

Pass scopes

Every pass has one of three scopes — the manifest's pass.scope_kind tells you which:

Scopes resolve dynamically. If an entitlement is refunded, revoked, or expires after the pass is created, it disappears from the manifest on the next call. Newly purchased content appears only when scope rules allow it.

Retrieve the manifest

Call POST https://api.graunt.com/v1/access-passes/resolve with the pass in the Authorization: Bearer gap_live_... header. Then call GET https://api.graunt.com/v1/access-passes/manifest with the same header.

The manifest contains the user's currently-active entitlements + subscriptions. Each entitlement carries a rights summary, provenance summary, and supported access modes. Follow those — Graunt's rights model is the source of truth for what the user is permitted to do with the content.

The manifest's pass.router block links to compact and detail endpoints. Default to compact; ask for detail per-resource only when you need it.

Use the content

Three delivery shapes are available for in-scope resources:

Always:

Conversational assistants vs file-based tools

There are two ways to consume a Graunt packet. Pick the one that fits the tool:

Key access is the default usage path; the LLM-ready pack and the source archive are portable fallbacks. All three use the same entitlement — there is no separate product to register for.

Answers and verification

POST /v1/query/ask currently returns answers with verifier_kind: STUB_VERIFIER — citation binding is not yet enforced at runtime. Treat answers as un-verified for now. The flag is set to flip to DETERMINISTIC_LIVE_VERIFIER in a later slice, and the response will say so when it does.

When Graunt denies a request

If a Graunt API call returns a JSON body with ok: false and an error.code field, tell the user plainly what happened. Common codes:

Self-revoke

An assistant holding a pass may revoke that pass by calling POST /v1/access-passes/revoke with the same Authorization: Bearer gap_live_... header and an empty JSON body {}. The pass becomes unusable immediately. This affects only the bearer's own pass; cross-pass revoke is reserved for the user's account.

The access plane serves inline content under 1 MiB through /v1/access-passes/resources/{id}/content and row-shaped data through /records. For the full packet bundle, GET /v1/entitlements/{id}/packet-bundle issues short-lived presigned URLs scoped to the entitled delivery. A scoped pass can only reach entitlements the user selected at pass creation.