Gary Club
Quickstart

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_.)

Treat keys like passwords
Anyone with this key can read and write your CRM. Store it in a secret manager, env var, or your integration's credentials store β€” never in client-side code or committed to git.

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.

Verify your key
curl https://agency.gary.club/api/public/v1/me \
  -H "Authorization: Bearer gc_live_EXAMPLE_AbCdEfGhIj0123456789"

You'll get a JSON response like this:

200 OK
{
  "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.

Create / upsert a contact
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"
  }'
Why upsert?
It means n8n flows that run on every form submission won't pile up duplicates when the same person comes back. Pass any of 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.

Subscribe to events
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.
Save the secret
The 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:

  1. HTTP Request node for calling our REST endpoints. Set Authentication to Generic Credential Type β†’ Header Auth, with name Authorization and value Bearer gc_live_….
  2. 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.
The triage loop
Subscribe to 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.

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "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#