{
  "openapi": "3.0.3",
  "info": {
    "title": "InReelForge API",
    "description": "Social Media Posting API for Instagram, YouTube, Facebook, TikTok, X (Twitter), LinkedIn, Threads, Pinterest, Reddit, Bluesky & Google Business. One API call, all networks.",
    "version": "1.0.0",
    "contact": { "name": "InReelForge Support", "url": "https://indreelforge.com" }
  },
  "servers": [
    { "url": "https://api.indreelforge.com", "description": "Production" },
    { "url": "https://api-dev.indreelforge.com", "description": "Development" }
  ],
  "security": [{ "ApiKeyAuth": [] }],
  "paths": {
    "/api/upload": {
      "post": {
        "summary": "Upload video",
        "description": "Upload a video to one or more social media platforms. Supports scheduling, queue, and auto-transcoding.",
        "tags": ["Upload"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": ["video", "user", "platform[]"],
                "properties": {
                  "video": { "type": "string", "format": "binary", "description": "Video file (MP4, MOV, AVI, WebM)" },
                  "user": { "type": "string", "description": "Profile username" },
                  "title": { "type": "string" },
                  "description": { "type": "string" },
                  "platform[]": { "type": "array", "items": { "type": "string", "enum": ["instagram", "youtube", "facebook", "tiktok", "x", "linkedin", "threads", "pinterest", "reddit", "bluesky", "google_business"] } },
                  "schedule": { "type": "string", "format": "date-time", "description": "ISO-8601 datetime for scheduling" },
                  "timezone": { "type": "string" },
                  "add_to_queue": { "type": "boolean", "description": "Auto-schedule to next available queue slot" },
                  "async_upload": { "type": "boolean", "default": true },
                  "request_id": { "type": "string", "description": "Client-provided tracking ID" },
                  "privacy_level": { "type": "string", "enum": ["PUBLIC_TO_EVERYONE", "MUTUAL_FOLLOW_FRIENDS", "FOLLOWER_OF_CREATOR", "SELF_ONLY"] },
                  "media_type": { "type": "string", "enum": ["IMAGE", "STORIES"] },
                  "visibility": { "type": "string", "enum": ["PUBLIC", "CONNECTIONS", "LOGGED_IN"] },
                  "pinterest_board_id": { "type": "string" },
                  "subreddit": { "type": "string" },
                  "gbp_location_id": { "type": "string" },
                  "target_linkedin_page_id": { "type": "string" }
                }
              }
            }
          }
        },
        "parameters": [
          { "name": "Idempotency-Key", "in": "header", "schema": { "type": "string" }, "description": "Unique key to prevent duplicate uploads" }
        ],
        "responses": {
          "201": { "description": "Upload queued", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UploadResponse" } } } },
          "202": { "description": "Upload scheduled/queued" },
          "400": { "description": "Invalid request" },
          "401": { "description": "Unauthorized" },
          "403": { "description": "Limit reached or plan restriction" },
          "413": { "description": "File too large" }
        }
      }
    },
    "/api/upload_photos": {
      "post": {
        "summary": "Upload photos",
        "description": "Upload photos (and mixed media for Instagram/Threads carousels) to social media platforms.",
        "tags": ["Upload"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": ["photos[]", "user", "platform[]"],
                "properties": {
                  "photos[]": { "type": "array", "items": { "type": "string", "format": "binary" }, "maxItems": 10 },
                  "user": { "type": "string" },
                  "title": { "type": "string" },
                  "description": { "type": "string" },
                  "platform[]": { "type": "array", "items": { "type": "string" } },
                  "schedule": { "type": "string", "format": "date-time" },
                  "collaborators": { "type": "string", "description": "Instagram collaborator usernames" },
                  "pinterest_board_id": { "type": "string" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Photo upload queued" }, "202": { "description": "Scheduled" } }
      }
    },
    "/api/upload_text": {
      "post": {
        "summary": "Upload text post",
        "description": "Upload text-only posts. Supports X, LinkedIn, Facebook, Threads, Reddit, and Bluesky.",
        "tags": ["Upload"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": ["title", "user", "platform[]"],
                "properties": {
                  "title": { "type": "string" },
                  "user": { "type": "string" },
                  "platform[]": { "type": "array", "items": { "type": "string" } },
                  "caption": { "type": "string" },
                  "schedule": { "type": "string", "format": "date-time" },
                  "link_url": { "type": "string" },
                  "reply_settings": { "type": "string", "enum": ["everyone", "mentionedUsers", "following"] },
                  "community_id": { "type": "string" },
                  "subreddit": { "type": "string" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Text post queued" } }
      }
    },
    "/api/upload_document": {
      "post": {
        "summary": "Upload document",
        "description": "Upload documents (PDF, PPT, PPTX, DOC, DOCX) to LinkedIn as native document posts.",
        "tags": ["Upload"],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": ["document", "user"],
                "properties": {
                  "document": { "type": "string", "format": "binary" },
                  "user": { "type": "string" },
                  "title": { "type": "string" },
                  "description": { "type": "string" },
                  "visibility": { "type": "string" },
                  "target_linkedin_page_id": { "type": "string" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Document upload queued" } }
      }
    },
    "/api/uploadposts/status": {
      "get": {
        "summary": "Get upload status",
        "tags": ["Upload Management"],
        "parameters": [
          { "name": "request_id", "in": "query", "schema": { "type": "string" } },
          { "name": "job_id", "in": "query", "schema": { "type": "string" } }
        ],
        "responses": { "200": { "description": "Upload status" } }
      }
    },
    "/api/uploadposts/history": {
      "get": {
        "summary": "Get upload history",
        "tags": ["Upload Management"],
        "parameters": [
          { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
          { "name": "limit", "in": "query", "schema": { "type": "integer", "default": 20 } }
        ],
        "responses": { "200": { "description": "Paginated upload history" } }
      }
    },
    "/api/schedule": {
      "get": {
        "summary": "List scheduled posts",
        "tags": ["Schedule"],
        "responses": { "200": { "description": "List of scheduled posts" } }
      }
    },
    "/api/schedule/{jobId}": {
      "delete": {
        "summary": "Cancel a scheduled post",
        "tags": ["Schedule"],
        "parameters": [{ "name": "jobId", "in": "path", "required": true, "schema": { "type": "string" } }],
        "responses": { "200": { "description": "Cancelled" } }
      },
      "patch": {
        "summary": "Edit a scheduled post",
        "tags": ["Schedule"],
        "parameters": [{ "name": "jobId", "in": "path", "required": true, "schema": { "type": "string" } }],
        "requestBody": {
          "content": { "application/json": { "schema": { "type": "object", "properties": { "scheduled_date": { "type": "string", "format": "date-time" }, "title": { "type": "string" }, "caption": { "type": "string" } } } } }
        },
        "responses": { "200": { "description": "Updated" } }
      }
    },
    "/api/queue/settings": {
      "get": {
        "summary": "Get queue settings",
        "tags": ["Queue"],
        "parameters": [{ "name": "profile", "in": "query", "required": true, "schema": { "type": "string" } }],
        "responses": { "200": { "description": "Queue settings" } }
      },
      "post": {
        "summary": "Update queue settings",
        "tags": ["Queue"],
        "requestBody": {
          "content": { "application/json": { "schema": { "type": "object", "required": ["profile_username"], "properties": { "profile_username": { "type": "string" }, "timezone": { "type": "string" }, "slots": { "type": "array", "items": { "type": "string" }, "maxItems": 24 }, "days_of_week": { "type": "array", "items": { "type": "integer", "minimum": 0, "maximum": 6 } } } } } }
        },
        "responses": { "200": { "description": "Updated" } }
      }
    },
    "/api/queue/preview": {
      "get": {
        "summary": "Preview queue slots",
        "tags": ["Queue"],
        "parameters": [
          { "name": "profile", "in": "query", "required": true, "schema": { "type": "string" } },
          { "name": "count", "in": "query", "schema": { "type": "integer", "default": 10, "maximum": 50 } }
        ],
        "responses": { "200": { "description": "Preview of upcoming slots" } }
      }
    },
    "/api/queue/next-slot": {
      "get": {
        "summary": "Get next available queue slot",
        "tags": ["Queue"],
        "parameters": [{ "name": "profile", "in": "query", "required": true, "schema": { "type": "string" } }],
        "responses": { "200": { "description": "Next available slot" } }
      }
    },
    "/api/analytics/live/{profile_username}": {
      "get": {
        "summary": "Get live analytics from platform APIs",
        "tags": ["Analytics"],
        "parameters": [
          { "name": "profile_username", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "platforms", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Comma-separated platform names" }
        ],
        "responses": { "200": { "description": "Platform analytics data" } }
      }
    },
    "/api/analytics/total-impressions/{profile_username}": {
      "get": {
        "summary": "Get total impressions",
        "tags": ["Analytics"],
        "parameters": [
          { "name": "profile_username", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "period", "in": "query", "schema": { "type": "string", "enum": ["last_day", "week", "month", "3months", "year"] } },
          { "name": "platform", "in": "query", "schema": { "type": "string" } }
        ],
        "responses": { "200": { "description": "Aggregated impressions" } }
      }
    },
    "/api/analytics/post/{request_id}": {
      "get": {
        "summary": "Get per-post analytics",
        "tags": ["Analytics"],
        "parameters": [
          { "name": "request_id", "in": "path", "required": true, "schema": { "type": "string" } },
          { "name": "platform", "in": "query", "schema": { "type": "string" } }
        ],
        "responses": { "200": { "description": "Post analytics" } }
      }
    },
    "/api/platforms/facebook/pages": {
      "get": { "summary": "Get Facebook pages", "tags": ["Platform Helpers"], "parameters": [{ "name": "profile", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "Facebook pages" } } }
    },
    "/api/platforms/linkedin/pages": {
      "get": { "summary": "Get LinkedIn pages", "tags": ["Platform Helpers"], "parameters": [{ "name": "profile", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "LinkedIn pages" } } }
    },
    "/api/platforms/pinterest/boards": {
      "get": { "summary": "Get Pinterest boards", "tags": ["Platform Helpers"], "parameters": [{ "name": "profile", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "Pinterest boards" } } }
    },
    "/api/platforms/google-business/locations": {
      "get": { "summary": "Get Google Business locations", "tags": ["Platform Helpers"], "parameters": [{ "name": "profile", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "Locations" } } }
    },
    "/api/platforms/media": {
      "get": { "summary": "List recent media across platforms", "tags": ["Platform Helpers"], "parameters": [{ "name": "profile", "in": "query", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Media list" } } }
    },
    "/api/platforms/metrics": {
      "get": { "summary": "Get available metrics per platform", "tags": ["Platform Helpers"], "responses": { "200": { "description": "Metrics configuration" } } }
    },
    "/api/webhooks/config": {
      "get": { "summary": "Get webhook config", "tags": ["Webhooks"], "responses": { "200": { "description": "Current config" } } },
      "post": {
        "summary": "Configure webhook notifications",
        "tags": ["Webhooks"],
        "requestBody": {
          "content": { "application/json": { "schema": { "type": "object", "properties": { "channels": { "type": "object", "properties": { "webhook": { "type": "boolean" }, "telegram": { "type": "boolean" } } }, "webhook_url": { "type": "string", "format": "uri" }, "telegram_chat_id": { "type": "string" } } } } }
        },
        "responses": { "200": { "description": "Updated" } }
      }
    },
    "/api/whitelabel/generate-jwt": {
      "post": {
        "summary": "Generate JWT URL for whitelabel",
        "tags": ["Whitelabel"],
        "requestBody": {
          "content": { "application/json": { "schema": { "type": "object", "required": ["username"], "properties": { "username": { "type": "string" }, "redirect_url": { "type": "string" }, "logo_image": { "type": "string" }, "redirect_button_text": { "type": "string" }, "connect_title": { "type": "string" }, "connect_description": { "type": "string" }, "platforms": { "type": "array", "items": { "type": "string" } }, "show_calendar": { "type": "boolean" } } } } }
        },
        "responses": { "200": { "description": "JWT URL generated" } }
      }
    },
    "/api/whitelabel/validate-jwt": {
      "post": { "summary": "Validate JWT", "tags": ["Whitelabel"], "responses": { "200": { "description": "Validation result" } } }
    },
    "/api/instagram/comments": {
      "get": { "summary": "Get Instagram comments", "tags": ["Instagram Interactions"], "parameters": [{ "name": "profile", "in": "query", "required": true, "schema": { "type": "string" } }, { "name": "media_id", "in": "query", "schema": { "type": "string" } }], "responses": { "200": { "description": "Comments" } } }
    },
    "/api/instagram/comments/reply": {
      "post": { "summary": "Reply to comment (DM)", "tags": ["Instagram Interactions"], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["profile", "comment_id", "message"], "properties": { "profile": { "type": "string" }, "comment_id": { "type": "string" }, "message": { "type": "string" } } } } } }, "responses": { "200": { "description": "Reply sent" } } }
    },
    "/api/instagram/dms/send": {
      "post": { "summary": "Send Instagram DM", "tags": ["Instagram Interactions"], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["profile", "recipient_id", "message"], "properties": { "profile": { "type": "string" }, "recipient_id": { "type": "string" }, "message": { "type": "string" } } } } } }, "responses": { "200": { "description": "DM sent" } } }
    },
    "/api/instagram/dms/conversations": {
      "get": { "summary": "List DM conversations", "tags": ["Instagram Interactions"], "parameters": [{ "name": "profile", "in": "query", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Conversations" } } }
    },
    "/api/instagram/autodm": {
      "get": { "summary": "List AutoDM monitors", "tags": ["Instagram Interactions"], "responses": { "200": { "description": "Monitors" } } }
    },
    "/api/instagram/autodm/start": {
      "post": { "summary": "Start AutoDM monitor", "tags": ["Instagram Interactions"], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["profile", "media_id", "dm_message"], "properties": { "profile": { "type": "string" }, "media_id": { "type": "string" }, "keyword_filter": { "type": "string" }, "dm_message": { "type": "string" } } } } } }, "responses": { "200": { "description": "Monitor started" } } }
    },
    "/api/profiles": {
      "get": { "summary": "List user profiles", "tags": ["User Management"], "responses": { "200": { "description": "Profiles list" } } },
      "post": { "summary": "Create user profile", "tags": ["User Management"], "requestBody": { "content": { "application/json": { "schema": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string" } } } } } }, "responses": { "201": { "description": "Profile created" } } }
    },
    "/api/profiles/{name}": {
      "get": { "summary": "Get specific profile", "tags": ["User Management"], "parameters": [{ "name": "name", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Profile details" } } },
      "delete": { "summary": "Delete profile", "tags": ["User Management"], "parameters": [{ "name": "name", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Deleted" } } }
    },
    "/api/keys": {
      "get": { "summary": "List API keys", "tags": ["Authentication"], "responses": { "200": { "description": "API keys" } } },
      "post": { "summary": "Generate API key", "tags": ["Authentication"], "responses": { "201": { "description": "Key generated" } } }
    },
    "/api/auth/me": {
      "get": { "summary": "Get current user", "tags": ["Authentication"], "responses": { "200": { "description": "User info with email and plan" } } }
    },
    "/api/ffmpeg/trim": {
      "post": { "summary": "Trim video", "tags": ["FFmpeg Editor"], "responses": { "200": { "description": "Job created" } } }
    },
    "/api/ffmpeg/resize": {
      "post": { "summary": "Resize video", "tags": ["FFmpeg Editor"], "responses": { "200": { "description": "Job created" } } }
    },
    "/api/ffmpeg/watermark": {
      "post": { "summary": "Add watermark", "tags": ["FFmpeg Editor"], "responses": { "200": { "description": "Job created" } } }
    },
    "/api/ffmpeg/convert": {
      "post": { "summary": "Convert format", "tags": ["FFmpeg Editor"], "responses": { "200": { "description": "Job created" } } }
    },
    "/api/ffmpeg/usage": {
      "get": { "summary": "Get FFmpeg usage", "tags": ["FFmpeg Editor"], "responses": { "200": { "description": "Usage data" } } }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "Authorization",
        "description": "API key in format: Apikey YOUR_KEY"
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "UploadResponse": {
        "type": "object",
        "properties": {
          "success": { "type": "boolean" },
          "message": { "type": "string" },
          "request_id": { "type": "string" },
          "data": {
            "type": "object",
            "properties": {
              "upload_id": { "type": "string" },
              "platforms": { "type": "object" },
              "total_platforms": { "type": "integer" },
              "scheduled_date": { "type": "string" },
              "estimated_completion": { "type": "string" }
            }
          }
        }
      }
    }
  }
}
