{
  "openapi": "3.1.0",
  "info": {
    "title": "BAMF Developer Platform API",
    "version": "0.1.0"
  },
  "servers": [
    {
      "url": "https://api.bamf.ai/v1"
    }
  ],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": { "type": "string" },
              "message": { "type": "string" },
              "request_id": { "type": "string" }
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "summary": "Health check",
        "responses": {
          "200": { "description": "API health" }
        }
      }
    },
    "/me": {
      "get": {
        "summary": "Inspect authenticated key",
        "responses": {
          "200": { "description": "Authenticated actor" },
          "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }
        }
      }
    },
    "/creator-spaces": {
      "get": {
        "summary": "List creator spaces",
        "responses": {
          "200": { "description": "Creator spaces" }
        }
      }
    },
    "/posts": {
      "get": {
        "summary": "List posts",
        "parameters": [
          { "name": "creator_id", "in": "query", "schema": { "type": "string" } },
          { "name": "status", "in": "query", "schema": { "type": "string", "enum": ["scheduled"] } },
          { "name": "include", "in": "query", "schema": { "type": "string" } },
          { "name": "limit", "in": "query", "schema": { "type": "integer", "maximum": 100 } }
        ],
        "responses": {
          "200": { "description": "Posts" }
        }
      },
      "post": {
        "summary": "Create a draft post",
        "parameters": [
          { "name": "Idempotency-Key", "in": "header", "schema": { "type": "string" } }
        ],
        "responses": {
          "201": { "description": "Post created" }
        }
      }
    },
    "/posts/{post_id}": {
      "get": {
        "summary": "Get a post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post" }
        }
      },
      "patch": {
        "summary": "Edit a post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "Idempotency-Key", "in": "header", "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post updated" }
        }
      },
      "delete": {
        "summary": "Delete a post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "Idempotency-Key", "in": "header", "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post deleted" }
        }
      }
    },
    "/posts/{post_id}/preview": {
      "get": {
        "summary": "Get a preview-rich post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post preview" }
        }
      }
    },
    "/posts/{post_id}/schedule": {
      "post": {
        "summary": "Schedule a post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "Idempotency-Key", "in": "header", "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post scheduled" }
        }
      }
    },
    "/posts/{post_id}/unschedule": {
      "post": {
        "summary": "Unschedule a post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "Idempotency-Key", "in": "header", "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post unscheduled" }
        }
      }
    },
    "/posts/{post_id}/pause": {
      "post": {
        "summary": "Pause a scheduled post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post paused" }
        }
      }
    },
    "/posts/{post_id}/resume": {
      "post": {
        "summary": "Resume a scheduled post",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post resumed" }
        }
      }
    },
    "/posts/{post_id}/publish": {
      "post": {
        "summary": "Publish a post immediately",
        "description": "User-scoped keys only.",
        "parameters": [
          { "name": "post_id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Post published" },
          "403": { "description": "Creator-scoped key denied" }
        }
      }
    },
    "/ideas": {
      "get": { "summary": "List ideas", "responses": { "200": { "description": "Ideas" } } },
      "post": { "summary": "Create idea", "responses": { "201": { "description": "Idea created" } } }
    },
    "/ideas/{idea_id}": {
      "get": { "summary": "Get idea", "parameters": [{ "name": "idea_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Idea" } } },
      "patch": { "summary": "Edit idea", "parameters": [{ "name": "idea_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Idea updated" } } },
      "delete": { "summary": "Delete idea", "parameters": [{ "name": "idea_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Idea deleted" } } }
    },
    "/knowledge": {
      "get": { "summary": "List knowledge docs", "responses": { "200": { "description": "Knowledge docs" } } },
      "post": { "summary": "Create knowledge doc", "responses": { "201": { "description": "Knowledge doc created" } } }
    },
    "/knowledge/{doc_id}": {
      "get": { "summary": "Get knowledge doc", "parameters": [{ "name": "doc_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Knowledge doc" } } },
      "patch": { "summary": "Edit knowledge doc", "parameters": [{ "name": "doc_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Knowledge doc updated" } } },
      "delete": { "summary": "Delete knowledge doc", "parameters": [{ "name": "doc_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Knowledge doc deleted" } } }
    },
    "/media": {
      "get": { "summary": "List media", "responses": { "200": { "description": "Media assets" } } },
      "post": { "summary": "Create media asset", "responses": { "201": { "description": "Media asset created" } } }
    },
    "/analytics/summary": {
      "get": { "summary": "Get analytics summary", "responses": { "200": { "description": "Late-authoritative analytics summary" } } }
    },
    "/analytics/posts": {
      "get": { "summary": "List analytics posts", "responses": { "200": { "description": "Late-authoritative post analytics" } } }
    },
    "/analytics/sync": {
      "post": { "summary": "Create analytics sync job", "responses": { "202": { "description": "Analytics sync job queued" } } }
    },
    "/generate/posts": {
      "post": { "summary": "Create post generation job", "description": "Returns reviewable concepts and a draft candidate. Does not create a post.", "responses": { "202": { "description": "Post generation job queued" } } }
    },
    "/generate/post-edits": {
      "post": { "summary": "Create post edit job", "description": "Returns a reviewable edit proposal and PATCH payload. Does not patch the post.", "responses": { "202": { "description": "Post edit job queued" } } }
    },
    "/generate/images": {
      "post": { "summary": "Create image generation job", "description": "Generates quote cards, creator portrait images, and infographics. Poll /jobs/{job_id} for generated media URLs and optional post attachment.", "responses": { "202": { "description": "Image generation job queued" } } }
    },
    "/generate/carousels": {
      "post": { "summary": "Create carousel generation job", "description": "Generates slide images, packages them into a LinkedIn-ready PDF, and optionally attaches the PDF to a post.", "responses": { "202": { "description": "Carousel generation job queued" } } }
    },
    "/generate/carousel-pdfs": {
      "post": { "summary": "Create carousel PDF job", "description": "Converts existing slide image URLs into one PDF with one slide per page for LinkedIn carousel/document posts.", "responses": { "202": { "description": "Carousel PDF job queued" } } }
    },
    "/generate/brand-kits": {
      "post": { "summary": "Create brand-kit generation job", "responses": { "202": { "description": "Brand-kit generation job queued" } } }
    },
    "/research": {
      "post": { "summary": "Create research job", "description": "Synthesizes supplied source URLs, notes, and topics into findings and post angles.", "responses": { "202": { "description": "Research job queued" } } }
    },
    "/knowledge/process": {
      "post": { "summary": "Create knowledge processing job", "description": "Extracts summaries, durable facts, voice signals, content ideas, and interview insights from knowledge docs or raw content.", "responses": { "202": { "description": "Knowledge processing job queued" } } }
    },
    "/jobs": {
      "get": { "summary": "List async jobs", "responses": { "200": { "description": "Jobs" } } },
      "post": { "summary": "Create async job", "responses": { "202": { "description": "Job queued" } } }
    },
    "/jobs/{job_id}": {
      "get": { "summary": "Get job", "parameters": [{ "name": "job_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Job" } } },
      "delete": { "summary": "Cancel job", "parameters": [{ "name": "job_id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Job cancelled" } } }
    },
    "/webhooks": {
      "get": { "summary": "List webhooks", "responses": { "200": { "description": "Webhook endpoints" } } },
      "post": { "summary": "Create webhook", "responses": { "201": { "description": "Webhook endpoint created" } } }
    }
  }
}
