Schema, usage and capabilities
These endpoints describe your workspace instead of returning its records. Call them when you build a query, before a large read, or when an action is refused and you want to know what is missing. None of them counts against your plan.
The MCP tools describe_schema and get_usage call the first two. See the tools reference.
| Endpoint | Scope | Returns |
|---|---|---|
GET /v1/schema | the entity’s read scope | The fields you can filter and group on, per connected source. |
GET /v1/usage | none | How much of your plan is used this cycle, and when each source last synced. |
GET /v1/tenant/capabilities | actions:write | Which integrations are connected and which actions are switched on. |
GET /v1/auth/status | none | Who the key belongs to, its workspace and its scopes. |
Schema
Section titled “Schema”GET /v1/schemaRequired scope: contacts:read, companies:read or deals:read, matching entity.
Returns every field you can use in a typed filter, and the source fields you can sort by or group by in POST /v1/aggregate. The list depends on your workspace: it holds the standard properties, the fields of each source you have connected, and the columns of a connected database.
Query Parameters
Section titled “Query Parameters”| Parameter | Type | Default | Description |
|---|---|---|---|
entity | string | — | Required. contacts, companies or deals. |
include_samples | boolean | false | Add a few example values to fields where that is cheap and the field holds nothing personal. |
curl "https://api.pathbound.ai/v1/schema?entity=contacts" \ -H "Authorization: Bearer $PATHBOUND_API_KEY"Response — 200 OK
Section titled “Response — 200 OK”{ "status": "success", "entity": "contact", "connected_sources": ["apollo", "hubspot"], "filterable_fields": [ { "field": "lifecyclestage", "source": "canonical", "type": "string", "ops": ["eq", "neq", "in", "nin", "exists", "contains"], "group_by": true, "pii": false, "filterable": true, "via": "materialized" }, { "field": "createdate", "source": "canonical", "type": "date", "ops": ["eq", "neq", "in", "nin", "exists", "gt", "gte", "lt", "lte"], "group_by": true, "pii": false, "filterable": true, "via": "materialized" }, { "field": "hubspot.hs_lead_status", "source": "hubspot", "type": "string", "ops": ["eq", "neq", "in", "nin", "exists", "contains"], "group_by": true, "pii": false, "filterable": true, "indexed": true, "via": "materialized" } ]}| Field | Description |
|---|---|
entity | contact, company or deal. |
connected_sources | The sources whose fields are listed. Always empty for deals, which are created in Pathbound and have no source fields. |
filterable_fields[].field | The name to use in a filter. A standard property is written plainly (lifecyclestage). A source’s field is written source.field. |
filterable_fields[].source | canonical for a standard property, otherwise the source’s id. |
filterable_fields[].type | string, number, boolean, date or string[]. Filter values are converted to this type, and a value that cannot be converted is a 400. |
filterable_fields[].ops | The operators the field takes. |
filterable_fields[].group_by | For a source.field entry: whether it can be the group_by of an aggregate, written as it is here. For a standard property the flag is no guide: an aggregate groups standard properties by its own dimension names (lifecycle_stage, job_title), which are listed with the aggregate, and group_by: "lifecyclestage" is a 400. |
filterable_fields[].pii | Whether the field holds personal data about a contact. |
filterable_fields[].filterable | false only for an AI agent in a workspace that hides contact PII from agents. Always true for an API key. |
filterable_fields[].custom, label | Present on a custom field found in a source. label is the name the source shows for it. |
filterable_fields[].samples | Example values, with include_samples=true. |
warm_truncated | true when a source has more custom fields than are listed. |
The standard properties are always listed, but a filter is not limited to them: any other property of a contact or a company can be named in a filter too. Its value is then compared as you sent it, without conversion to a type.
GET /v1/usageRequired scope: none. Any valid key can call it.
Returns how many active profiles your workspace has used in the current billing cycle and how many remain, and when each connected source last synced.
curl https://api.pathbound.ai/v1/usage \ -H "Authorization: Bearer $PATHBOUND_API_KEY"Response — 200 OK
Section titled “Response — 200 OK”{ "status": "success", "workspace": { "id": "tenant_xyz", "name": "Acme Corp", "ws": "acmecorp" }, "activations_used": 1284, "remaining": 8716, "plan_cap": 10000, "cycle_start": "2026-10-02T00:00:00.000Z", "cycle_end": "2026-11-02T00:00:00.000Z", "reset_at": "2026-11-02T00:00:00.000Z", "subscription_status": "active", "plan_tier": "growth", "plan_label": "Growth", "entitlement_state": "subscribed", "is_trial": false, "trial_ends_at": null, "can_activate": true, "is_billing_exempt": false, "sources": [ { "source": "apollo", "last_synced_at": "2026-10-12T09:41:07.000Z" }, { "source": "hubspot", "last_synced_at": "2026-10-12T09:44:52.000Z" } ]}| Field | Description |
|---|---|
workspace | The workspace the key reaches: its id, its name (null when the name holds characters the MCP server does not show to a model) and its ws, the value an MCP connector URL names it by. |
activations_used | Customers read so far in this cycle. |
plan_cap | The plan’s allowance per cycle. null means unlimited. 0 means no new customer can be read: the trial is over, or the subscription is paused or canceled. |
remaining | plan_cap less activations_used, never below 0. null when the plan is unlimited. |
can_activate | Whether the plan allows new customers to be read at all: false when the trial is over, or the subscription is paused or canceled. It does not look at usage, so it stays true when the allowance is used up. To know whether a read will go through, check remaining or use a dry_run. |
cycle_start, cycle_end, reset_at | The current cycle. The count starts again at reset_at. |
plan_tier, plan_label | The plan, as a key and as its name. |
entitlement_state | subscribed, trialing, trial_expired, paused, inactive, custom or exempt. |
is_trial, trial_ends_at | Whether the workspace is in its trial, and when the trial ends. |
subscription_status | The subscription’s status, or null when there is none. |
is_billing_exempt | true for a workspace on an arrangement outside the standard plans. |
sources[] | Each connected source and when it last finished a sync. postgres stands for a connected database. last_synced_at is null for a source that has not synced yet. |
Records you have already read this cycle stay readable at any remaining, and counts, aggregates and id-only lists are always free. To learn what one particular read would add, use its dry_run.
Capabilities
Section titled “Capabilities”GET /v1/tenant/capabilitiesRequired scope: actions:write
Returns which of the integrations that have action endpoints are connected (Gmail, Resend, Instantly, Apollo and Hunter) and, for each group of actions, whether the caller can use it now and why not. A connected CRM or another source that is only read is not listed here: GET /v1/usage lists those under sources. Call it when an action endpoint answers 412, or before you offer an action in your own interface.
Capabilities are answered for the user who created the key. Sending from Gmail is the clearest case: gmail.accounts lists every mailbox connected in the workspace, and send_enabled is true only for a mailbox that user connected themselves and may send from.
Response — 200 OK
Section titled “Response — 200 OK”{ "status": "success", "capabilities": { "integrations": ["gmail", "resend", "apollo"], "gmail": { "accounts": [ { "is_primary": true, "has_send_scope": true, "needs_reconsent": false, "is_valid": true, "send_enabled": true } ] }, "tool_settings": { "gmail_send_email": { "enabled": true, "sender_email": "[email protected]", "senders": ["[email protected]"] }, "resend_send_email": { "enabled": false, "reason": "tool_disabled" }, "prospecting_enrich": { "enabled": true, "providers": ["apollo"] }, "apollo_sequences": { "enabled": false, "reason": "scope_missing" }, "streams_manage": { "enabled": true } }, "privacy": { "mcp_redact_pii": false }, "cache_ttl_seconds": 60 }}tool_settings holds one entry per group of actions; the example shows five of them. Each entry has enabled and, when it is false, a reason. For Gmail, sender_email is the mailbox a send without from would use, and senders every mailbox the caller may name. When enabled is true and there is no sender_email, several mailboxes can send and none is the default, so every send has to name one.
reason | Meaning | What to do |
|---|---|---|
integration_missing | The integration is not connected. | Connect it under Integrations. |
tool_disabled | A workspace admin has not switched this action on. | Switch it on under MCP Tools. |
scope_missing | The integration is connected without a permission the action needs. | Connect it again and grant the permission. |
invalid_credentials | The integration’s credentials stopped working. | Connect it again. |
no_primary | The user who created the key has connected no Gmail mailbox of their own. | Connect one under Integrations → Gmail. |
Each name under tool_settings stands for a switch on the MCP Tools page. Those switches are set for AI agents. Whether one also applies to an API key differs by action, and each action’s page says so: Gmail, Resend, Apollo sequences, Instantly, Enrichment and prospecting, Streaming and Knowledge.
privacy.mcp_redact_pii says whether the workspace hides contacts’ personal details from AI agents. It does not change what an API key receives.