Public API

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.

Status: stable v1. The routes below cover reads, generation, scheduling, and outgoing webhooks. They live at a path today (/api/public/v1/…) and will also be reachable from api.gliiz.com once that subdomain is wired up: same routes, same keys.
5-Minute API Quickstart#
01
Create the key

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.

02
Test /me

Call /me to confirm the project, remaining AI credits and connected social accounts. This is your smoke test.

03
Connect a webhook

Create an HTTPS webhook before long generations: finished jobs arrive without aggressive polling.

04
Generate, then schedule

Generate copy/flyer, retrieve the asset from /assets or a webhook, then schedule it with /posts.

bash
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"
Authentication#

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:

bash
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.

ts
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;
}
Security baseline. An API key acts as server-side access to the project. Store it in a secret manager or environment variable, rotate it when a teammate leaves, and use signed webhooks instead of exposing the key to an end-user client.
Integration Recipes#

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.

ts
// 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.

Route Reference#
Method & pathWhat it does
GET /api/public/v1/openapi.jsonThis 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/meProject, full brand identity, credit cost per generation type, credit balance, and connected social accounts with their id.
GET /api/public/v1/assetsList generated assets (flyers, copy, video), newest first. ?limit, ?before for pagination.
GET /api/public/v1/analyticsLatest per-platform stats (followers, reach, engagement). ?period=<days>.
POST /api/public/v1/generate/copyGenerate AI captions/hashtags for one or more platforms.
POST /api/public/v1/generate/flyerGenerate an AI flyer/visual. Runs the same engine as Studio.
GET/POST /api/public/v1/social/connectList connectable platforms or generate secure OAuth authorization URL to link a social account.
POST /api/public/v1/postsSchedule a post from an existing asset or a media URL.
GET /api/public/v1/postsList the project's publications and their state. ?status, ?platform, ?limit, ?before.
PATCH /api/public/v1/posts/:idReschedule a publication that has not gone out. Only the date changes; the id is kept.
DELETE /api/public/v1/posts/:idCancel a publication that has not gone out yet. Refuses an already published one.
GET/POST /api/public/v1/webhooksList or create HMAC-signed webhook subscriptions.
DELETE /api/public/v1/webhooks/:idDisable a webhook without deleting its delivery history.
POST /api/public/v1/webhooks/testSend a webhook.test event to your active subscriptions.
Rather than copying these routes by hand, start from the specification: GET /api/public/v1/openapi.json returns an OpenAPI 3.1 document, open without a key, ready to feed a client generator, Postman or Insomnia. It is DERIVED from the code — request bodies come from the very schemas that validate your real calls, and a test refuses any route added without being described in it. It cannot quietly go stale, which is the usual failing of such documents.
GETGET /api/public/v1/meVerify the key, project and credits

Call this route when your integration starts. It confirms that the key is valid, points to the right project, and still has usable credits.

AuthorizationheaderBearer gliiz_...
projectresponseid, name and creation date for the key-scoped project.
creditsresponsemonthly_limit, used, purchased_balance, remaining.
connected_accountsresponseplatform, name, type and active state for connected social accounts.
json
{
  "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 }
  ]
}
GETGET /api/public/v1/assets?limit=20&before=2026-08-12T10:00:00ZList generated assets

Use /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.

limitquery, 1-100Number of assets returned. Default: 20.
beforequery ISO dateTime cursor returned by next_cursor.
asset_kindresponseimage | video | flyer | copy
asset_url / flyer_png_urlresponseMedia URL to display, download or schedule.
bash
curl "$GLIIZ_API_BASE/assets?limit=10" \
  -H "Authorization: Bearer $GLIIZ_API_KEY"
GETGET /api/public/v1/analytics?period=30Read social analytics

Returns the latest available analytics snapshot per platform over the requested period. Values depend on permissions granted by each social network.

periodquery, 1-365Number of days analyzed. Default: 30.
followers_countresponseKnown follower count at snapshot date.
reachresponseAvailable reach for the platform.
engagement_rateresponseEngagement rate stored by Gliiz.
POSTPOST /api/public/v1/generate/copyGenerate captions and hashtags

This 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.

promptstring, requisExact subject of the content to publish.
platformsarrayinstagram | facebook | linkedin | tiktok | youtube
contentKindimage | videoHelps the AI avoid video wording for an image, or the reverse.
brandName/toneOfVoice/sector/pillarsoptionalLight overrides if you call without full context; the project remains authoritative.
json
{
  "prompt": "Présente notre nouvelle offre premium pour PME",
  "platforms": ["instagram", "linkedin"],
  "contentKind": "image"
}
POSTPOST /api/public/v1/generate/flyerGenerate an AI visual

