{
  "openapi": "3.1.0",
  "info": {
    "title": "Milk Agency · Ad-hoc-Anfragen",
    "version": "1.0.0",
    "description": "Kostenlose Pinnwand für Ad-hoc-Aufträge im Bereich Videoschnitt, Video-Editing und Postproduktion im deutschsprachigen Raum. Brands, Unternehmen, Agenturen, Filmproduktionen und Creator stellen ohne Konto eine Anfrage mit festen Vorgaben und Festpreis ein; freiberufliche Cutter, Video-Editoren und Postproduktions-Profis bewerben sich direkt. Jede Anfrage ist nach E-Mail-Bestätigung 24 Stunden sichtbar.\n\nFree German-language job board for ad-hoc video editing and post-production gigs (DACH region). Clients post a brief with fixed scope and fixed price without an account; freelance video editors apply directly. Each request is public for 24 hours after email confirmation.\n\nMCP-Server: https://www.milk-agency.de/mcp",
    "contact": {
      "email": "info@milk-agency.de",
      "url": "https://www.milk-agency.de/ad-hoc-anfragen/"
    },
    "termsOfService": "https://www.milk-agency.de/nutzungsbedingungen/"
  },
  "servers": [
    {
      "url": "https://www.milk-agency.de/api"
    }
  ],
  "paths": {
    "/board.php": {
      "get": {
        "operationId": "anfragenAuflisten",
        "summary": "Offene Ad-hoc-Anfragen auflisten (a=list) oder Feldbeschreibung abrufen (a=schema)",
        "parameters": [
          {
            "name": "a",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "list",
                "schema"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liste der veröffentlichten Anfragen bzw. Feldbeschreibung"
          }
        }
      },
      "post": {
        "operationId": "anfrageEinstellenOderBewerben",
        "summary": "Anfrage einstellen (a=create) oder sich bewerben (a=apply)",
        "description": "JSON-Body mit \"a\": \"create\" und den Feldern der Anfrage, oder \"a\": \"apply\" mit den Feldern der Bewerbung. Eine neue Anfrage ist erst nach Klick auf den Bestätigungslink in der E-Mail sichtbar.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "a": {
                        "type": "string",
                        "const": "create"
                      },
                      "titel": {
                        "title": "Titel der Anfrage",
                        "description": "Kurzer, konkreter Titel, z. B. „3 Reels aus Messe-Material“.",
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1
                      },
                      "auftraggeber": {
                        "title": "Brand, Agentur oder Name (öffentlich)",
                        "description": "Wird öffentlich angezeigt.",
                        "type": "string",
                        "maxLength": 80,
                        "minLength": 1
                      },
                      "absender": {
                        "title": "Wer fragt an",
                        "type": "string",
                        "enum": [
                          "Brand / Unternehmen",
                          "Agentur",
                          "Creator"
                        ]
                      },
                      "kategorie": {
                        "title": "Art des Videos",
                        "type": "string",
                        "enum": [
                          "Short-Form",
                          "Long-Form",
                          "Werbung / Ads",
                          "Imagefilm",
                          "Podcast / Interview",
                          "Event / Recap",
                          "Sonstiges"
                        ]
                      },
                      "anzahl": {
                        "title": "Anzahl Videos",
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 20
                      },
                      "laenge": {
                        "title": "Länge je Video",
                        "type": "string",
                        "enum": [
                          "bis 15 s",
                          "15 bis 30 s",
                          "30 bis 60 s",
                          "1 bis 3 min",
                          "3 bis 10 min",
                          "über 10 min"
                        ]
                      },
                      "material": {
                        "title": "Rohmaterial gesamt",
                        "type": "string",
                        "enum": [
                          "bis 10 min",
                          "10 bis 30 min",
                          "30 bis 60 min",
                          "1 bis 3 h",
                          "über 3 h"
                        ]
                      },
                      "formate": {
                        "title": "Formate",
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "9:16",
                            "16:9",
                            "1:1",
                            "4:5"
                          ]
                        },
                        "uniqueItems": true,
                        "minItems": 1
                      },
                      "leistungen": {
                        "title": "Leistungen",
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "Schnitt",
                            "Untertitel",
                            "Color Grading",
                            "Sound / Musik",
                            "Motion Graphics",
                            "Thumbnail"
                          ]
                        },
                        "uniqueItems": true,
                        "minItems": 1
                      },
                      "plattformen": {
                        "title": "Plattformen",
                        "type": "array",
                        "items": {
                          "type": "string",
                          "enum": [
                            "Instagram",
                            "TikTok",
                            "YouTube",
                            "Snapchat",
                            "LinkedIn",
                            "Facebook",
                            "Website"
                          ]
                        },
                        "uniqueItems": true
                      },
                      "lieferzeit": {
                        "title": "Lieferung nach Zusage",
                        "type": "string",
                        "enum": [
                          "6 h",
                          "12 h",
                          "24 h"
                        ]
                      },
                      "dateiformat": {
                        "title": "Dateiformat",
                        "type": "string",
                        "enum": [
                          "MP4 (H.264)",
                          "MOV (ProRes)",
                          "MP4 + Projektdatei"
                        ]
                      },
                      "korrekturen": {
                        "title": "Korrekturschleifen",
                        "type": "string",
                        "enum": [
                          "keine",
                          "1 Runde",
                          "2 Runden"
                        ]
                      },
                      "budget": {
                        "title": "Budget, Festpreis in €",
                        "description": "Festpreis in Euro für alle genannten Leistungen; wird öffentlich angezeigt.",
                        "type": "integer",
                        "minimum": 20,
                        "maximum": 20000
                      },
                      "beschreibung": {
                        "title": "Beschreibung, Stil und Vorgaben",
                        "description": "Look, Tempo, Musik, Branding, Hook. Keine personenbezogenen Daten Dritter, keine Links.",
                        "type": "string",
                        "maxLength": 800,
                        "minLength": 1
                      },
                      "name": {
                        "title": "Name der Ansprechperson (nicht öffentlich)",
                        "type": "string",
                        "maxLength": 120,
                        "minLength": 1
                      },
                      "email": {
                        "title": "E-Mail (nicht öffentlich)",
                        "description": "Erhält den Bestätigungslink und später die Bewerbungen. Wird nie öffentlich angezeigt.",
                        "type": "string",
                        "format": "email",
                        "maxLength": 200
                      },
                      "agb": {
                        "type": "boolean",
                        "const": true,
                        "title": "Nutzungsbedingungen akzeptiert"
                      },
                      "rechte": {
                        "type": "boolean",
                        "const": true,
                        "title": "Rechte am Material vorhanden, Festpreis wird bei Lieferung wie beschrieben gezahlt"
                      }
                    },
                    "required": [
                      "a",
                      "titel",
                      "auftraggeber",
                      "absender",
                      "kategorie",
                      "anzahl",
                      "laenge",
                      "material",
                      "formate",
                      "leistungen",
                      "lieferzeit",
                      "dateiformat",
                      "korrekturen",
                      "budget",
                      "beschreibung",
                      "name",
                      "email",
                      "agb",
                      "rechte"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "object",
                    "properties": {
                      "a": {
                        "type": "string",
                        "const": "apply"
                      },
                      "id": {
                        "title": "ID der Anfrage",
                        "type": "string",
                        "maxLength": 16,
                        "minLength": 1
                      },
                      "name": {
                        "title": "Name",
                        "type": "string",
                        "maxLength": 120,
                        "minLength": 1
                      },
                      "email": {
                        "title": "E-Mail",
                        "description": "Der Auftraggeber antwortet an diese Adresse.",
                        "type": "string",
                        "format": "email",
                        "maxLength": 200
                      },
                      "portfolio": {
                        "title": "Portfolio-Link (https://)",
                        "type": "string",
                        "maxLength": 300
                      },
                      "nachricht": {
                        "title": "Kurze Nachricht",
                        "type": "string",
                        "maxLength": 1200,
                        "minLength": 1
                      },
                      "zusage": {
                        "type": "boolean",
                        "const": true,
                        "title": "Lieferung zum genannten Festpreis und in der genannten Zeit zugesagt"
                      }
                    },
                    "required": [
                      "a",
                      "id",
                      "name",
                      "email",
                      "nachricht",
                      "zusage"
                    ],
                    "additionalProperties": false
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Angenommen; bei create: Bestätigungslink per E-Mail verschickt"
          },
          "422": {
            "description": "Angaben unvollständig; message nennt das Feld"
          },
          "429": {
            "description": "Zu viele Anfragen"
          }
        }
      }
    }
  }
}