MoneMee MoneMeeAnmelden
REST API v1

Monemee Creator API

Vollständige Referenz aller öffentlichen Endpoints. Erstelle und verwalte digitale Produkte programmatisch — direkt aus eigenen Skripten, Servern oder dem Monemee MCP-Server für Claude.

MCP-Setup

Authentifizierung

Jeder Request braucht einen API-Key im Authorization-Header. Keys erstellst du unter Settings → API & Integrationen. Sie beginnen mit monemee_, werden auf unserer Seite nur als SHA-256-Hash gespeichert und können jederzeit widerrufen werden.

Authorization: Bearer monemee_xxxxxxxxxxxxxxxxxxxxxxxx

OAuth 2.1 (für MCP-Clients)

Wenn du einen MCP-Client wie claude.ai integrierst, kannst du statt eines statischen API-Keys den OAuth-2.1-Flow nutzen — inkl. Dynamic Client Registration nach RFC 7591. Das passiert in claude.ai automatisch beim Hinzufügen des Custom Connectors. Discovery-Doc:

GET https://monemee.com/.well-known/oauth-authorization-server
  • Endpoints: /api/oauth/register, /oauth/authorize, /api/oauth/token
  • PKCE pflicht (S256), Refresh-Token-Rotation, Replay-Detection
  • Access-Token-TTL: 1h · Refresh-Token-TTL: 30 Tage
  • Scope: monemee:write
  • Tools werden über POST /mcp/v1 ausgeführt (Streamable-HTTP-Transport)

Base-URL & Rate-Limits

  • Base-URL: https://monemee.com/api/v1
  • Rate-Limit pro Key: 60 Requests/Minute. Bei Überschreitung antwortet der Server mit 429 und der Meldung „Rate limit exceeded for this API key."
  • IP-Limit (vor Auth): Schützt gegen Brute-Force auf den Auth-Header.
  • Content-Type: Alle POST/PATCH-Requests erwarten application/json (außer uploads/sign beim tatsächlichen Datei-PUT — dort der MIME-Type der Datei).

Endpoints

GET/public/me

Identitäts-Probe. Prüft, dass dein Key gültig ist, und gibt den zugehörigen User zurück. Ideal zum Testen der Verbindung.

{
  "success": true,
  "data": {
    "user_id": 123,
    "email": "creator@example.com",
    "api_key": { "id": 5, "name": "Claude Desktop", "prefix": "monemee_abcdef" }
  }
}
GET/public/products

Listet alle Produkte des authentifizierten Users (drafts + active + archived) inklusive Module.

{
  "success": true,
  "data": [
    {
      "id": 42,
      "title": "LinkedIn Hook Generator",
      "frontend_type": "ki_prompts",
      "price": "14.90",
      "status": "active",
      "modules": [...],
      ...
    }
  ]
}
POST/public/products

Legt ein neues Produkt an. Pflichtfeld: frontend_type. Erlaubte Werte: ebook, template, course, link, newsletter, coaching, software, ki_prompts.

Beispiel: KI-Prompts

Bei frontend_type: "ki_prompts" rendert Monemee ausprompt_content automatisch eine .md-Datei und liefert sie als File-Modul aus.

{
  "frontend_type": "ki_prompts",
  "title": "LinkedIn Hook Generator",
  "description": "10 Hooks für eine eingegebene Zielgruppe.",
  "price": 14.90,
  "prompt_content": "Du bist ein erfahrener LinkedIn-Stratege...",
  "affiliate_commission": 20,
  "status": "draft"
}

Beispiel: File-Produkt (PDF/ZIP/Video/...)

Lade die Datei zuerst über POST /public/uploads/sign + PUT + POST /public/uploads/finalize hoch und übergib das resultierende file_url als Modul.

{
  "frontend_type": "template",
  "title": "Notion Productivity Bundle",
  "description": "<p>5 verknüpfte Notion-Datenbanken.</p>",
  "price": 19.90,
  "status": "draft",
  "modules": [
    {
      "type": "file",
      "title": "notion-bundle.zip",
      "sort_order": 0,
      "file_url": "https://storage.googleapis.com/.../notion-bundle.zip",
      "file_name": "notion-bundle.zip",
      "file_size": 248320
    }
  ]
}

Beispiel: Software (GitHub-Repo)

Bei frontend_type: "software" verbindet Monemee dein privates GitHub-Repo. Beim Veröffentlichen (status: "active") wird der Branch als ZIP oder das Release-Asset heruntergeladen und als File-Modul gespeichert. Der PAT wird AES-256-verschlüsselt.

