API and MCP
Once you have an access token, you can control gibeon.io entirely from code. The REST API lives at www.gibeon.io/v1. For AI tools that speak MCP (Claude Desktop, Claude Code, Cursor), the same set of actions is available at www.gibeon.io/mcp. No local install needed.
Do you only want to connect Claude, without code? Then follow Connect Claude to gibeon.io.
A working example from token to publish is in the quickstarts for Python, Node.js and Go.
What you can do with it
With one access token you work directly on your tenant:
- List screens, rename them, assign other content, trigger a publish
- Create playlists, add or remove items, change the order
- Manage sequences and schedules
- Upload and retrieve assets
The full interactive reference is at www.gibeon.io/en/dev/reference. The raw OpenAPI 3.1 spec is available at www.gibeon.io/v1/openapi.yaml. Suitable for code generation or for importing into Postman, Bruno or Insomnia.
Getting an access token
Auth runs through OAuth 2.1, Authorization Code + PKCE, issued by Supabase. There are no static keys to copy anymore.
- Your client registers itself with the authorization server through Dynamic Client Registration (RFC 7591)
- The client goes through the Authorization Code + PKCE flow
- You approve access on the gibeon.io consent screen and choose the tenant the agent may work on (scope
gibeon:api) - Your client receives a short-lived access token plus a refresh token
The full flow with every endpoint is at www.gibeon.io/auth.md. For headless or cron use, keep the refresh token and exchange it for new access tokens without having to approve again (set up once by a human).
You revoke access from the CMS under Settings → Connected apps, or through the revocation endpoint of the authorization server. Revoking takes effect immediately.
Using REST
Send the access token in the Authorization header as a Bearer token.
# List your screenscurl https://www.gibeon.io/v1/players \ -H "Authorization: Bearer <access_token>"
# Put a screen on another playlist and publish itcurl -X PATCH https://www.gibeon.io/v1/players/<player_id> \ -H "Authorization: Bearer <access_token>" \ -H "Content-Type: application/json" \ -d '{ "playlist_id": "<playlist_id>" }'
curl -X POST https://www.gibeon.io/v1/players/<player_id>/publish \ -H "Authorization: Bearer <access_token>"Works from any language that speaks HTTPS: bash, Node, Python, Go, n8n, Zapier, Make.
Using MCP: hosted (recommended)
Paste this config into the MCP settings of your AI tool. The client authorizes itself through OAuth on the first connection: it gets a 401 with a WWW-Authenticate pointer, fetches the protected-resource metadata, registers itself (DCR) and goes through the OAuth flow. You approve the consent screen once. So there is no token in the config.
{ "mcpServers": { "gibeon": { "url": "https://www.gibeon.io/mcp" } }}Config location per tool:
- Claude Desktop:
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) or the equivalent on Windows/Linux - Claude Code:
.mcp.jsonin your project, or the global config viaclaude mcp - Cursor:
~/.cursor/mcp.json
After you restart the tool, 14 gibeon.io tools appear (list_players, update_player, publish_players, create_player, create_playlist, add_playlist_item, reorder_playlist_items, …). The AI can call them directly.
Using MCP: npm package (deprecated)
There used to be a self-hosted stdio variant (@gibeon/mcp-server), but it has been retired (deprecated): it used the removed gib_live_ keys. Use the hosted MCP above, which handles authorization itself on the first connection.
Limits and good behavior
- 60 requests per minute per token. Above the limit the API returns 429 with a
Retry-Afterheader in seconds. - Tokens are tenant-scoped. A token can never look outside the approved tenant, not even for a superadmin account.
- Publishes are free in terms of rate limit and cost. You may trigger a publish after every change. A screen with an active connection gets a signal right away and loads the new version within a few seconds; a playlist only switches at the next item. If only one screen needs to change, publish just that screen: publishing all screens restarts playback on every zone and sequence screen.
- Uploading assets takes two steps: first
POST /v1/assetswith metadata (you get an upload URL back), thenPUTthe bytes to that URL. Max 100 MB per upload.
Common errors
401 unauthorized, even though I just authorized
Check that the header is Authorization: Bearer <access_token>. No Bearer: with a colon, no quotes around the token. An expired token gives the same 401: exchange your refresh token for a new access token. Revoked access also gives 401.
MCP tool shows no gibeon.io tools after configuration
Restart the MCP host completely (not just the window but the whole process). On the first connection the client opens the consent screen: approve the access and choose your tenant. For Claude Desktop there is a log in ~/Library/Logs/Claude/ where you can see connection errors.
A PATCH on /v1/players returned publish_required: true. What now?
Call POST /v1/players/<id>/publish (or the MCP tool publish_players). Without a publish, the screen keeps playing the previous content. That is deliberate, to avoid half-applied changes.
429 rate-limited during a large bulk import
Add a delay between your calls or spread the work over more time. The 60/min counts per token, not per tenant.
Thanks for your feedback.