{
  "openapi": "3.0.1",
  "info": {
    "title": "Facebook Reels Uploader",
    "description": "Publish a Reel to your Facebook Page or profile from a URL. A Page token uses Meta's official Graph API (cheaper, no browser); cookies drive the composer, the only route to a profile. The publish fee needs a confirmed publish; metered bandwidth is billed per megabyte on every outcome.",
    "version": "0.1",
    "x-build-id": "lyZzY1xogPCVdWeNh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dami_studio~facebook-reels-uploader/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dami_studio-facebook-reels-uploader",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/dami_studio~facebook-reels-uploader/runs": {
      "post": {
        "operationId": "runs-sync-dami_studio-facebook-reels-uploader",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/dami_studio~facebook-reels-uploader/run-sync": {
      "post": {
        "operationId": "run-sync-dami_studio-facebook-reels-uploader",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "videoUrl": {
            "title": "Video URL",
            "type": "string",
            "description": "Public direct https:// URL to the .mp4 (S3, a CDN, an Apify key-value store — anything that serves the file itself rather than an HTML landing page). Required for a real run; leave the credential fields blank to get a free labelled sample row instead. The clip is checked before anything is transferred: 3 seconds or longer, 540x960 or larger, 24-60 fps, and inside Meta's 16:9-to-9:16 band. Vertical 1080x1920 H.264 + AAC is the format Meta documents."
          },
          "caption": {
            "title": "Caption",
            "type": "string",
            "description": "Reel description; put #hashtags here. Capped at 2,200 characters — Meta publishes no documented Reels description limit, so this Actor uses a conservative ceiling rather than risk a silent truncation it cannot verify. On the browser lane the caption is typed into the composer and then read back before publishing: if it does not match, the run stops instead of publishing a reel with the wrong text.",
            "default": ""
          },
          "reelTitle": {
            "title": "Reel title",
            "type": "string",
            "description": "Optional title (Business Suite \"Add a title\" / API `title`). Capped at 255 characters. Separate from the caption, and not shown on every surface.",
            "default": ""
          },
          "target": {
            "title": "Publish to",
            "enum": [
              "profile",
              "page"
            ],
            "type": "string",
            "description": "Selects composer route. A personal profile can ONLY be reached through the browser lane (cookies): Meta states \"You can only publish Reels to Facebook Pages\", so no access token of any tier can publish to a profile. A Page can be reached either way, and the API lane is the better one.",
            "default": "profile"
          },
          "pageId": {
            "title": "Page ID",
            "type": "string",
            "description": "Numeric Page id. Required when target=page (and whenever a Page access token is supplied). Find it in Meta Business Suite under the Page's settings, or from /me/accounts in the Graph API Explorer. Not the @username."
          },
          "shareMode": {
            "title": "Share mode",
            "enum": [
              "now",
              "schedule",
              "draft"
            ],
            "type": "string",
            "description": "`schedule` / `draft` are Graph API-lane only in v1: they need a Page access token. On the browser lane anything other than \"now\" is rejected up front rather than silently published immediately.",
            "default": "now"
          },
          "scheduledPublishTime": {
            "title": "Scheduled publish time (ISO 8601)",
            "type": "string",
            "description": "Required when shareMode=schedule, e.g. 2026-09-01T14:30:00Z. Meta's own window applies: more than 10 minutes in the future and within 29 days. Scheduled reels count against the same publishing budget as immediate ones."
          },
          "crosspostToInstagram": {
            "title": "Also share to Instagram",
            "type": "boolean",
            "description": "Browser lane only. Asserted by read-back; never left to the composer's default. If the toggle exists but its state cannot be read, the run refuses to publish rather than post to a second platform you did not ask for. The Graph API has no equivalent, so on the API lane this is ignored and the run says so in the log.",
            "default": false
          },
          "c_user": {
            "title": "Facebook \"c_user\" cookie",
            "type": "string",
            "description": "Browser lane. DevTools -> Application -> Cookies -> https://www.facebook.com, row `c_user`, copy the Value column. It is your numeric account id."
          },
          "xs": {
            "title": "Facebook \"xs\" cookie",
            "type": "string",
            "description": "Browser lane, same list. This is the session secret — it looks like 12%3Aabc...%3A2%3A1690... . Paste the value exactly, including the %3A sequences. Anyone holding this value holds your session, so treat it like a password."
          },
          "datr": {
            "title": "Facebook \"datr\" cookie",
            "type": "string",
            "description": "Browser lane, same list. Optional but strongly recommended: it identifies your browser to Facebook's security system, and a session arriving without the `datr` it normally carries reads as a brand-new device and often gets a checkpoint. Never invent one — a `datr` Facebook has never seen is worse than none."
          },
          "cookies": {
            "title": "Whole Facebook cookie jar (advanced alternative)",
            "type": "string",
            "description": "Advanced alternative. Paste a Cookie-Editor JSON export of the whole facebook.com jar, or a raw `Cookie:` header. Leave blank if you filled the three fields above. Export from a facebook.com tab where you are signed in — messenger.com and instagram.com are separate cookie jars and will not work."
          },
          "pageAccessToken": {
            "title": "Page access token (Graph API lane)",
            "type": "string",
            "description": "Graph API lane. A long-lived PAGE access token (not a user token) from a user with the CREATE_CONTENT task on the Page. Supplying this switches the Actor to the official API and skips the browser entirely — cheaper and far more reliable. It needs no App Review, because you are the admin of your own Meta app; the README has the ten-minute setup. Requires `pageId`, and cannot publish to a personal profile."
          },
          "graphApiVersion": {
            "title": "Graph API version",
            "type": "string",
            "description": "Pinned. Never call unversioned: an unversioned Graph call silently follows Meta's newest release and changes behaviour under you. Only change this if Meta deprecates the pinned version.",
            "default": "v25.0"
          },
          "continueOnNonEnglishUi": {
            "title": "Continue on a non-English Facebook interface",
            "type": "boolean",
            "description": "Browser lane. If your Facebook interface is not English, structural locators are used and text-anchored steps are best-effort. Off = the run stops with an actionable message instead of guessing which button it is about to click.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy for the browser lane (the API lane connects directly and needs no proxy). The default is a residential exit, because a datacenter address plus an unfamiliar device fingerprint on a write action is what produces a Facebook checkpoint — and that residential bandwidth is what the per-megabyte charge pays for. Set the COUNTRY to match where your cookies were exported: a country jump is the single biggest checkpoint trigger. Two choices take the run OFF the metered exit, and with it the per-megabyte charge on every outcome, a confirmed publish and a failure alike: selecting a non-residential GROUP, or putting your own servers in \"Proxy URLs\" (used exactly as given). Both raise the checkpoint risk, and both LOWER the file size limit from 500 MB to 304 MB — an unmetered run earns only the flat fee, so it can afford a smaller file, not a larger one. Switching the Apify proxy off entirely connects direct, with the same trade-off.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          },
          "proxyUrls": {
            "title": "Your own proxy servers (advanced)",
            "type": "array",
            "description": "Optional. Full proxy URLs (http://, https://, socks5://), used verbatim and in the order given, instead of this Actor's residential exit. Exactly equivalent to \"Proxy URLs\" inside the Proxy setting above — this top-level spelling exists because an API caller can set it without building a whole proxy-configuration object. Using your own servers removes the per-megabyte charge for that run — whether it publishes or fails — because the outbound bytes no longer cross this Actor's metered connection. It does not change the video size limit: the file is downloaded direct from its host into this Actor before any proxy is involved.",
            "items": {
              "type": "string"
            }
          },
          "demoMode": {
            "title": "Demo mode (no upload)",
            "type": "boolean",
            "description": "Force a labelled SAMPLE row that uploads nothing and charges nothing, even if credentials are provided. A run with no credentials at all is automatically demo mode.",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}