Create credential

The direct intake path: a customer-held token/setup-token (Verify) or an externally obtained OAuth bundle from the CLI's local PKCE (Adopt).

POST /v1/connection/{provider}/credential

Addresshttps://api.hanzo.ai/v1/connection/{provider}/credential
MethodPOST
Operationpost_connection_by_provider_credential
AuthAuthorization: Bearer $HANZO_API_KEY

The direct intake path: a customer-held token/setup-token (Verify) or an externally obtained OAuth bundle from the CLI's local PKCE (Adopt). ALWAYS verify-before-store: a bad credential is refused and NOTHING is persisted (connectByCredential's fail-closed order).

Request

9 fields, body application/json (required).

FieldInTypeRequiredDescription
providerpathstringyesProvider is the user-scoped provider's registry id, from the path.
accountIdbodystring—AccountID scopes the credential where the provider's Verify needs one.
labelbodystring—Label names this connection; empty means "default".
oauthbodyprovider.oauthBundleIn—
oauth.accessbodystring—Access is the access token.
oauth.accountbodystring—Account is the account label the flow reported; sanitized on ingest.
oauth.refreshbodystring—Refresh is the refresh token.
providerbodystring—Provider is the user-scoped provider's registry id, from the path.
tokenbodystring—Token is the customer-held credential for the Verify path.

Response

StatusBodyMeaning
200provider.credentialOutok
defaultproblem-detailsrefused

200 body — 10 fields.

FieldInTypeAlwaysDescription
connectedbodyboolean—Connected is always true — a failed verification is a 400 and stores nothing.
connectorbodyprovider.connectionView—
connector.accountbodystring—Account is the human label of the connected third-party account (the Slack team name, the GitHub org login).
connector.connectedAtbodystring—ConnectedAt is when the connection was last (re)established, RFC 3339 UTC.
connector.expiresAtbodystring—ExpiresAt is when the access token expires, RFC 3339 UTC; empty for a credential that does not expire.
connector.externalIdbodystring—ExternalID is the provider's own id for the account (Slack team.id, GitHub installation_id) — the value inbound webhooks are mapped back to this org by.
connector.idbodystring—ID is provider + ":" + label, the address every connection route takes.
connector.labelbodystring—Label is the caller's own name for this connection ("default", "work").
connector.providerbodystring—Provider is the connected provider's registry id.
connector.scopesbodystring[]—Scopes are the permissions the provider granted.

Failure carries the platform error shape — see Errors.

Examples

hanzo connection credential <provider>
import { Configuration, ProviderApi } from 'hanzoai';

const api = new ProviderApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postConnectionByProviderCredential({ provider: 'provider', accountId: "<accountId>", label: "<label>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import ProviderApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = ProviderApi(client).post_connection_by_provider_credential(provider='provider', account_id="<accountId>", label="<label>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.ProviderAPI.PostConnectionByProviderCredential(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, provider_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = provider_api::post_connection_by_provider_credential(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.ProviderApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new ProviderApi(client).postConnectionByProviderCredential();
curl -X POST https://api.hanzo.ai/v1/connection/<provider>/credential \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "accountId": "<accountId>",
       "label": "<label>"
     }'

MCP reaches provider through the provider tool, which names its 38 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_connections"
         }
       }
     }'

Provider API · All Hanzo APIs · Interactive reference

Was this page useful?