This 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.

promptstring, requisVisual brief. Be concrete: subject, offer, mood, audience.
formatoptionalsquare | portrait | story | landscape
outputQualityoptional2k | 4k
modelTieroptionalstandard | premium
visualTypeoptionaltypography | hybrid
variantCountoptional1 | 2 | 3 — DEFAULTS TO 2. Each variant is billed: send 1 if you only want one.
subjectUrlsoptionalPublic HTTPS reference images.
generationRequestIdoptionalClient idempotency key to avoid duplicates.
json
{
  "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 / POSTGET / POST /api/public/v1/social/connectConnect a social network or list integrations

Entry 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/connectquery: ?platform=Optional. Filters on a platform or lists all available integrations and active accounts.
POST /social/connectbody: { platform }Required. Platform to connect: linkedin, linkedin_business, tiktok, youtube, google_ads, tiktok_ads, canva.
connect_urlresponse (POST)Secure OAuth URL generated by Gliiz. Open it in a browser to complete account authorization.
bash
# 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"
json
// 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
}
POSTPOST /api/public/v1/postsSchedule a post

Schedules 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_iduuidExisting Gliiz asset. Recommended after generation.
media_urlurlAlternative: public URL when the asset does not exist in Gliiz yet.
captionstring, requisPublished text. Use copy.<platform>.caption for ready-to-publish output.
platformsarray, requisinstagram | facebook | linkedin | tiktok | youtube
scheduled_atISO datetimeUTC date. Default: now + 30 seconds.
account_by_platformobjectMap platform → social_account_id when needed.
Idempotency-Keyheader, recommendedMakes the call safely replayable. See the note below.
json
{
  "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"
  }
}
Send an Idempotency-Key header on this call. It is the API's only write that commits a real public account: if the response is lost in transit and your client retries, the same post would go out twice. With a key (any stable string of at least 8 characters, unique to THIS publication — a UUID on your side is fine), the replay is recognised: the response drops from 201 to 200, carries deduplicated: true, returns the same queue_item_id values, and nothing is scheduled a second time. Without a key the call still works — but a retry really does schedule a duplicate. MCP clients derive one automatically from the requested content and time.
GET / POSTGET / POST /api/public/v1/webhooksManage outgoing webhooks

Webhooks 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 /webhookslistLists active and disabled subscriptions for the project.
POST /webhookscreateCreates an HTTPS subscription and returns secret once.
DELETE /webhooks/:iddisableDisables without deleting delivery history.
POST /webhooks/testtestSends webhook.test to active subscriptions.
Project scoping. A key always acts on the one project it was created for : any 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.
GETGET /api/public/v1/generate/jobs/{jobId}Track an asynchronous generation

Every 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.

statusqueued | running | completed | failed | canceledPoll while the value is queued or running. A finished generation carries its result in result.
resultobject | nullPresent only on completed: holds the produced URLs and the generation's metadata.
errorstring | nullSet on failed. Credits reserved for a failed generation are refunded automatically.
POSTPOST /api/public/v1/generate/videoGenerate a video

Generates 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.

POSTPOST /api/public/v1/generate/imageGenerate an image

Generates 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.

POSTPOST /api/public/v1/generate/rewriteRewrite a text

Rewrites an existing text in the project brand's voice. Synchronous: the response carries the rewritten text directly.

POSTPOST /api/public/v1/generate/motion-controlAnimate a character

Applies 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.

POSTPOST /api/public/v1/assets/importImport a file into the library

Copies 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 · POSTGET · POST /api/public/v1/automationsList and create automations

GET 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.

GETGET /api/public/v1/posts/{queueItemId}Track a publication

State of a scheduled publication: pending, published, or failed with its reason. The id is the one returned by POST /posts.

GETGET /api/public/v1/postsList publications

Everything 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.

statusqueryFilter: pending, processing, submitting, uncertain, published, failed, canceled. Use pending to see only what has not gone out yet.
platformqueryKeep a single network (instagram, linkedin, tiktok…).
limit · beforequeryCursor 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.
PATCHPATCH /api/public/v1/posts/{queueItemId}Reschedule a publication

Changes 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_atISO, requiredNew 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.
409not_pending · already_publishedThe send already started or happened. A clear refusal beats announcing a reschedule that would not have taken.
DELETEDELETE /api/public/v1/posts/{queueItemId}Cancel a scheduled publication

