Voor AI-agents
Verbind je agent in één stap. Hij runt je socialmediakanalen.
Markaestro is gebouwd om door software bediend te worden. Een MCP-client zoals Claude Code meldt zich aan via de browser en krijgt een sleutel die aan één merk is gebonden; elke andere agent haalt dezelfde sleutel uit de Instellingen. In beide gevallen kan de agent ontdekken op welke accounts hij mag posten, media uploaden, berichten schrijven en plannen, ze publiceren en terugkoppelen wat er echt is verstuurd, op Facebook, Instagram, TikTok, LinkedIn, Threads en Pinterest.
Geen SDK om te installeren en geen platformgegevens om te bewaken. Je team koppelt de accounts één keer in het dashboard; daarna praat de agent met één bearer-token-API.
Ontworpen voor autonomie, doelbewust begrensd
Waarom een API-sleutel de hele integratie is
Het moeilijke aan het laten aanraken van social media door een agent is niet de HTTP. Het is ervoor zorgen dat een verward model niet naar het verkeerde merk kan posten, niet dubbel post bij een retry, of iets verzendt dat niemand heeft gelezen. Die garanties zitten in de API-interface zelf, niet in je prompt.
MCP-clients
Meld je aan vanuit de client. Niets om te plakken.
Claude Code, Claude, Cursor, ChatGPT, Grok, Grok Bot, OpenClaw, Hermes en elke andere client die het Model Context Protocol spreekt, kan zonder geconfigureerde gegevens verbinding maken met de gehoste MCP-server van Markaestro. De eerste toolaanroep opent je browser: meld je aan, kies de werkruimte en het merk waarvoor de agent mag handelen, controleer de rechten en klik op Toestaan. De client ontvangt een sleutel die aan dat merk is gebonden en vernieuwt die zelf.
Dit is standaard OAuth 2.1 met PKCE en dynamische clientregistratie, hetzelfde mechanisme als achter andere gehoste MCP-servers, dus het werkt zonder een Markaestro-specifieke plugin. De server staat op https://markaestro.com/api/public/v1/mcp en biedt eenendertig tools bovenop de publieke API: merk- en bestemmingsdetectie, media-upload, concepten en geplande berichten, publiceren met run-polling, bulkbewerkingen, webhooks en de regels per kanaal.
Verbind je agent
Kies je agent. Drie stappen, daarna kan hij posten.
Elke client hieronder bereikt dezelfde gehoste MCP-server. De meeste melden zich aan via de browser: de eerste tool-aanroep opent een toestemmingspagina waar je de werkruimte en het merk kiest waarvoor de agent mag handelen, en de client krijgt een sleutel die aan dat merk is gebonden. Clients die geen browser kunnen openen gebruiken een API-sleutel van de werkruimte. Dezelfde server, dezelfde rechten, dezelfde lijst in Instellingen.
Claude Code
De plugin installeert de skill en de gehoste server samen. Niets te configureren, niets te plakken.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- Claude Code is geïnstalleerd en aangemeld bij je Anthropic-account.
Aanmelden
- Vraag Claude iets over Markaestro, of voer /mcp uit en kies markaestro.
- Je browser opent de toestemmingspagina. Kies werkruimte en merk, controleer de rechten en klik op Toestaan.
- Om later van merk te wisselen voer je /mcp opnieuw uit, meld je je af en meld je je aan met het andere merk.
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Voer de twee plugin-opdrachten uit in een terminal, of voeg alleen de server toe met de derde opdracht.
# The plugin bundles the skill and the hosted server.
claude plugin marketplace add D3vBaba/Markaestro
claude plugin install markaestro@markaestro
# Or add just the server. No key, no header: the first call opens the browser.
claude mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcpClaude
claude.ai en Claude Desktop nemen de server-URL als aangepaste connector en melden zich aan via dezelfde toestemmingspagina.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- Aangepaste connectors zijn beschikbaar in de betaalde Claude-abonnementen. Bij Team en Enterprise moet een eigenaar ze mogelijk inschakelen.
Aanmelden
- Klik op Verbinden naast Markaestro. De toestemmingspagina opent in een nieuw tabblad.
- Kies werkruimte en merk, controleer de rechten en klik op Toestaan. Het tabblad sluit en de connector staat als verbonden.
- Schakel Markaestro in een chat in via het toolsmenu wanneer de agent het moet gebruiken.
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Open Instellingen, Connectors en dan Aangepaste connector toevoegen.
- Plak de server-URL hieronder, laat de OAuth-clientvelden leeg en klik op Toevoegen.
https://markaestro.com/api/public/v1/mcpCursor
Eén klik voegt de server toe aan Cursor. De eerste tool-aanroep opent de aanmelding in de browser; Cursor bewaart het token in de sleutelhanger van je systeem.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- Cursor met MCP ingeschakeld. Externe MCP-servers werken op elk Cursor-abonnement.
Aanmelden
- Open Cursor Settings, Tools & MCP. Markaestro toont Needs login; klik erop.
- Je browser opent de toestemmingspagina. Kies werkruimte en merk en klik op Toestaan. Cursor pakt het token op en toont de tools.
- Grok Bot in Cursor gebruikt dezelfde serverinvoer.
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Klik op Toevoegen aan Cursor en bevestig de installatie in Cursor.
- Of plak de JSON in .cursor/mcp.json in een project (gedeeld met je team via git) of in ~/.cursor/mcp.json (alleen jij).
// .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
{
"mcpServers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp"
}
}
}Voor een gedeelde buildmachine of CI vervangt een API-sleutel van de werkruimte in de headers de aanmelding.
// Without a browser: pass a workspace API key instead.
{
"mcpServers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp",
"headers": { "Authorization": "Bearer mk_live_..." }
}
}
}ChatGPT
ChatGPT verbindt met Markaestro als aangepaste app in de ontwikkelaarsmodus en meldt zich aan via de toestemmingspagina.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- De ontwikkelaarsmodus vereist ChatGPT Pro, Business, Enterprise of Edu. Pro toont alleen leestools; Business, Enterprise en Edu tonen alles.
- Bij Business, Enterprise en Edu moet een beheerder aangepaste apps mogelijk toestaan voor de werkruimte.
Aanmelden
- De toestemmingspagina opent terwijl ChatGPT de tools scant. Kies werkruimte en merk, klik op Toestaan en daarna op Maken.
- Klik in een chat op de plusknop, Meer en dan Markaestro om de tools beschikbaar te maken.
- ChatGPT registreert zich één keer per verbinding bij Markaestro. Opnieuw verbinden maakt een nieuwe verbinding die je apart kunt intrekken.
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Open Instellingen, Apps en connectors, Geavanceerde instellingen en zet de ontwikkelaarsmodus aan.
- Terug in Apps en connectors klik je op Maken. Noem het Markaestro, plak de server-URL, kies OAuth als authenticatie en klik op Tools scannen.
https://markaestro.com/api/public/v1/mcpGrok
Grok bereikt Markaestro op drie manieren: als aangepaste connector op grok.com, vanuit de Grok Build-terminal en als externe MCP-tool in de xAI API.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- grok.com-connectors werken op persoonlijke abonnementen. Grok Business en Enterprise hebben een teambeheerder nodig die de connector inricht.
- De xAI API-route draait aan de serverkant en gebruikt daarom altijd een API-sleutel van de werkruimte.
Aanmelden
- grok.com en Grok Build openen de toestemmingspagina bij de eerste tool-aanroep. Kies werkruimte en merk en klik op Toestaan.
- Maak voor de xAI API een API-sleutel van de werkruimte en geef die mee in het veld authorization.
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- grok.com: open grok.com/connectors, klik op New Connector, kies Custom en plak de server-URL. Vraagt het dialoogvenster om een client-id, gebruik dan de waarden hieronder.
- Grok Build: voer de twee opdrachten uit in een terminal. Grok Build pikt een Markaestro-invoer ook op uit de .mcp.json van Claude Code of de mcp.json van Cursor.
- xAI API: voeg het toolblok toe aan de tools-array van een Responses API-verzoek.
Aangepaste grok.com-connector
Server URL: https://markaestro.com/api/public/v1/mcp
grok.com's Custom Connector asks only for a name and this URL. It registers
itself and opens the browser sign-in, no client id or secret to enter.
(If a future dialog does ask, use client id markaestro-grok-web with a blank secret.)Grok Build-terminal
# Grok Build (terminal). The first tool call opens the browser.
grok mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp
grok mcp doctor markaestro
# Headless: pass a workspace API key instead.
grok mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp \
--header "Authorization: Bearer ${MARKAESTRO_API_KEY}"Toolblok voor de xAI Responses API
// xAI Responses API: one entry in the request's "tools" array.
// Server-side, so it always uses a workspace API key.
{
"type": "mcp",
"server_url": "https://markaestro.com/api/public/v1/mcp",
"server_label": "markaestro",
"authorization": "Bearer mk_live_...",
"allowed_tools": ["list_products", "list_destinations", "upload_media",
"create_post", "publish_post", "get_job_run"]
}Grok Bot
Grok Bot draait op een cloudcomputer en accepteert aangepaste MCP-servers met een statische sleutel. De bèta heeft nog geen browseraanmelding voor aangepaste servers.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- Grok Bot is in vroege bèta op SuperGrok-abonnementen en in Cursor Pro. Enterprise-toegang via een wachtlijst.
- Je hebt een API-sleutel van de werkruimte met de agent-scopes. Maak er een met de knop hieronder.
Een API-sleutel gebruiken
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Open de connectorinstellingen van je Bot en voeg een aangepaste MCP-server toe.
- Plak de server-URL en voeg de sleutel toe als header met de waarden hieronder.
Headerwaarden voor het connectordialoogvenster
Server URL: https://markaestro.com/api/public/v1/mcp
Header name: Authorization (or x-api-key if that is the only field)
Header value: Bearer mk_live_... (with x-api-key: just mk_live_...)OpenClaw
OpenClaw voegt externe MCP-servers toe vanuit zijn CLI en rondt de aanmelding af op een loopback-poort, dus op de machine waarop je gateway draait.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- OpenClaw is geïnstalleerd en de gateway draait.
- Een server zonder browser kan de aanmelding afronden met de --code-terugval.
Aanmelden
- openclaw mcp login markaestro toont de aanmeld-URL en wacht op een loopback-poort.
- Open de URL, kies werkruimte en merk en klik op Toestaan. OpenClaw bewaart de gegevens buiten het configuratiebestand.
- Voer openclaw mcp reload uit zodat draaiende agents de tools oppikken.
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Voer de drie opdrachten uit, of voeg het serverblok toe aan ~/.openclaw/openclaw.json.
- Zodra de Markaestro-skill op ClawHub staat, voegt openclaw skills install markaestro ook de agentinstructies toe.
openclaw mcp add markaestro \
--url https://markaestro.com/api/public/v1/mcp \
--transport streamable-http \
--auth oauth
openclaw mcp login markaestro # prints the sign-in URL; add --code <code> when headless
openclaw mcp reloadGelijkwaardige configuratie-invoer
// ~/.openclaw/openclaw.json
{
"mcp": {
"servers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp",
"transport": "streamable-http",
"auth": "oauth"
}
}
}
}Zonder browser
# Without a browser: a workspace API key from the environment.
openclaw mcp add markaestro \
--url https://markaestro.com/api/public/v1/mcp \
--transport streamable-http \
--header "Authorization: Bearer ${MARKAESTRO_API_KEY}"Hermes
Hermes Agent registreert HTTP MCP-servers vanuit config.yaml en voert de aanmelding zelf uit, met het token onder ~/.hermes/mcp-tokens.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- Hermes Agent is geïnstalleerd. Geheimen horen in ~/.hermes/.env en worden als ${VAR} in de configuratie gebruikt.
Aanmelden
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Voeg het mcp_servers-blok toe aan ~/.hermes/config.yaml.
- Stuur in een lopende sessie /reload-mcp. De tools verschijnen als mcp_markaestro_<tool>.
# ~/.hermes/config.yaml
mcp_servers:
markaestro:
url: "https://markaestro.com/api/public/v1/mcp"
auth: oauthZonder browser
# Without a browser: a workspace API key, kept in ~/.hermes/.env
mcp_servers:
markaestro:
url: "https://markaestro.com/api/public/v1/mcp"
headers:
Authorization: "Bearer ${MARKAESTRO_API_KEY}"Andere MCP-client
Elke client die Streamable HTTP en OAuth 2.1 met dynamische clientregistratie spreekt, verbindt met alleen de server-URL.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- De client ondersteunt externe MCP-servers via Streamable HTTP en kan een browser openen voor OAuth. Zo niet, gebruik dan het tabblad API-sleutel.
Aanmelden
- De eerste tool-aanroep krijgt een aanmeldverzoek terug en de client opent de toestemmingspagina.
- Kies werkruimte en merk en klik op Toestaan. De client wisselt de code in voor een merkgebonden sleutel en vernieuwt die elke 30 dagen.
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Voeg de server-URL toe in de MCP-configuratie van de client. De JSON hieronder is de gebruikelijke mcpServers-vorm.
- Configureer geen client-id of secret. De client registreert zichzelf bij het eerste gebruik.
{
"mcpServers": {
"markaestro": {
"type": "http",
"url": "https://markaestro.com/api/public/v1/mcp"
}
}
}API-sleutel
Voor CI-jobs, cron-workers en clients zonder browser: een API-sleutel van de werkruimte in de Authorization-header bereikt dezelfde server met dezelfde rechten.
Voordat je begint
- Je bent eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres, in een werkruimte met een actief abonnement en minstens één merk.
- Je kunt sleutels aanmaken: eigenaar of beheerder van de werkruimte met een geverifieerd e-mailadres.
Een API-sleutel gebruiken
Controleren
- Vraag de agent om list_products aan te roepen. Het antwoord moet het ene toegestane merk en zijn gekoppelde kanalen bevatten.
- De verbinding staat in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Daar kun je haar altijd intrekken.
Server toevoegen
- Maak een sleutel voor één merk met alleen de scopes die de agent nodig heeft en een vervaldatum.
- Geef hem mee als bearer-header aan de gehoste server, of als MARKAESTRO_API_KEY aan de lokale stdio-server, die ook bestanden van schijf kan uploaden.
# CI, cron, or any client without a browser: pass a key instead.
claude mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp \
--header "Authorization: Bearer mk_live_..."
# Local stdio server (can also upload files from disk)
claude mcp add markaestro -e MARKAESTRO_API_KEY=mk_live_... -- npx -y @markaestro/mcp{
"mcpServers": {
"markaestro": {
"type": "http",
"url": "https://markaestro.com/api/public/v1/mcp",
"headers": { "Authorization": "Bearer mk_live_..." }
}
}
}Wat er gebeurt als de client verbinding maakt
Vijf stappen, allemaal afgehandeld door de client en de browser. Jij ziet alleen de toestemmingspagina.
POST /api/public/v1/mcp → 401 + WWW-AuthenticateDe client roept het MCP-endpoint aan zonder gegevens. Markaestro antwoordt met 401 en een WWW-Authenticate-header die het metadatadocument van de beschermde resource noemt. Die header vertelt de client dat er een aanmelding beschikbaar is.
GET /.well-known/oauth-protected-resource · /.well-known/oauth-authorization-serverDe client leest twee publieke documenten: welke autorisatieserver het endpoint beschermt en waar diens registratie-, autorisatie- en token-endpoints staan. Beide worden op markaestro.com geserveerd en zijn cachebaar.
POST /api/public/v1/oauth/registerDe client registreert zich met een naam en zijn callback-adres. Loopback-adressen, https-callbacks en native app-schema's worden geaccepteerd; kaal http naar een echte host wordt geweigerd. Er is geen vooraf gedeeld client-id nodig.
GET /oauth/authorize (browser)Je browser opent de toestemmingspagina. Een eigenaar of beheerder van de werkruimte met geverifieerd e-mailadres kiest werkruimte en merk, past de rechten aan en klikt op Toestaan. Markaestro stuurt de browser terug naar de client met een eenmalige code.
POST /api/public/v1/oauth/tokenDe client wisselt de code plus zijn PKCE-verifier in voor een access token en een refresh token. Het access token is een gewone API-sleutel van de werkruimte, gebonden aan het gekozen merk. Het verloopt na 30 dagen; een refresh roteert het geheim en verlengt het met nog eens 30.
Het token is een echte API-sleutel
Scopes, merkbinding, rate limits, abonnementscontroles, idempotentie en intrekking volgen hetzelfde codepad als een handmatig gemaakte sleutel. Er is geen tweede rechtenmodel om te doorgronden.
Zichtbaar en intrekbaar in Instellingen
Een verbonden agent verschijnt in Instellingen, API met de badge Verbonden agent, het laatste gebruik en het aantal verzoeken. Trek hem daar in en de volgende aanroep van de client mislukt; de client kan zijn eigen token ook intrekken wanneer je hem loskoppelt.
Eén verbinding, één merk
Elke verbinding is gebonden aan precies één merk, gekozen bij de toestemming. Wil je een agent aan een tweede merk laten werken, verbind hem dan opnieuw en kies dat merk. Een client kan nooit bij een merk dat hem niet is toegekend.
Codes en refresh tokens zijn eenmalig
Autorisatiecodes leven tien minuten en worden atomair verbruikt, dus een herhaalde code mislukt. Refresh tokens roteren bij elk gebruik en worden gehasht opgeslagen. Inactieve clientregistraties verlopen na 180 dagen.
Eindpunten
Voor wie een MCP-client bouwt of de flow controleert. Alles is vindbaar via de twee well-known-documenten; niets hiervan hoeft met de hand te worden geconfigureerd.
# Discovery (public, cacheable)
GET /.well-known/oauth-protected-resource RFC 9728
GET /.well-known/oauth-authorization-server RFC 8414
# Authorization server
POST /api/public/v1/oauth/register RFC 7591, public clients (PKCE) or client_secret
GET /oauth/authorize?response_type=code&client_id=…&redirect_uri=…
&code_challenge=…&code_challenge_method=S256&state=…
POST /api/public/v1/oauth/token grant_type=authorization_code | refresh_token
POST /api/public/v1/oauth/revoke RFC 7009
# Token response
{ "access_token": "mk_live_<ws>.<client>.<secret>", "token_type": "Bearer",
"expires_in": 2592000, "refresh_token": "…", "scope": "products.read posts.write …" }De agent-loop
Vijf aanroepen, van begin tot eind
Elke Markaestro-automatisering is een variant op deze loop. Stappen één tot en met drie zijn de Connect API, de platte interface waar de meeste agents op moeten mikken. Stappen vier en vijf raken de volledige /api/public/v1-API voor expliciete publicatie en run-tracking.
GET /api/connect/v1/social-accountsRetourneert elk verbonden, publiceerbaar account voor het merk van de sleutel, elk met een platform, gebruikersnaam en een ondoorzichtige id. Roep dit aan bij het begin van een run, verbindingen veranderen.
POST /api/connect/v1/media/create-upload-url → PUTGenereer een kortstondige, eenmalig bruikbare ondertekende URL, en doe vervolgens een PUT van de ruwe bytes ernaartoe. Je krijgt een media-id terug. Afbeeldingen tot 10 MB; de volledige API accepteert ook video tot 250 MB.
POST /api/connect/v1/postsGeef het onderschrift, de media-id's en de account-id's letterlijk door. Laat het als concept staan voor beoordeling, of stuur is_draft false met scheduled_at om het op de kalender te zetten.
POST /api/public/v1/posts/:id/publishPlaatst een asynchrone run in de wachtrij. LinkedIn, Threads en Pinterest gaan via de officiële API naar buiten. Facebook, Instagram en TikTok komen in de 'Te Plaatsen'-wachtrij van de workspace terecht zodat een mens native kan plaatsen.
GET /api/public/v1/job-runs/:id · webhooksPeil de run-id, of registreer een webhook-endpoint en laat Markaestro post.published, post.action_required en post.failed naar je pushen. Neem nooit aan dat een publicatie synchroon is voltooid.
Snelstart
Een werkende integratie in vier commando's
Genereer eerst de sleutel: open Instellingen → API, kies het merk waartoe deze toegang mag hebben, vink de benodigde scopes aan, en geef optioneel een vervaldatum op. De sleutel wordt eenmalig getoond, plaats deze direct in de geheimenopslag van je agent. Het aanmaken van sleutels vereist een beheerder of eigenaar met een geverifieerd e-mailadres.
# The API is served from the marketing apex and the app subdomain alike.
export MARKAESTRO_URL="https://markaestro.com"
export MARKAESTRO_API_KEY="mk_live_<workspaceId>.<clientId>.<secret>"
# 1. What can this key post to?
curl -s "$MARKAESTRO_URL/api/connect/v1/social-accounts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"{
"data": [
{
"id": "prod_123#instagram:instagram:ig_123",
"product_id": "prod_123",
"product": "Northwind Coffee",
"platform": "instagram",
"username": "northwindcoffee"
}
]
}# 2. Mint a signed upload url, then PUT the bytes.
RESP=$(curl -s -X POST "$MARKAESTRO_URL/api/connect/v1/media/create-upload-url" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "mime_type": "image/png", "size_bytes": 184320, "name": "cold-brew.png" }')
# → { "media_id": "ast_777", "upload_url": "https://.../media/upload?token=..." }
curl -X PUT "<upload_url>" \
-H "Content-Type: image/png" \
--data-binary @cold-brew.pngis_draft: false met een scheduled_at-tijdstempel om de post op de kalender te zetten.# 3. Put it on the calendar. Pass the account id back verbatim.
curl -X POST "$MARKAESTRO_URL/api/connect/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"caption": "Cold brew season starts Friday.",
"media": ["ast_777"],
"social_accounts": ["prod_123#instagram:instagram:ig_123"],
"is_draft": false,
"scheduled_at": "2026-08-14T15:00:00.000Z"
}'
# 4. Check where everything stands.
curl -s "$MARKAESTRO_URL/api/connect/v1/posts?limit=20" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"Direct bruikbaar
Tooldefinities en een agent-samenvatting
Twee dingen om te kopiëren. De eerste is een set toolschema's die de hele publicatieloop dekken, geschreven in JSON Schema, dus ze werken als Claude-tooldefinities, OpenAI-functies, of de invoervorm voor een MCP-server die je zelf host. De tweede is de operationele samenvatting die een model ervan weerhoudt er iets onverwachts mee te doen.
[
{
"name": "markaestro_list_accounts",
"description": "List the social accounts this Markaestro key can publish to. Call this first in every run. Never hardcode account ids. Returns id, platform, and username.",
"input_schema": { "type": "object", "properties": {}, "required": [] }
},
{
"name": "markaestro_upload_media",
"description": "Upload one image or video to Markaestro and return a media asset id. Images: png, jpeg, webp, gif up to 10 MB. Video: mp4, mov, webm up to 250 MB.",
"input_schema": {
"type": "object",
"properties": {
"file_path": { "type": "string", "description": "Local path to the file to upload." },
"mime_type": { "type": "string", "description": "MIME type of the file." }
},
"required": ["file_path", "mime_type"]
}
},
{
"name": "markaestro_create_post",
"description": "Create a post for one channel. Facebook, Instagram, and TikTok are manual-first: a human posts them natively from the To Post queue. Omit delivery_mode unless the user explicitly asked for unattended publishing.",
"input_schema": {
"type": "object",
"properties": {
"channel": {
"type": "string",
"enum": ["facebook", "instagram", "tiktok", "linkedin", "threads", "pinterest", "x"]
},
"caption": { "type": "string", "description": "Caption text, max 4000 characters." },
"media_asset_ids": {
"type": "array",
"items": { "type": "string" },
"description": "Ids from markaestro_upload_media. Instagram and TikTok require at least one."
},
"destination_id": {
"type": "string",
"description": "From markaestro_list_accounts. Required only when the brand has more than one destination on that channel."
},
"delivery_mode": {
"type": "string",
"enum": ["manual_reminder", "direct_publish", "platform_inbox"],
"description": "Omit for the channel default."
}
},
"required": ["channel", "caption"]
}
},
{
"name": "markaestro_publish_post",
"description": "Queue an async publish run for an existing post. Returns a run id. Poll it, do not assume the post is live.",
"input_schema": {
"type": "object",
"properties": { "post_id": { "type": "string" } },
"required": ["post_id"]
}
},
{
"name": "markaestro_list_posts",
"description": "List posts for this brand, newest first. Filter by status: draft, scheduled, publishing, published, platform_action_required, failed, partial_failed.",
"input_schema": {
"type": "object",
"properties": {
"status": { "type": "string" },
"limit": { "type": "integer", "minimum": 1, "maximum": 100 }
},
"required": []
}
},
{
"name": "markaestro_delete_post",
"description": "Remove a post from Markaestro. Use it to cancel something scheduled. Deleting an already-published post does NOT retract the live copy on the platform.",
"input_schema": {
"type": "object",
"properties": { "post_id": { "type": "string" } },
"required": ["post_id"]
}
}
]You have a Markaestro API key for exactly one brand. Markaestro is the
publishing layer: you supply the caption and the media, it handles the
platform rules, the calendar, and delivery.
Base URL: https://markaestro.com
Auth: Authorization: Bearer $MARKAESTRO_API_KEY
Rules:
- Call GET /api/connect/v1/social-accounts before posting. Pass the returned
account ids back verbatim. Never invent or cache an id across runs.
- Upload media before creating a post; posts reference media ids, not files.
- Facebook, Instagram, and TikTok are manual-first. Creating and publishing
them queues a reminder for a human. That is the intended behavior. Only
send deliveryMode "direct_publish" if the operator explicitly asked for it.
- Send a unique Idempotency-Key on every POST. Reuse the SAME key when
retrying the SAME request; never reuse it for a different one.
- On 429, wait the number of seconds in Retry-After, then retry. On 4xx other
than 429, do not retry. Report the error code and requestId and stop.
- Publishing is async. POST /publish returns a run id; poll
GET /api/public/v1/job-runs/<id> until succeeded or failed.
- To cancel, list with ?status=scheduled and DELETE the post id. Deleting a
published post does not remove it from the platform.
- Never claim a post is live until a run reports succeeded or a post reports
published.Je agent kan dit ook zelf ophalen: curl https://markaestro.com/llms.txt retourneert een platte-tekst-samenvatting van de hele API, endpoints, regels en foutafhandeling, klein genoeg om in de context te passen.
Recepten
De vier workflows die agents daadwerkelijk uitvoeren
# Full control: draft → publish → poll. No productId needed:
# the key is already bound to one brand.
POST_ID=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-2026-08-14-linkedin" \
-d '{
"channel": "linkedin",
"caption": "We shipped agent-driven publishing.",
"mediaAssetIds": ["ast_777"]
}' | jq -r .post.id)
RUN_ID=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/posts/$POST_ID/publish" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Idempotency-Key: publish-$POST_ID" | jq -r .run.id)
# queued → running → succeeded | failed
curl -s "$MARKAESTRO_URL/api/public/v1/job-runs/$RUN_ID" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"# Review the queue, then cancel what the operator rejected.
curl -s "$MARKAESTRO_URL/api/public/v1/posts?status=scheduled&limit=100" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
curl -X DELETE "$MARKAESTRO_URL/api/public/v1/posts/pst_123" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
# → { "deleted": true, "id": "pst_123" }# One call, up to 25 posts. Per-item results: one bad item
# does not fail the batch.
curl -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: week-33-drop" \
-d '{
"posts": [
{ "channel": "instagram", "caption": "Monday", "mediaAssetIds": ["ast_1"] },
{ "channel": "facebook", "caption": "Tuesday", "mediaAssetIds": ["ast_2"] },
{ "channel": "linkedin", "caption": "Thursday" }
]
}'
# → { "results": [...], "created": 3, "total": 3 }# Let Markaestro call you instead of polling.
curl -X POST "$MARKAESTRO_URL/api/public/v1/webhook-endpoints" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-agent.example.com/hooks/markaestro",
"events": ["post.published", "post.action_required", "post.failed"]
}'
# Each delivery carries:
# X-Markaestro-Event post.action_required
# X-Markaestro-Timestamp 2026-08-14T15:00:04.000Z
# X-Markaestro-Signature HMAC of the body with your webhook secret
# The secret is shown once at creation and stored hashed. Verify before acting.Waarborgen
Wat de agent wel en niet kan doen
Autonomie is alleen nuttig als de impactzone klein is. De standaardinstellingen van Markaestro gaan ervan uit dat de aanroeper software is die het mis kan hebben.
Facebook, Instagram en TikTok zijn manual-first
Posts die je agent voor deze kanalen aanmaakt, gebruiken standaard manual_reminder: Markaestro roept nooit de API van het platform voor hen aan. Publicatie verplaatst de post naar de 'Te Plaatsen'-wachtrij van de workspace, waar een mens de media downloadt, native plaatst en bevestigt, zodat de post er precies uitziet alsof deze met de hand is gemaakt, en een mens elke post ziet voordat deze publiekelijk bestaat. Een agent kan één post laten kiezen voor publicatie via de officiële API met deliveryMode: "direct_publish", en op TikTok betekent dit de overdracht naar de inbox van de maker, nooit een onbeheerde openbare post. LinkedIn, Threads en Pinterest publiceren programmatisch zodra je agent hier expliciet om vraagt.
Beperk de scope van de sleutel
Kies alleen de scopes die de agent nodig heeft: products.read, media.write, posts.read, posts.write, posts.publish, job_runs.read, webhooks.manage. Een onderzoeksagent die alleen de kalender leest, krijgt posts.read en niets anders.
Geef een vervaldatum op
Sleutels kunnen worden aangemaakt met een vervaldatum. Een verlopen sleutel gedraagt zich precies als een ingetrokken sleutel, zodat een sleutel die uit de omgeving van een agent lekt, vanzelf ophoudt te werken.
Roteer en trek in
Roteer een sleutel ter plaatse of trek deze volledig in vanuit Instellingen → API. Elke sleutel toont het laatste gebruiksmoment en verzoekvolume, zodat een agent die stil wordt, of ontspoort, zichtbaar is.
Snelheidslimieten worden afgedwongen
60 verzoeken per minuut per endpoint en 240 per minuut per sleutel. Elk antwoord bevat X-RateLimit-Limit, -Remaining en -Reset; een 429 bevat Retry-After. Respecteer dit in plaats van te blijven proberen.
Markaestro schrijft nooit voor jou
Er is geen generatiestap. Het onderschrift komt van je agent, de media komt uit je bibliotheek of de pijplijn van je agent. Markaestro is de handen, niet de stem.
Verwijderingen zijn aan de Markaestro-kant
Het verwijderen van een geplande post annuleert deze voordat hij wordt verzonden. Het verwijderen van een gepubliceerde post stopt alleen het volgen door Markaestro, de live post blijft staan totdat iemand hem op het platform verwijdert.
Foutafhandeling
Leer welke fouten het waard zijn om opnieuw te proberen
Elk foutantwoord is JSON met een stabiele error-code en een requestId. Laat je agent de requestId citeren wanneer hij een storing meldt, dat is wat ondersteuning nodig heeft om de aanroep te traceren.
| Status | Code | Wat de agent moet doen |
|---|---|---|
| 401 | UNAUTHENTICATED | Sleutel ontbreekt, is ingetrokken of verlopen. Stop en vraag een mens om een nieuwe, opnieuw proberen helpt niet. |
| 403 | FORBIDDEN | De sleutel mist de scope voor deze aanroep. Meld welke aanroep is mislukt; scopes worden gewijzigd in Instellingen → API. |
| 403 | API_KEY_NOT_BOUND_TO_PRODUCT | Een sleutel uitgegeven vóór merkbinding. Vraag om een vervangende sleutel. |
| 400 | VALIDATION_* | De payload schond een kanaalregel (media ontbreekt, verkeerde leveringsmodus, verkeerde scheduled_at). Corrigeer het verzoek; probeer het niet ongewijzigd opnieuw. |
| 400 | VALIDATION_IDEMPOTENCY_KEY_REUSED | Dezelfde Idempotency-Key is met een andere body verzonden. Genereer een nieuwe sleutel per afzonderlijk verzoek. |
| 400 | VALIDATION_POST_IS_PUBLISHING | Probeerde een post te verwijderen terwijl een publicatierun bezig is. Wacht tot de run is afgerond en verwijder dan. |
| 409 | VALIDATION_POST_ALREADY_PUBLISHING | Een publicatierun voor deze post staat al in de wachtrij. Publiceer niet opnieuw, peil in plaats daarvan de bestaande run. |
| 402 | SUBSCRIPTION_REQUIRED | Er is geen actief abonnement aan deze werkruimte gekoppeld. Vraag een eigenaar om de facturering in Instellingen te controleren. |
| 402 | QUOTA_EXCEEDED_MEDIA_UPLOADS | De workspace heeft het maandelijkse uploadquotum bereikt. Stop met uploaden en breng dit onder de aandacht, bestaande media wordt nog steeds gepubliceerd. |
| 404 | NOT_FOUND | De id valt buiten het merk van deze sleutel. Beantwoord als 404 in plaats van 403, zodat sleutels geen id's kunnen aftasten die ze niet bezitten. |
| 429 | RATE_LIMITED | Wacht het aantal seconden dat Retry-After aangeeft, en probeer dan hetzelfde verzoek opnieuw met dezelfde Idempotency-Key. |
Gebruik je eigen stack
Als het een HTTPS-verzoek kan doen, kan het publiceren
Er is geen Markaestro-clientbibliotheek om te adopteren en geen framework om op te standaardiseren. Bearer token, JSON erin, JSON eruit.
Claude en de Claude Agent SDK
Voeg de tooldefinities hierboven toe aan je toollijst. De JSON Schema-vormen zijn al in Claude's tool-use-formaat.
Function calling van OpenAI
Dezelfde schema's mappen één-op-één op functiedefinities, hernoem input_schema naar parameters.
MCP-clients
Claude Code, Claude, Cursor, ChatGPT, Grok, Grok Bot, OpenClaw, Hermes: voeg de URL van de gehoste server toe en meld je aan via de browser. Voor clients die alleen stdio spreken, draait npx -y @markaestro/mcp dezelfde eenendertig tools lokaal.
n8n, Make, Zapier
Elk endpoint is een gewoon HTTP-verzoek met een bearer token. Geen SDK, geen ondertekeningsceremonie, geen OAuth-dans voor de agent.
LangChain en LlamaIndex
Standaard REST-tools. De tweestapsupload van media is de enige flow met meerdere aanroepen, en is twee regels.
Een cronjob en curl
Niet elke agent heeft een framework nodig. De snelstart hierboven is een complete, werkende integratie in vier commando's.