Public API (v1)#
A v1 REST API to read your project, generate content, schedule posts, and receive signed webhooks : from the Starter plan up. MCP itself is open on every plan — only credit consumption applies there.
/api/public/v1/…) and will also be reachable from api.gliiz.com once that subdomain is wired up: same routes, same keys.Open Account Settings → API (the Workspaces page, not a project's own settings), pick the project to scope it to, create the key, then copy it immediately. The full secret is only shown once.
Call /me to confirm the project, remaining AI credits and connected social accounts. This is your smoke test.
Create an HTTPS webhook before long generations: finished jobs arrive without aggressive polling.
Generate copy/flyer, retrieve the asset from /assets or a webhook, then schedule it with /posts.
export GLIIZ_API_BASE="https://www.gliiz.com/api/public/v1"
export GLIIZ_API_KEY="gliiz_your_secret_key"
curl "$GLIIZ_API_BASE/me" \
-H "Authorization: Bearer $GLIIZ_API_KEY"Generate a key from Account Settings → API (Owner or Admin, Starter plan and up — or a free account holding a purchased credit balance). A key is scoped to exactly one project and shown in full only once at creation. Send it as a Bearer token on every request:
curl https://www.gliiz.com/api/public/v1/me \
-H "Authorization: Bearer gliiz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"All v1 routes use JSON, and webhooks deliver signed JSON to you. Keep the key server-side only: never expose it in a browser, public mobile app, or embedded script.
const GLIIZ_API_BASE = "https://www.gliiz.com/api/public/v1";
async function gliiz(path: string, init: RequestInit = {}) {
const res = await fetch(`${GLIIZ_API_BASE}${path}`, {
...init,
headers: {
"Authorization": `Bearer ${process.env.GLIIZ_API_KEY}`,
"Content-Type": "application/json",
...init.headers,
},
});
const json = await res.json().catch(() => ({}));
if (!res.ok) throw new Error(json.error ?? `Gliiz API error ${res.status}`);
return json;
}The easiest path is deliberately linear: verify the project, generate copy, generate or reuse a visual, then schedule. Webhooks let you receive long-running generations without keeping a connection open.
// 1) Vérifier le projet et les crédits
const me = await gliiz("/me");
console.log(me.project.name, me.credits?.remaining);
// 2) Générer des légendes adaptées à la marque du projet
const copy = await gliiz("/generate/copy", {
method: "POST",
body: JSON.stringify({
prompt: "Annonce le lancement de notre nouvelle offre premium",
platforms: ["instagram", "linkedin"],
contentKind: "image"
}),
});
// 3) Générer un visuel IA. La réponse est souvent async: gardez le jobId.
const flyer = await gliiz("/generate/flyer", {
method: "POST",
body: JSON.stringify({
prompt: "Flyer premium pour le lancement d'une offre marketing IA",
format: "portrait",
outputQuality: "2k",
modelTier: "standard",
variantCount: 1
}),
});
// 4) Si besoin, connecter un compte réseau social (générer l'URL OAuth sécurisée)
const connection = await gliiz("/social/connect", {
method: "POST",
body: JSON.stringify({ platform: "linkedin" }),
});
console.log("Connect URL:", connection.connect_url);
// 5) Quand l'asset est disponible (via webhook ou /assets), planifier le post
await gliiz("/posts", {
method: "POST",
body: JSON.stringify({
content_item_id: "content-item-uuid",
caption: copy.copy.linkedin.caption,
platforms: ["linkedin"],
scheduled_at: "2026-09-01T09:00:00.000Z"
}),
});VIBE & Turbo
The API is not a second conversational brain: it triggers the same engines as Studio/VIBE, but without a chat thread. Use VIBE or Turbo for conversation; use the API for system integrations.
Team
A key is created by an Owner/Admin and remains bound to one project. It uses the project owner's credit pool, not the human user calling your server.
Video
Video generation exists in Studio/VIBE/Turbo. It is not yet exposed in public v1 API keys; fetch already-created videos through /assets.
| Method & path | What it does |
|---|---|
GET /api/public/v1/openapi.json | This API's OpenAPI 3.1 specification, derived from the code. No key needed: generate a client before you even have one. |
GET /api/public/v1/me | Project, full brand identity, credit cost per generation type, credit balance, and connected social accounts with their id. |
GET /api/public/v1/assets | List generated assets (flyers, copy, video), newest first. ?limit, ?before for pagination. |
GET /api/public/v1/analytics | Latest per-platform stats (followers, reach, engagement). ?period=<days>. |
POST /api/public/v1/generate/copy | Generate AI captions/hashtags for one or more platforms. |
POST /api/public/v1/generate/flyer | Generate an AI flyer/visual. Runs the same engine as Studio. |
GET/POST /api/public/v1/social/connect | List connectable platforms or generate secure OAuth authorization URL to link a social account. |
POST /api/public/v1/posts | Schedule a post from an existing asset or a media URL. |
GET /api/public/v1/posts | List the project's publications and their state. ?status, ?platform, ?limit, ?before. |
PATCH /api/public/v1/posts/:id | Reschedule a publication that has not gone out. Only the date changes; the id is kept. |
DELETE /api/public/v1/posts/:id | Cancel a publication that has not gone out yet. Refuses an already published one. |
GET/POST /api/public/v1/webhooks | List or create HMAC-signed webhook subscriptions. |
DELETE /api/public/v1/webhooks/:id | Disable a webhook without deleting its delivery history. |
POST /api/public/v1/webhooks/test | Send a webhook.test event to your active subscriptions. |
GET /api/public/v1/meVerify the key, project and creditsCall this route when your integration starts. It confirms that the key is valid, points to the right project, and still has usable credits.
| Authorization | header | Bearer gliiz_... |
| project | response | id, name and creation date for the key-scoped project. |
| credits | response | monthly_limit, used, purchased_balance, remaining. |
| connected_accounts | response | platform, name, type and active state for connected social accounts. |
{
"project": { "id": "uuid", "name": "Acme", "created_at": "2026-08-12T10:00:00Z" },
"credits": { "monthly_limit": 200, "used": 42, "purchased_balance": 25, "remaining": 183 },
"connected_accounts": [
{ "platform": "instagram", "account_name": "acme", "account_type": "business", "active": true }
]
}GET /api/public/v1/assets?limit=20&before=2026-08-12T10:00:00ZList generated assetsUse /assets to fetch visuals, videos and content already created in the project. Pagination uses next_cursor: send it back as before to request the next page.
| limit | query, 1-100 | Number of assets returned. Default: 20. |
| before | query ISO date | Time cursor returned by next_cursor. |
| asset_kind | response | image | video | flyer | copy |
| asset_url / flyer_png_url | response | Media URL to display, download or schedule. |
curl "$GLIIZ_API_BASE/assets?limit=10" \
-H "Authorization: Bearer $GLIIZ_API_KEY"GET /api/public/v1/analytics?period=30Read social analyticsReturns the latest available analytics snapshot per platform over the requested period. Values depend on permissions granted by each social network.
| period | query, 1-365 | Number of days analyzed. Default: 30. |
| followers_count | response | Known follower count at snapshot date. |
| reach | response | Available reach for the platform. |
| engagement_rate | response | Engagement rate stored by Gliiz. |
POST /api/public/v1/generate/copyGenerate captions and hashtagsThis route is synchronous: it responds directly with generated text. It automatically loads brand identity, tone, contact details and strategic hashtags from the key-scoped project.
| prompt | string, requis | Exact subject of the content to publish. |
| platforms | array | instagram | facebook | linkedin | tiktok | youtube |
| contentKind | image | video | Helps the AI avoid video wording for an image, or the reverse. |
| brandName/toneOfVoice/sector/pillars | optional | Light overrides if you call without full context; the project remains authoritative. |
{
"prompt": "Présente notre nouvelle offre premium pour PME",
"platforms": ["instagram", "linkedin"],
"contentKind": "image"
}POST /api/public/v1/generate/flyerGenerate an AI visualThis route creates a generation job. The normal response is 202 with jobId; receive completion through generation.completed, or list /assets later. Credits are checked before enqueueing.
| prompt | string, requis | Visual brief. Be concrete: subject, offer, mood, audience. |
| format | optional | square | portrait | story | landscape |
| outputQuality | optional | 2k | 4k |
| modelTier | optional | standard | premium |
| visualType | optional | typography | hybrid |
| variantCount | optional | 1 | 2 | 3 — DEFAULTS TO 2. Each variant is billed: send 1 if you only want one. |
| subjectUrls | optional | Public HTTPS reference images. |
| generationRequestId | optional | Client idempotency key to avoid duplicates. |
{
"prompt": "Flyer premium pour annoncer une offre marketing IA pour restaurants",
"format": "portrait",
"outputQuality": "2k",
"modelTier": "standard",
"visualType": "hybrid",
"variantCount": 1,
"generationRequestId": "launch-offer-2026-09-01"
}GET / POST /api/public/v1/social/connectConnect a social network or list integrationsEntry point to connect a social network account to your Gliiz project. GET lists all supported platforms with their status and already connected accounts. POST generates the secure OAuth authorization URL (with automatic continuation redirect back to Gliiz).
| GET /social/connect | query: ?platform= | Optional. Filters on a platform or lists all available integrations and active accounts. |
| POST /social/connect | body: { platform } | Required. Platform to connect: linkedin, linkedin_business, tiktok, youtube, google_ads, tiktok_ads, canva. |
| connect_url | response (POST) | Secure OAuth URL generated by Gliiz. Open it in a browser to complete account authorization. |
# 1. Générer l'URL d'autorisation OAuth pour LinkedIn
curl -X POST https://www.gliiz.com/api/public/v1/social/connect \
-H "Authorization: Bearer gliiz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"platform": "linkedin"}'
# 2. Ou lister les plateformes connectables et comptes actifs
curl https://www.gliiz.com/api/public/v1/social/connect \
-H "Authorization: Bearer gliiz_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"// Réponse / Response POST (200 OK):
{
"platform": "linkedin",
"name": "LinkedIn Personnel",
"status": "ready",
"connect_url": "https://www.gliiz.com/api/auth/linkedin?projectId=prj_123456789",
"instructions": "Ouvrez cette URL dans votre navigateur pour autoriser Gliiz. Une fois le flux OAuth terminé, votre compte sera lié automatiquement à ce projet.",
"connected_accounts_count": 0
}POST /api/public/v1/postsSchedule a postSchedules an existing asset or media URL to one or more networks. If multiple accounts for a platform are connected, send account_by_platform to select the right account.
| content_item_id | uuid | Existing Gliiz asset. Recommended after generation. |
| media_url | url | Alternative: public URL when the asset does not exist in Gliiz yet. |
| caption | string, requis | Published text. Use copy.<platform>.caption for ready-to-publish output. |
| platforms | array, requis | instagram | facebook | linkedin | tiktok | youtube |
| scheduled_at | ISO datetime | UTC date. Default: now + 30 seconds. |
| account_by_platform | object | Map platform → social_account_id when needed. |
| Idempotency-Key | header, recommended | Makes the call safely replayable. See the note below. |
{
"content_item_id": "2f67a5b0-6b0b-47fb-84f0-a077e0d2dd9e",
"caption": "Votre légende prête à publier...",
"platforms": ["instagram", "facebook"],
"scheduled_at": "2026-09-01T09:00:00.000Z",
"account_by_platform": {
"instagram": "social-account-uuid"
}
}GET / POST /api/public/v1/webhooksManage outgoing webhooksWebhooks are the simplest way to integrate Gliiz with a CRM, CMS, ERP, e-commerce backend or internal tool. Create a subscription, store the secret, verify signatures, then process events.
| GET /webhooks | list | Lists active and disabled subscriptions for the project. |
| POST /webhooks | create | Creates an HTTPS subscription and returns secret once. |
| DELETE /webhooks/:id | disable | Disables without deleting delivery history. |
| POST /webhooks/test | test | Sends webhook.test to active subscriptions. |
project_id sent in a request body is ignored in favor of the key's own project. Generation requests count against that project owner's normal plan limits and rate limits, same as using the app itself.GET /api/public/v1/generate/jobs/{jobId}Track an asynchronous generationEvery generation (visual, image, video, motion control) answers 202 with a jobId. This route returns its state at any time: the direct alternative to a webhook, with no server to expose. One endpoint for every generation type.
| status | queued | running | completed | failed | canceled | Poll while the value is queued or running. A finished generation carries its result in result. |
| result | object | null | Present only on completed: holds the produced URLs and the generation's metadata. |
| error | string | null | Set on failed. Credits reserved for a failed generation are refunded automatically. |
POST /api/public/v1/generate/videoGenerate a videoGenerates a video from a prompt, or from a starting image if you supply one. Answers 202 with a jobId to track. The credit cost depends on the model, duration and resolution requested.
POST /api/public/v1/generate/imageGenerate an imageGenerates an image from the brief. The visual's nature is READ from the brief: a photo asked for in plain words receives no headline and no contact details, a flyer carries them. Answers 202 with a jobId.
POST /api/public/v1/generate/rewriteRewrite a textRewrites an existing text in the project brand's voice. Synchronous: the response carries the rewritten text directly.
POST /api/public/v1/generate/motion-controlAnimate a characterApplies the motion of a reference video to a character supplied as an image. Answers 202 with a jobId to follow on the tracking route above.
POST /api/public/v1/assets/importImport a file into the libraryCopies a file from a URL into the project's Gliiz storage, where it becomes publishable. The file stops depending on the source URL, which may expire.
GET · POST /api/public/v1/automationsList and create automationsGET lists the project's automations and their state. POST creates one. An automation created through the API NEVER publishes on its own: it prepares, and publishing stays subject to your approval.
GET /api/public/v1/posts/{queueItemId}Track a publicationState of a scheduled publication: pending, published, or failed with its reason. The id is the one returned by POST /posts.
GET /api/public/v1/postsList publicationsEverything the project has scheduled, sent or failed to send, newest first. This is the route that recovers a lost queue_item_id: without it, an id not kept after POST /posts was unrecoverable.
| status | query | Filter: pending, processing, submitting, uncertain, published, failed, canceled. Use pending to see only what has not gone out yet. |
| platform | query | Keep a single network (instagram, linkedin, tiktok…). |
| limit · before | query | Cursor pagination: limit (default 20, max 100), then before = the previous page's next_cursor, passed back as-is. The cursor is opaque — it pairs the timestamp with the id, because a post to three networks produces three rows sharing one scheduled_at, which a timestamp-only cursor would skip. |
PATCH /api/public/v1/posts/{queueItemId}Reschedule a publicationChanges the time of an upcoming send in a single call: { "scheduled_at": "2026-09-08T09:00:00Z" }. Without this route you had to cancel then recreate — two calls, the second of which can fail, leaving you with NOTHING scheduled after merely wanting to move a time. The queue_item_id is kept, so your references stay valid.
| scheduled_at | ISO, required | New UTC instant. Only the date changes: text and visual live on the asset, shared with the other platforms of the same publication — changing them here would change what those publish too. |
| 409 | not_pending · already_published | The send already started or happened. A clear refusal beats announcing a reschedule that would not have taken. |
DELETE /api/public/v1/posts/{queueItemId}Cancel a scheduled publicationCancels a send that has not happened yet. Idempotent: cancelling an already cancelled publication answers 200, so a client retrying after a timeout does not have to tell the two cases apart.
| 409 | already_published | The publication is already live. Removing a published post from a brand's account is irreversible: that is done in the app, never through the API. |
| 409 | too_late | The send has already started on the social network's side. Nothing is falsely confirmed: a clear refusal beats an uncertain cancellation. |
| 200 | outcome | canceled (just cancelled) or already_canceled (it already was). previous_status gives the prior state. |
When you create a webhook, Gliiz returns a whsec_… secret shown once. Every POST delivery includes X-Gliiz-Timestamp and X-Gliiz-Signature. Verify the HMAC-SHA256 signature over `${timestamp}.${body}` before processing the event.
curl "$GLIIZ_API_BASE/webhooks" \
-X POST \
-H "Authorization: Bearer $GLIIZ_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Production backend",
"url": "https://example.com/webhooks/gliiz",
"events": ["generation.completed", "generation.failed", "post.scheduled"]
}'{
"webhook": {
"id": "webhook-subscription-uuid",
"name": "Production backend",
"url": "https://example.com/webhooks/gliiz",
"events": ["generation.completed", "generation.failed", "post.scheduled"],
"created_at": "2026-08-12T10:00:00.000Z",
"secret": "whsec_copy_this_once"
}
}import crypto from "crypto";
const timestamp = request.headers["x-gliiz-timestamp"];
const signature = request.headers["x-gliiz-signature"];
const expected = "sha256=" + crypto
.createHmac("sha256", process.env.GLIIZ_WEBHOOK_SECRET!)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
throw new Error("Invalid Gliiz webhook signature");
}{
"id": "evt_01J...",
"event": "generation.completed",
"created_at": "2026-08-12T10:02:14.000Z",
"project_id": "project-uuid",
"data": {
"api_key_id": "api-key-uuid",
"job_id": "generation-job-uuid",
"workflow": "flyer.v1",
"status": "completed",
"result": {
"contentItemId": "content-item-uuid",
"imageUrl": "https://..."
}
}
}Available events: generation.copy.completed, generation.flyer.queued, generation.completed, generation.failed, post.scheduled, post.rescheduled, post.published, post.failed, post.canceled, webhook.test.
| generation.copy.completed | sync | A caption generation completed. |
| generation.flyer.queued | async | A visual generation job was accepted into the queue. |
| generation.completed | async | A generation job finished successfully. |
| generation.failed | async | A job failed or was canceled. |
| post.scheduled | sync | One or more posts were scheduled. |
| post.rescheduled | sync | A scheduled publication's time was changed. |
| post.published | async | A publication actually went out on the network. Carries permalink and external_post_id. |
| post.failed | async | A publication failed for good, once retries were exhausted. Intermediate failures followed by a retry emit nothing. |
| post.canceled | sync | A scheduled publication was canceled before it went out. |
| webhook.test | manual | Event sent by /webhooks/test. |
2xx quickly after signature verification. If processing is slow, put the event in your own queue and respond immediately. Gliiz logs the HTTP status, response snippet and delivery errors.A failed delivery is REPLAYED: six attempts in all, at 1 min, 5 min, 30 min, 2 h then 6 h. A restart on your side, a deploy, a latency spike — the event still reaches you. The replay sends exactly the same payload, so the same event id: deduplicate on it and a replay is recognised instead of counted twice. Only the signature is recomputed, with a fresh timestamp.
API errors are deliberately simple: an HTTP status, a readable error field, and sometimes details/code for validation. Handle at least the statuses below.
| 400 | Bad Request | Invalid JSON payload or missing field. |
| 401 | Unauthorized | Missing, malformed, revoked or unknown key. |
| 402 | Payment Required | Not enough credits to start the generation. |
| 403 | Forbidden | Plan without API access, plan quota, or unauthorized action. |
| 404 | Not Found | Project, asset or webhook not found in the key scope. |
| 422 | Unprocessable Entity | Valid JSON but invalid business parameters. |
| 429 | Rate Limited | Too many requests or too many active jobs. |
| 500/503 | Server Error | Server incident or AI provider temporarily unavailable. |
{
"error": "Invalid post payload",
"code": "invalid_request",
"request_id": "6f1c2b7e-9a4d-4d2f-8f0a-1b7c3e5d9a02",
"details": {
"fieldErrors": {
"platforms": ["Array must contain at least 1 element(s)"]
}
}
}Branch your code on code, never on error. The code field is present on EVERY public API error and its value is stable; error is a human-readable message that may be reworded, and is not guaranteed to be in any given language. request_id identifies the response in our logs: quote it to support rather than describing the error.
| invalid_request | 400 | Body or parameter rejected. |
| unauthenticated | 401 | Missing, malformed, revoked or unknown key. |
| insufficient_credits | 402 | Not enough credits for this generation. |
| forbidden | 403 | Plan or role does not allow this action. |
| not_found | 404 | Resource missing, or outside the key's scope. |
| conflict | 409 | Incompatible state — see also already_published and too_late on cancellation. |
| unprocessable_entity | 422 | Valid JSON, rejected by a business rule. |
| rate_limited | 429 | Limit reached. Read Retry-After before retrying. |
| server_error · service_unavailable | 500 · 503 | Incident on our side. Retryable. |
Some routes are more specific: already_published and too_late on DELETE /posts/:id, invalid_idempotency_key on POST /posts. A few legacy codes are uppercase (PROJECT_REQUIRED, DUPLICATE_REQUEST): they are kept verbatim, precisely so integrations already reading them keep working.
Your quotas travel on EVERY response, not just on the 429 that refuses — so you never have to hit the wall to find out where it is. Two limits stack, per key: a per-minute rate, and a daily volume resetting at midnight UTC.
| X-RateLimit-Limit | X-RateLimit-Remaining | This key's per-minute rate, and what is left of it. |
| X-RateLimit-Limit-Daily | X-RateLimit-Remaining-Daily | Today's volume and remaining balance. Absent on an unlimited-volume plan. |
| X-RateLimit-Reset-Daily | Unix timestamp | Next midnight UTC — the exact moment today's volume resets. |
| Retry-After | 429 | How many seconds to wait. The value tells the two limits apart: a minute for the rate, the real wait until midnight UTC for the daily volume. |
DELETE /posts/:id deliberately refuses.Platforms & Networks#
What you can do on each connected social network (publishing, comment replies, and DM replies), so you know what to expect before connecting an account.
| Platform | Publishing | Comment auto-reply | DM auto-reply |
|---|---|---|---|
| ⏳ Soon | ⏳ Soon | ⏳ Soon Messenger | |
| ⏳ Soon | ⏳ Soon | ⏳ Soon DM | |
| TikTok | ✅ Publishing | ❌ | ❌ |
| ✅ | ⚠️ Limited | ❌ | |
| YouTube | ✅ Video only | ❌ | ❌ |
| N/A | N/A | ✅ |
Capabilities above depend on the permissions each platform grants Gliiz at connection time and can change if a platform updates its policies. If a feature you expect is missing on a connected account, try reconnecting it from Settings → Accounts.
Claude, ChatGPT & Gemini (MCP)#
Generate, import and publish Gliiz content directly from your own Claude, ChatGPT or Gemini, without opening the app. One server (MCP, the standard protocol for both) serves both clients.
402. Two ways to connect: authorising from your assistant (open to everyone), or the v1 API key above (Starter and up, or a free account holding a purchased balance). One key = one project: the assistant never acts outside the project it is bound to. Throughput stays capped by plan (table below).Limits by plan, Free included. Beyond these, every call (Claude, ChatGPT or Gemini) gets a 429 until the window resets — remaining counters travel on every response, see the X-RateLimit-* headers above:
| Plan | Max keys | Per minute | Per day |
|---|---|---|---|
| Free | 1 | 10 | 100 |
| Starter | 1 | 20 | 300 |
| Pro | 3 | 60 | 3 000 |
| Agency | 7 | 120 | 8 000 |
| Enterprise | 20 | 240 | Unlimited |
The two columns don't measure the same thing: the per-minute limit caps a burst, the per-day limit caps sustained volume across the whole day. A Starter account sustaining 20/min without a break would exhaust its 300 requests in 15 minutes, then wait until the next day. They are not two ways of saying the same limit.
Shared by Claude and ChatGPT, you only create it once. Account Settings → API → Create a key. The full key (prefix gliiz_…) is shown only at that exact moment. Copy it right away: it will never be shown in full again (only an 8-character prefix stays visible, to recognize it in the list). If you lose it, revoke it and create a new one: revoking one key doesn't affect the others.
claude_desktop_config.json by hand, Claude Desktop only reads local servers there and ignores, with an error, any remote server placed in it.From Claude Desktop or claude.ai, the URL to paste into "Add custom connector":
https://www.gliiz.com/api/mcp/claudeClaude then opens a Gliiz page: sign in, pick the project to authorize, and you are done. No API key is involved in this path.
In a terminal, from any folder:
claude mcp add --transport http gliiz https://www.gliiz.com/api/mcp/claude \
--header "Authorization: Bearer gliiz_YOUR_API_KEY" \
--scope user--scope usermakes the connector available from any folder, not just the one you added it from, recommended for everyday use. Don't have Claude Code installed? The official command (macOS/Linux):
curl -fsSL https://claude.ai/install.sh | bashOnce registered, day-to-day use is no longer a sequence of commands: just type claude in a terminal, which opens a real conversation, and describe what you want in plain language (see step 3 below). No extra install, no restart needed beyond the command itself.
Video Tutorial: Connect Gliiz MCP to Claude Code & Claude Desktop
Five screens, in this exact order:
| 1 | Settings → Connectors → Advanced | Turn on "Developer mode". |
| 2 | Connectors → Add | "Add custom connector". |
| 3 | Name | Gliiz |
| 4 | Authentication | Pick OAuth. ChatGPT opens the Gliiz screen: sign in, pick the project, confirm. |
| 5 | Create | The connector appears in the list, ready to enable inside a conversation. |
Server URL (the "URL" field, screen 3), copy-paste directly:
https://www.gliiz.com/api/mcp/chatgptAuthentication (screen 4): pick "API key", then paste your key from step 1 into the field, no Bearer prefix, no space before or after:
gliiz_YOUR_API_KEYInside a conversation, open the tools picker (+ icon) and check "Gliiz". Activation is per conversation: a conversation already open before you added the connector won't see it retroactively, you need to open a new one or enable it manually in that same one.
Video Tutorial: Connect Gliiz MCP connector to ChatGPT in 2 minutes
Gemini has its own MCP surface, separate from Claude's and ChatGPT's. It serves the same tool set as ChatGPT — since Gemini generates images natively, gliiz_generate_flyer is not exposed to it: it imports what it created through gliiz_import_asset.
The MCP server URL to declare in Gemini:
https://www.gliiz.com/api/mcp/geminiIn a Gemini client that reads an MCP configuration file, declare the server like this. The key comes from step 1 above:
{
"mcpServers": {
"gliiz": {
"url": "https://www.gliiz.com/api/mcp/gemini",
"headers": {
"Authorization": "Bearer gliiz_VOTRE_CLE_API"
}
}
}
}To check that the key and URL answer, before even configuring the client:
curl -X POST https://www.gliiz.com/api/mcp/gemini \
-H "Authorization: Bearer gliiz_VOTRE_CLE_API" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'No special command to learn. Once the connector is enabled, you describe what you want in plain language, and the assistant decides ON ITS OWN whether to call a Gliiz tool, exactly as it would decide to use a web search if it needed one. You never need to write "use the Gliiz MCP" or name a tool:
| You write | The assistant calls | |
| "Write me an Instagram caption for our product launch" | gliiz_generate_copy | |
| "What are my stats for the last 30 days?" | gliiz_get_analytics | |
| "Here's an image I just generated, add it to my Gliiz library" | gliiz_import_asset |
For best results: give useful context in your sentence (target platform, desired tone, which project if you have several) rather than letting the assistant guess. If it's unsure between several tools or projects, it will ask before acting, it never silently improvises a publication or a credit spend.
Ask a question that forces the assistant to call a read-only tool, valid for both Claude and ChatGPT. No credits spent, no risk:
What's the AI credit balance on my Gliiz account, and which social accounts are connected?Expected behavior: the assistant announces it's calling a tool ("Gliiz", gliiz_get_account), then answers with your real balance and real accounts, the same numbers as Account Settings → API in the app. If it answers without ever mentioning a tool, or with an authentication error, redo step 1 (key mispasted, stray space, or a revoked key) then step 2/2-alt (restart missed on Claude, connector not checked in THIS conversation on ChatGPT, or plan still Free/Starter).
Claude gets the full creative studio (it has no native image or video generation). ChatGPT already generates images: it gets gliiz_import_asset instead, to bring what it just produced into your Gliiz library.
| Tool | Claude | ChatGPT | Gemini | What it does |
|---|---|---|---|---|
| gliiz_get_account | ✅ | ✅ | ✅ | Credit balance, connected social accounts. |
| gliiz_list_assets | ✅ | ✅ | ✅ | Lists the content library. |
| gliiz_get_analytics | ✅ | ✅ | ✅ | Per-platform statistics. |
| gliiz_generate_copy | ✅ | ✅ | ✅ | Brand copy (caption, hashtags). |
| gliiz_generate_flyer | ✅ | ❌ | ❌ | Visual via Gliiz's creative engine (ChatGPT already generates natively). |
| gliiz_generate_video | ✅ | ✅ | ✅ | Short video, always asynchronous: follow up with gliiz_check_generation_status. |
| gliiz_check_generation_status | ✅ | ✅ | ✅ | Progress of an in-flight video/visual generation. |
| gliiz_import_asset | ✅ | ✅ | ✅ | Drops a visual already generated (e.g. by ChatGPT) into the Gliiz library. |
| gliiz_publish_post | ✅ | ✅ | ✅ | Schedules a post, never immediate (see below). |
| gliiz_list_scheduled_posts | ✅ | ✅ | ✅ | Lists what is scheduled, sent or failed — and recovers a publication's id. |
| gliiz_check_publication_status | ✅ | ✅ | ✅ | State of one publication: pending, published (with its permalink), or failed. |
| gliiz_reschedule_publication | ✅ | ✅ | ✅ | Moves a post that has not gone out — "push it to tomorrow 9am". Only the time changes. |
| gliiz_cancel_publication | ✅ | ✅ | ✅ | Cancels a publication that has not gone out. An already live post is taken down in the app, never here. |
| gliiz_connect_social_account | ✅ | ✅ | ✅ | Secure link to connect an accepted and active social network (LinkedIn, TikTok, YouTube, etc.) or list networks. |
| gliiz_animate_character | ✅ | ✅ | ✅ | Transfers movement from a reference video onto a character/product (Kling motion control). |
| gliiz_rewrite_text | ✅ | ✅ | ✅ | Rewrites and adapts copy for a target platform and tone. |
| gliiz_list_automations | ✅ | ✅ | ✅ | Lists the project's automation flows and cadence. |
| gliiz_create_automation | ✅ | ✅ | ✅ | Creates a publishing automation (requires human approval). |
Real example, with gliiz_publish_post (the only tool marked destructiveHint): you write
Post to Instagram and LinkedIn: "We're hiring! Designer role open, link in bio."The assistant never publishes right away. It replies by proposing a scheduling time (at least 1 minute out, often picking a sensible slot itself, or asking you), waits for your confirmation in the conversation, and only then calls the tool. What you'll actually see: the post sits as pending_review in your Gliiz library until the scheduled time, visible from the app if you want to cancel it before it goes out, exactly like a post scheduled from the interface itself. For a generation (visual or video), expect a two-step reply: the assistant announces the start and, for video, must call gliiz_check_generation_status back itself a moment later, it never sits silently blocked waiting for the result.
gliiz_cancel_publication. An already live post, on the other hand, is only taken down in the app. Neither ad campaign creation nor deleting an account, project or key is reachable through this channel.Connecting a social network account from Claude, ChatGPT or Gemini
You can ask directly in the chat: "Connect my TikTok account", "Link my LinkedIn personal profile", or "Connect my YouTube channel". The assistant calls gliiz_connect_social_account and provides a direct, secure authorization link for the official provider. Once confirmed in your browser, the account is immediately linked to your Gliiz project.
Was this documentation helpful?