Cancels 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.

409already_publishedThe 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.
409too_lateThe send has already started on the social network's side. Nothing is falsely confirmed: a clear refusal beats an uncertain cancellation.
200outcomecanceled (just cancelled) or already_canceled (it already was). previous_status gives the prior state.
Signed Webhooks#

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.

bash
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"]
  }'
json
{
  "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"
  }
}
ts
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");
}
json
{
  "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.completedsyncA caption generation completed.
generation.flyer.queuedasyncA visual generation job was accepted into the queue.
generation.completedasyncA generation job finished successfully.
generation.failedasyncA job failed or was canceled.
post.scheduledsyncOne or more posts were scheduled.
post.rescheduledsyncA scheduled publication's time was changed.
post.publishedasyncA publication actually went out on the network. Carries permalink and external_post_id.
post.failedasyncA publication failed for good, once retries were exhausted. Intermediate failures followed by a retry emit nothing.
post.canceledsyncA scheduled publication was canceled before it went out.
webhook.testmanualEvent sent by /webhooks/test.
Return 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.

An endpoint that stops answering is eventually disabled — after twenty consecutive events never delivered, which is no longer an incident but a dead address. Never silently: GET /webhooks returns disabled_at and disabled_reason, along with consecutive_failures, last_success_at and last_failure_at. Look there first if your events went quiet.
Errors, Limits & Collaboration#

API errors are deliberately simple: an HTTP status, a readable error field, and sometimes details/code for validation. Handle at least the statuses below.

400Bad RequestInvalid JSON payload or missing field.
401UnauthorizedMissing, malformed, revoked or unknown key.
402Payment RequiredNot enough credits to start the generation.
403ForbiddenPlan without API access, plan quota, or unauthorized action.
404Not FoundProject, asset or webhook not found in the key scope.
422Unprocessable EntityValid JSON but invalid business parameters.
429Rate LimitedToo many requests or too many active jobs.
500/503Server ErrorServer incident or AI provider temporarily unavailable.
json
{
  "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_request400Body or parameter rejected.
unauthenticated401Missing, malformed, revoked or unknown key.
insufficient_credits402Not enough credits for this generation.
forbidden403Plan or role does not allow this action.
not_found404Resource missing, or outside the key's scope.
conflict409Incompatible state — see also already_published and too_late on cancellation.
unprocessable_entity422Valid JSON, rejected by a business rule.
rate_limited429Limit reached. Read Retry-After before retrying.
server_error · service_unavailable500 · 503Incident 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-LimitX-RateLimit-RemainingThis key's per-minute rate, and what is left of it.
X-RateLimit-Limit-DailyX-RateLimit-Remaining-DailyToday's volume and remaining balance. Absent on an unlimited-volume plan.
X-RateLimit-Reset-DailyUnix timestampNext midnight UTC — the exact moment today's volume resets.
Retry-After429How 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.
Team work. API keys are created at project level by an Owner or Admin. They do not replace human roles: invitations, roles, editor/publish/inbox scopes and revocations remain managed in the app so external scripts cannot silently rewrite the team.
Public v1 surface. Public v1 covers reads, assets, analytics, copy, visuals, video, motion control, automations, webhooks, and a publication's full lifecycle — schedule, list, track, reschedule, cancel. Still outside the API and reserved to the app: team management, editing or deleting an existing automation, ad campaigns, and taking down an already publishedpost on a network — an irreversible act on a brand's account, which DELETE /posts/:id deliberately refuses.
Social Networks

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.

PlatformPublishingComment auto-replyDM auto-reply
Facebook⏳ Soon⏳ Soon⏳ Soon Messenger
Instagram⏳ Soon⏳ Soon⏳ Soon DM
TikTok✅ Publishing
LinkedIn⚠️ Limited
YouTube✅ Video only
WhatsAppN/AN/A
Using Gliiz from Claude, ChatGPT or Gemini? See the "Claude & ChatGPT (MCP)" section below: generation, import and scheduled publishing, without leaving your assistant. For other integrations (Slack, Notion, dedicated business sync), reach out from the Contact page. The v1 routes above are the stable contract for your external systems.
Good to Know#

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.

Conversational AI

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.

Available on every plan, Free included. MCP is not reserved for a paid tier: what is billed is CONSUMPTION. Every generation launched from Claude, ChatGPT or Gemini debits the same credits as one made inside the app — a Free account therefore burns its monthly credits through this channel just as through the studio, then gets a 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:

PlanMax keysPer minutePer day
Free110100
Starter120300
Pro3603 000
Agency71208 000
Enterprise20240Unlimited

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.

Step 1: get your API key#

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 — connect#
Two paths, depending on which Claude app you use.From Claude Desktop or claude.ai (browser), go to "Settings → Connectors → Add custom connector" and simply paste the server URL: there is no API key to copy, Gliiz shows you its own sign-in screen and then asks which project to authorize. From Claude Code (terminal), use the command below, with an API key. One detail that wastes time: don't try editing 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":

text
https://www.gliiz.com/api/mcp/claude

Claude 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:

bash
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):

bash
curl -fsSL https://claude.ai/install.sh | bash

Once 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

YouTube
ChatGPT — connect#
No API key is needed here. ChatGPT connects over OAuth: when you add the connector, Gliiz shows its own sign-in screen and then asks which project to authorize. You need a Starter, Pro, Agency or Enterprise account (a Free account cannot authorize a connection). How many connections can be active at once depends on the plan, just like API keys.

Five screens, in this exact order:

1Settings → Connectors → AdvancedTurn on "Developer mode".
2Connectors → Add"Add custom connector".
3NameGliiz
4AuthenticationPick OAuth. ChatGPT opens the Gliiz screen: sign in, pick the project, confirm.
5CreateThe connector appears in the list, ready to enable inside a conversation.

Server URL (the "URL" field, screen 3), copy-paste directly:

text
https://www.gliiz.com/api/mcp/chatgpt

Authentication (screen 4): pick "API key", then paste your key from step 1 into the field, no Bearer prefix, no space before or after:

text
gliiz_YOUR_API_KEY

Inside 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

YouTube
Gemini — connect#

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:

text
https://www.gliiz.com/api/mcp/gemini

In a Gemini client that reads an MCP configuration file, declare the server like this. The key comes from step 1 above:

json
{
  "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:

bash
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"}'
Two authentication modes, your choice. An API key (Bearer gliiz_…) is enough and acts on the project that created it. A client that speaks OAuth 2.1 can instead follow automatic discovery: the protected resource is published at /.well-known/oauth-protected-resource/api/mcp/gemini, and the resulting token is bound to THAT resource — a token issued for Claude or ChatGPT is rejected here, and vice versa.
Step 2: how to talk to it#

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 writeThe 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.

Step 3: verify it works#

Ask a question that forces the assistant to call a read-only tool, valid for both Claude and ChatGPT. No credits spent, no risk:

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

Step 4: what each platform can do#

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.

ToolClaudeChatGPTGeminiWhat it does
gliiz_get_accountCredit balance, connected social accounts.
gliiz_list_assetsLists the content library.
gliiz_get_analyticsPer-platform statistics.
gliiz_generate_copyBrand copy (caption, hashtags).
gliiz_generate_flyerVisual via Gliiz's creative engine (ChatGPT already generates natively).
gliiz_generate_videoShort video, always asynchronous: follow up with gliiz_check_generation_status.
gliiz_check_generation_statusProgress of an in-flight video/visual generation.
gliiz_import_assetDrops a visual already generated (e.g. by ChatGPT) into the Gliiz library.
gliiz_publish_postSchedules a post, never immediate (see below).
gliiz_list_scheduled_postsLists what is scheduled, sent or failed — and recovers a publication's id.
gliiz_check_publication_statusState of one publication: pending, published (with its permalink), or failed.
gliiz_reschedule_publicationMoves a post that has not gone out — "push it to tomorrow 9am". Only the time changes.
gliiz_cancel_publicationCancels a publication that has not gone out. An already live post is taken down in the app, never here.
gliiz_connect_social_accountSecure link to connect an accepted and active social network (LinkedIn, TikTok, YouTube, etc.) or list networks.
gliiz_animate_characterTransfers movement from a reference video onto a character/product (Kling motion control).
gliiz_rewrite_textRewrites and adapts copy for a target platform and tone.
gliiz_list_automationsLists the project's automation flows and cadence.
gliiz_create_automationCreates a publishing automation (requires human approval).
Step 5: what to expect in practice#

Real example, with gliiz_publish_post (the only tool marked destructiveHint): you write

text
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.

No post is ever immediate. gliiz_publish_post always schedules at least 1 minute ahead, leaving a cancellation window before a post becomes visible under your brand. That window is usable from the conversation itself: "cancel tonight's post" is enough, and the assistant calls 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.

Documentation Feedback#

Was this documentation helpful?