GramClaw API

v1

Pilotez votre prospection Telegram depuis des scripts, des agents IA ou le serveur MCP Telegram : recherchez des messages, gérez le pipeline CRM, définissez des colonnes personnalisées et envoyez des messages, des diffusions et des campagnes. Créez une clé dans Paramètres → Clés API.

Authentification

Chaque requête nécessite une clé API d'espace de travail comme jeton Bearer. Créez-en une dans Paramètres → Clés API — la clé complète ( gc_live_…) n'est affichée qu'une seule fois.

URL de base
https://gramclaw.com
Chaque requête
Authorization: Bearer gc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Démarrage rapide
BASE="https://gramclaw.com"
KEY="gc_live_…"
curl -s "$BASE/api/v1/me" -H "Authorization: Bearer $KEY"

À noter : les appels API s'exécutent directement — il n'y a pas d'étape de confirmation (contrairement à l'IA intégrée). La clé sert d'autorisation ; protégez-la comme un mot de passe. Limite de débit : 120 requêtes / minute par clé, avec des en-têtes X-RateLimit-* sur chaque réponse. Les erreurs renvoient { "error": "…" } avec un statut 4xx/5xx.

Portées : les clés portent read (chats, messages, recherche, analyses), write (pipeline, colonnes, webhooks), et/ou send (messages, diffusions, campagnes) — choisissez-les lors de la création de la clé. Les POST de type envoi acceptent un en-tête Idempotency-Key , pour que les nouvelles tentatives ne provoquent jamais de double envoi.

Points de terminaison

GET/api/v1/meVerify key & list accountsportée : read

Confirms a key works and returns the workspace plus the connected accounts it can act on (with account ids for broadcasting).

Réponse
{
  "workspace_id": "cbf805da-…",
  "key": { "name": "Claude MCP", "prefix": "gc_live_ab12cd34", "scopes": ["read","send"] },
  "accounts": [
    { "id": "acc_…", "provider": "Telegram", "type": "MESSAGING", "name": "…" }
  ]
}
GET/api/v1/chatsList conversationsportée : read

The workspace's conversations newest-first, served from GramClaw's own store (fast — no provider calls). Cursor-paginated; filter by account, pipeline stage, or column value.

ChampTypeRemarques
cursorstringfrom previous next_cursor
limitnumberdefault 50, max 100
account_idstring
stage_keystringonly chats in this stage
column_idstringwith column_value: only matching chats
column_valuestring
Requête
curl -s "$BASE/api/v1/chats?stage_key=qualified&limit=20" \
  -H "Authorization: Bearer $KEY"
Réponse
{
  "chats": [{ "id": "…", "name": "Sarah K", "provider": "TELEGRAM",
              "last_message_text": "…", "last_message_at": "…", "unread_count": 2 }],
  "next_cursor": "bzoyMA", "has_more": true
}
GET/api/v1/chats/{id}Get one chatportée : read

One chat enriched with its pipeline stage and custom-column values.

Réponse
{
  "chat": { "id": "…", "name": "Sarah K", "stage_key": "qualified",
            "columns": [{ "column_id": "…", "value": ["High"] }] }
}
GET/api/v1/chats/{id}/messagesRead message historyportée : read

A chat's messages, oldest-first within the page. Pass `before` (ISO timestamp) to page older messages; the response's next_before feeds the next call.

ChampTypeRemarques
limitnumberdefault 30, max 100
beforestringISO timestamp — messages older than this
Requête
curl -s "$BASE/api/v1/chats/CHAT_ID/messages?limit=50" \
  -H "Authorization: Bearer $KEY"
Réponse
{
  "messages": [{ "id": "…", "text": "Hey!", "is_sender": false,
                 "timestamp": "2026-07-06T10:00:00Z", "attachments": [] }],
  "source": "db", "next_before": "2026-07-01T08:00:00Z"
}
POST/api/v1/chats/startStart a new conversationportée : send

Start (or find) a DM with someone by phone, @username, or provider id — including people never messaged before. Optionally sends a first message. Supports Idempotency-Key.

ChampTypeRemarques
account_id*stringaccount to send from (see /me)
identifier*stringphone, @username, or provider id
providerstringhint: TELEGRAM, WHATSAPP, …
textstringoptional first message
Requête
curl -s "$BASE/api/v1/chats/start" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"account_id":"acc_…","identifier":"@newlead","text":"Hi!"}'
Réponse
{ "chat": { "id": "…" } }
GET/api/v1/contactsList contactsportée : read

The workspace's contact cache (name + provider id per account). Cursor-paginated, searchable by name.

ChampTypeRemarques
cursorstring
limitnumberdefault 100, max 200
account_idstring
qstringname search
Réponse
{
  "contacts": [{ "account_id": "…", "provider_id": "…", "name": "Sarah K" }],
  "next_cursor": null, "has_more": false
}
GET/api/v1/pipelineGet pipeline

The workspace's pipeline stages and which chats sit in each stage. Chats not in placements are in the default 'new' stage.

Réponse
{
  "stages": [{ "key": "new", "label": "New", "terminal": false }, …],
  "placements": [{ "chat_id": "…", "stage_key": "qualified" }]
}
POST/api/v1/pipeline/moveMove a chat to a stage

Move a chat into a pipeline stage.

