Make your first API call
Five minutes from a fresh key to a working integration. Pick your stack β every example below uses obvious placeholder values you'll swap for your own.
1. Mint an API key#
Sign in to agency.gary.club β Settings β API Keys. The page shows your primary key with a copy button β there are no scope checkboxes. The key is full-access at the agency tenancy. Copy the cleartext value β it starts with gc_live_β¦ and is shown once. (For per-client keys, head to that client's own API Keys tab β same shape, prefix cl_live_.)
2. Verify the key works#
Hit the GET /v1/me introspection endpoint. It echoes back the key's tenancy and rate limit β useful for eyeballing βdoes this key still workβ and for SDK smoke tests.
curl https://agency.gary.club/api/public/v1/me \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"You'll get a JSON response like this:
{
"api_key": {
"id": "00000000-0000-0000-0000-000000000001",
"name": "Primary",
"prefix": "gc_live_",
"kind": "agency",
"rate_limit_per_minute": 60,
"expires_at": null,
"tag": null
},
"tenant": {
"org_id": "00000000-0000-0000-0000-0000000000aa",
"client_id": null,
"is_client_scoped": false
}
}3. Create a contact#
POST /v1/crm/contacts is idempotent on email or phone. Calling it twice with the same identity returns the existing contact (with created: false) instead of duplicating.
curl -X POST https://agency.gary.club/api/public/v1/crm/contacts \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789" \
-H "Content-Type: application/json" \
-d '{
"email": "jane@example.com",
"first_name": "Jane",
"last_name": "Doe",
"title": "Head of Ops",
"source": "n8n_inbound_form"
}'email or phone as the identity; everything else is just metadata.4. Subscribe to a webhook#
Webhooks let your stack react instead of poll. We POST a signed payload to your URL the moment something happens β a call completes, an SMS comes in, a deal moves stage. Standard event names, replay-protected HMAC signature.
curl -X POST https://agency.gary.club/api/public/v1/webhooks \
-H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.example.com/incoming",
"events": ["call.completed", "sms.received"],
"description": "Triage flow"
}'
# Returns the signing secret ONCE β stash it.secret field in the response is shown once. You'll use it to verify the HMAC signature on every incoming delivery. Lost it? Call PATCH /v1/webhooks/{id} with { rotate_secret: true } to get a fresh one.Wire it into n8n#
Two node types cover most flows:
- HTTP Request node for calling our REST endpoints. Set Authentication to Generic Credential Type β Header Auth, with name
Authorizationand valueBearer gc_live_β¦. - Webhook trigger node to receive our outbound POSTs. Copy n8n's generated URL, register it via
POST /v1/webhooks, save the secret in n8n credentials, and verify with the HMAC snippet on the Webhooks page.
call.completed, parse the transcript in n8n, then call back into our API to log the outcome, update a deal, or send an SMS reply. That round-trip β event in, REST call out β is the most common gary.club integration shape.Use it from Claude#
Drop a JSON config into Claude Desktop and the entire API becomes native tools β Claude can list contacts, send SMS, brief calls, manage subscriptions, all by name.
{
"mcpServers": {
"gary-club": {
"url": "https://agency.gary.club/api/public/v1/mcp",
"headers": {
"Authorization": "Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"
}
}
}
}Restart Claude. Open a chat and ask βlist my CRM contactsβ β Claude calls crm.contacts.list and shows you the result. See the MCP setup page for full details and the Claude Skill for a curated set of named workflows.
Next steps#
- Authentication β the two key shapes + the act-as-client header
- Webhooks β full event catalog, HMAC verification, retries
- Contacts, Deals, SMS, Calls β endpoint references
- Errors β error shape and what to retry
- Full API reference β every endpoint, live OpenAPI