{
  "frontend_type": "software",
  "title": "DATEV-MCP-Server",
  "description": "MCP-Server für DATEV-Buchhaltung.",
  "price": 199,
  "status": "draft",
  "github_repo_url": "https://github.com/dein-name/datev-mcp",
  "github_pat": "github_pat_xxx",
  "github_branch": "main",
  "github_delivery_mode": "zip"
}
GET/public/products/:id

Einzelnes Produkt mit allen Modulen. Muss dem Key-Inhaber gehören.

PATCH/public/products/:id

Partielles Update. Nur die mitgesendeten Felder ändern sich. PUT wird als Alias akzeptiert (für SDKs, die kein PATCH sprechen). Bei status: "active" auf einem KI-Prompt-Produkt mit geändertem prompt_content wird die .md neu generiert. Bei software-Produkten zieht der Server das GitHub-Artifact neu.

{
  "price": 24.90,
  "status": "active"
}
POST/public/uploads/sign

Erster Schritt des zwei-Schritt-Uploads. Gibt eine signierte Firebase-Storage-URL zurück, an die du die Datei direkt perPUT sendest. Die signierte URL ist 15 Minuten gültig. Erlaubte Inhaltstypen: PDF, ZIP, EPUB, MP4, WebM, MP3, JPG/PNG/WebP/GIF. HTML, JS und SVG sind aus Sicherheitsgründen blockiert.

{
  "fileName": "guide.pdf",
  "contentType": "application/pdf"
}
{
  "success": true,
  "data": {
    "uploadUrl": "https://storage.googleapis.com/...&X-Goog-Signature=...",
    "fileUrl": "https://storage.googleapis.com/<bucket>/products/api/123/1730500000_guide.pdf",
    "objectPath": "products/api/123/1730500000_guide.pdf",
    "fileName": "guide.pdf",
    "contentType": "application/pdf",
    "expiresAt": "2026-05-02T12:15:00.000Z"
  }
}
POST/public/uploads/finalize

Zweiter Schritt: nachdem du per PUT hochgeladen hast, ruft finalize auf, um das Objekt öffentlich lesbar zu machen. Erst danach ist file_url aus der Sign-Response tatsächlich abrufbar. Idempotent. Funktioniert nur für Objekte unter products/api/<deine-user-id>/.

{
  "objectPath": "products/api/123/1730500000_guide.pdf"
}

Fehler-Format

Alle Fehler folgen demselben JSON-Schema. HTTP-Status zeigt die Kategorie: 400 = ungültiges Payload, 401 = Auth fehlt/ungültig, 403 = Zugriff verweigert (z.B. fremdes Objekt), 404 = Ressource nicht gefunden, 429 = Rate-Limit, 5xx = Server.

{
  "success": false,
  "message": "Invalid or revoked API key."
}

Datei-Upload, kompletter Flow

# 1) Signed URL holen
curl -X POST https://monemee.com/api/v1/public/uploads/sign \
  -H "Authorization: Bearer monemee_…" \
  -H "Content-Type: application/json" \
  -d '{"fileName":"guide.pdf","contentType":"application/pdf"}'

# Response liefert uploadUrl + objectPath + fileUrl

# 2) Datei hochladen (direkt zu Firebase Storage, KEIN Authorization-Header!)
curl -X PUT "<uploadUrl-aus-Schritt-1>" \
  -H "Content-Type: application/pdf" \
  --data-binary @./guide.pdf

# 3) Objekt veröffentlichen (Public-Read freischalten)
curl -X POST https://monemee.com/api/v1/public/uploads/finalize \
  -H "Authorization: Bearer monemee_…" \
  -H "Content-Type: application/json" \
  -d '{"objectPath":"<objectPath-aus-Schritt-1>"}'

# Jetzt fileUrl in einem Produkt-Modul verwenden

Beispiel: Node.js / JavaScript

import fetch from 'node-fetch';

const API_KEY = process.env.MONEMEE_API_KEY;

async function createPromptProduct(title, prompt, price) {
  const res = await fetch('https://monemee.com/api/v1/public/products', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      frontend_type: 'ki_prompts',
      title,
      price,
      prompt_content: prompt,
      status: 'draft'
    })
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
  return res.json();
}

Bereit, loszulegen?

API-Key erstellen, Endpoint aufrufen, Produkt veröffentlichen.