ChampTypeRemarques
chat_id*string
stage_key*stringfrom GET /api/v1/pipeline
Requête
curl -s "$BASE/api/v1/pipeline/move" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"chat_id":"…","stage_key":"qualified"}'
Réponse
{ "ok": true, "message": "Moved to **Qualified**." }
GET/api/v1/columnsList custom columns

The workspace's custom columns (tags) with ids, types, and allowed option values.

Réponse
{
  "columns": [
    { "id": "…", "name": "Priority", "type": "select",
      "options": [{ "value": "High", "color": "#f87171" }] }
  ]
}
POST/api/v1/columns/setSet a column value

Set (or clear) a custom-column value on a chat. An empty value array clears it.

ChampTypeRemarques
column_id*stringfrom GET /api/v1/columns
chat_id*string
value*string[]empty clears
Requête
curl -s "$BASE/api/v1/columns/set" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"column_id":"…","chat_id":"…","value":["High"]}'
Réponse
{ "ok": true, "message": "Set **Priority** = High." }
POST/api/v1/messagesSend a message

Send a single message to an existing chat.

ChampTypeRemarques
chat_id*string
text*string
Requête
curl -s "$BASE/api/v1/messages" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"chat_id":"…","text":"Hi there!"}'
Réponse
{ "ok": true, "message": "Message sent." }
POST/api/v1/broadcastBroadcast to an audience

Send one message to everyone in a pipeline stage or with a custom-column value. Supports {{name}} personalization. Capped at 30 recipients per call.

ChampTypeRemarques
account_id*stringaccount to send from (see /me)
audience_type*"stage" | "column"
audience_ref*stringstage_key, or column_id for column
column_valuestringrequired for column audiences
message_text*stringmay include {{name}}
Requête
curl -s "$BASE/api/v1/broadcast" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"account_id":"acc_…","audience_type":"stage",
       "audience_ref":"qualified","message_text":"Hi {{name}}!"}'
Réponse
{ "ok": true, "message": "Broadcast sent to **12** recipients.",
  "recipients": 12, "audience_total": 12, "capped": false }
POST/api/v1/campaignsCreate a campaign (large sends)portée : send

The API path for sends larger than broadcast's 30-recipient cap (max 5,000 contacts). GramClaw's background worker delivers every message — initial + optional follow-up steps — respecting per-account daily quotas. Supports Idempotency-Key. Also: GET /api/v1/campaigns lists campaigns; GET /api/v1/campaigns/{id} returns status + per-contact detail.

ChampTypeRemarques
namestring
account_idstringor account_pool: string[] to rotate accounts
message_text*stringmay include {{name}}
contacts*array[{ name?, identifier, chat_id? }]
stepsarrayfollow-ups: [{ branch, wait_hours, variants[] }]
daily_quota_per_accountnumberdefault 30
Requête
curl -s "$BASE/api/v1/campaigns" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: launch-jul-06" \
  -d '{"account_id":"acc_…","message_text":"Hi {{name}}!",
       "contacts":[{"name":"Sarah","identifier":"@sarahk"}]}'
Réponse
{ "campaign": { "id": "…", "status": "queued" }, "queued": true }
GET/api/v1/analyticsCampaign analyticsportée : read

Workspace campaign totals (sent, failed, replies, reply rate) plus the 50 most recent campaigns.

Réponse
{
  "totals": { "campaigns": 12, "sent": 452, "replies": 87, "reply_rate": 0.1925 },
  "campaigns": [ … ]
}
POST/api/v1/webhooksRegister a webhookportée : write

Get pushed events instead of polling: message.received, message.edited, message.deleted, pipeline.moved, campaign.replied. Deliveries are signed (X-GramClaw-Signature: sha256=HMAC_SHA256(secret, body)); the secret is returned once at creation. GET lists endpoints; PATCH /api/v1/webhooks/{id} updates url/events/active; DELETE removes. Max 10 per workspace; 20 consecutive failures auto-disable an endpoint.

ChampTypeRemarques
url*stringyour HTTPS endpoint
eventsstring[]omit or ["*"] for all events
Requête
curl -s "$BASE/api/v1/webhooks" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/hooks/gramclaw",
       "events":["message.received","pipeline.moved"]}'
Réponse
{ "webhook": { "id": "…", "events": ["message.received","pipeline.moved"] },
  "secret": "whsec_…  ← shown once, signs every delivery" }

Se connecter depuis Claude / Cursor (MCP Telegram)

Le plus simple — connecteur distant (une URL). Dans votre client MCP, ajoutez un connecteur personnalisé et collez votre URL personnelle. Créez une clé dans Paramètres → Clés API pour obtenir l'URL complète avec votre clé. Consultez l' aperçu du MCP Telegram pour la liste des outils.

URL MCP distante
https://gramclaw.com/api/mcp?key=gc_live_…

Alternative — serveur local (Cursor, ou fichier de configuration Claude Desktop) :

claude_desktop_config.json
{
  "mcpServers": {
    "gramclaw": {
      "command": "npx",
      "args": ["-y", "gramclaw-mcp"],
      "env": {
        "GRAMCLAW_API_KEY": "gc_live_…",
        "GRAMCLAW_BASE_URL": "https://gramclaw.com"
      }
    }
  }
}
Besoin d'aide pour la configuration ? Consultez le guide d'aide API et MCP.
Chat on Telegram