Complete user — POST /v1/provider/google/user/complete

Finishes connecting the caller's Google account: it takes the authorization the callback parked, trades it for the person's tokens, and seals them.

POST /v1/provider/google/user/complete

Addresshttps://api.hanzo.ai/v1/provider/google/user/complete
MethodPOST
Operationpost_provider_google_user_complete
AuthAuthorization: Bearer $HANZO_API_KEY

Finishes connecting the caller's Google account: it takes the authorization the callback parked, trades it for the person's tokens, and seals them. Only the person who started the flow can complete it — another person's grant id is simply not found — and a grant completes once. A grant that leaves out sending mail, or offline access, is refused and nothing is kept: a connection that cannot send is not one this surface offers.

Request

1 field, body application/json (required).

FieldInTypeRequiredDescription
grantbodystring—Grant is the id the callback handed the page in its redirect.

Response

StatusBodyMeaning
200provider.googleUserOutok
defaultproblem-detailsrefused

200 body — 6 fields.

FieldInTypeAlwaysDescription
configuredbodyboolean—Configured is whether this deployment holds the OAuth client.
connectedbodyboolean—Connected is whether the caller has connected their own Google account in this org.
connectedAtbodystring—ConnectedAt is when the connection was made, RFC 3339 UTC.
emailbodystring—Email is the Google account they connected: the From of every message sent as them.
expiresAtbodystring—ExpiresAt is when the current access token expires, RFC 3339 UTC.
sendbodyboolean—Send is whether the grant lets Hanzo send mail as them.

Failure carries the platform error shape — see Errors.

Examples

hanzo provider google user complete
import { Configuration, ProviderApi } from 'hanzoai';

const api = new ProviderApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postProviderGoogleUserComplete({ grant: "<grant>" });
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_provider_google_user_complete(grant="<grant>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.ProviderAPI.PostProviderGoogleUserComplete(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_provider_google_user_complete(&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).postProviderGoogleUserComplete();
curl -X POST https://api.hanzo.ai/v1/provider/google/user/complete \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "grant": "<grant>"
     }'

MCP reaches provider through the provider tool, which names its 41 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?
Broken link or missing step? Drop it in #docs on Discord or open a PR.