{
  "openapi": "3.0.1",
  "info": {
    "title": "Article & Reel Maker",
    "description": "Finds the news on a subject, researches a story, writes an original article with SEO fields and social captions, optionally drafts it to WordPress and renders a vertical video reel.",
    "version": "0.1",
    "x-build-id": "QQhIpvhC1rRlH78ZN"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/calin_a~article-reel-maker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-calin_a-article-reel-maker",
        "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/calin_a~article-reel-maker/runs": {
      "post": {
        "operationId": "runs-sync-calin_a-article-reel-maker",
        "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/calin_a~article-reel-maker/run-sync": {
      "post": {
        "operationId": "run-sync-calin_a-article-reel-maker",
        "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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "What to do",
            "enum": [
              "findTopics",
              "writeArticles",
              "findAndWrite"
            ],
            "type": "string",
            "description": "Find topics: rank today's news on your subject. Write articles: write up the topics or links you supply. Find and write: find the news, then write the top stories not already written by an earlier run.",
            "default": "findTopics"
          },
          "subject": {
            "title": "Your subject",
            "type": "string",
            "description": "Describe your niche in plain words, e.g. \"UK education news\" or \"Formula 1\". The search terms, ranking keywords and home country are worked out from this. To control them yourself, fill in the advanced discovery settings instead."
          },
          "articles": {
            "title": "Articles to write",
            "type": "array",
            "description": "For Write articles: one entry per article. A topic is researched from several sources; a link is rewritten from that one page; your own source text (a press release, notes) is used as it is, with no search. Add \"imageUrl\" to any entry to give its WordPress post a featured image (and its reel a photo), and \"imageAlt\" to describe what that image shows (otherwise the AI writes a description without seeing the image). Plain text works too -- anything starting with http is treated as a link. Example: [{\"topic\": \"Teachers vote to strike over pay\", \"imageUrl\": \"https://example.com/photo.jpg\", \"imageAlt\": \"Teachers on a picket line outside a school\"}, {\"url\": \"https://example.com/news/story\"}, {\"topic\": \"New library opens\", \"sources\": [{\"title\": \"Council press release\", \"text\": \"...\"}]}]. A Find topics run gives each story a ready-made entry to paste here. Up to 20 per run."
          },
          "defaultImageUrl": {
            "title": "Featured image link (Find and write)",
            "type": "string",
            "description": "A link to an image you have the right to use, set as the featured image of every article a Find and write run posts to WordPress, and used as the photo in its reel. For Write articles, give each entry its own \"imageUrl\" instead. Images are never taken from the sources: those are other publishers' photos."
          },
          "defaultImageAlt": {
            "title": "Featured image description (Find and write)",
            "type": "string",
            "description": "What that image shows, in a sentence, e.g. \"Pupils in a primary school classroom\". Read aloud by screen readers and used by search engines. If left empty, the AI writes one from the article without seeing the image, so it may not match the picture."
          },
          "articlesToWrite": {
            "title": "Number of articles (Find and write)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "For Find and write: how many new stories to write per run. Stories written by an earlier run are skipped, and if a story's search finds nothing usable the next one is tried.",
            "default": 3
          },
          "dateRange": {
            "title": "Date range (Find topics, Find and write)",
            "enum": [
              "auto",
              "1d",
              "3d",
              "7d",
              "14d",
              "30d"
            ],
            "type": "string",
            "description": "How far back to look for stories. Find and write writes the top-ranked stories from this period that no earlier run has written. Automatic looks at about the last day or two. A wider range also allows older research sources, unless you set Maximum source age yourself.",
            "default": "auto"
          },
          "newsQueries": {
            "title": "Google News searches",
            "type": "array",
            "description": "Search terms run against Google News. Add when:1d to limit a search to the last day, or when:2d for slower-moving coverage.",
            "items": {
              "type": "string"
            }
          },
          "newsLanguage": {
            "title": "News language",
            "type": "string",
            "description": "Google News language code, e.g. en, de, fr."
          },
          "newsCountry": {
            "title": "News country",
            "type": "string",
            "description": "Google News country code, e.g. GB, US, IE."
          },
          "homeCountry": {
            "title": "Home country",
            "type": "string",
            "description": "Where your readers are, e.g. United Kingdom. Stories about this country count as domestic; stories comparing it with another country are promoted, and stories about another country's local affairs are demoted."
          },
          "homePlaces": {
            "title": "Home places",
            "type": "array",
            "description": "Other words that mark a story as domestic: the demonym, regions and major cities, e.g. british, scotland, london.",
            "items": {
              "type": "string"
            }
          },
          "homeTlds": {
            "title": "Home web domains",
            "type": "array",
            "description": "Domain endings of home-country outlets, e.g. uk, co.uk. An outlet with another country's ending is treated as foreign.",
            "items": {
              "type": "string"
            }
          },
          "homeOutlets": {
            "title": "Home outlets",
            "type": "array",
            "description": "Exact publisher names of your country's outlets, as Google News shows them, e.g. BBC News, The Guardian. A story from one of these counts as domestic even when its headline names no place.",
            "items": {
              "type": "string"
            }
          },
          "assumeHome": {
            "title": "Treat stories that name no place as domestic",
            "enum": [
              "auto",
              "yes",
              "no"
            ],
            "type": "string",
            "description": "Yes suits a language spoken mainly in one country (Romanian, Polish). No suits English, Spanish, French or German, where such stories are often foreign. Auto: worked out from your subject.",
            "default": "auto"
          },
          "geographyMatters": {
            "title": "Geography matters",
            "enum": [
              "auto",
              "yes",
              "no"
            ],
            "type": "string",
            "description": "No for a global subject such as a sport or a technology, where every story counts the same wherever it happens. Auto: worked out from your subject.",
            "default": "auto"
          },
          "relevanceKeywords": {
            "title": "Relevance keywords",
            "type": "array",
            "description": "Word stems that make a headline relevant, with the points each group adds. A stem matches any word containing it, so \"educat\" covers education, educational and educator. Example: [{\"points\": 6, \"stems\": [\"educat\"]}, {\"points\": 4, \"stems\": [\"school\", \"pupil\"]}]"
          },
          "trustedOutlets": {
            "title": "Trusted outlets",
            "type": "object",
            "description": "Bonus points for outlets you trust, matched against the publisher name. Example: {\"bbc\": 6, \"guardian\": 4}"
          },
          "maxTopics": {
            "title": "Maximum topics",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many ranked stories to keep from one harvest, before near-duplicates are folded together.",
            "default": 50
          },
          "sourceMaxAgeDays": {
            "title": "Maximum source age",
            "minimum": 0,
            "maximum": 365,
            "type": "integer",
            "description": "Only use sources published within this many days. Keeps news articles from being written from old coverage. Set 0 for evergreen topics, where older sources are fine.",
            "default": 7
          },
          "model": {
            "title": "AI model",
            "type": "string",
            "description": "Any OpenRouter model id. Leave empty for the default, google/gemini-2.5-flash, which wrote best in our comparison at about $0.005 per article. anthropic/claude-haiku-4.5 also writes well at roughly 3× the price. Reasoning models (e.g. deepseek/deepseek-v4-flash) can run into the free plan's 2,048-token reply limit."
          },
          "siteName": {
            "title": "Site name",
            "type": "string",
            "description": "Your publication's name. The writer is told it works for this site."
          },
          "siteDescription": {
            "title": "Site description",
            "type": "string",
            "description": "One line on what the site covers, e.g. \"an education news site for parents and teachers\"."
          },
          "englishVariant": {
            "title": "English spelling",
            "enum": [
              "auto",
              "british",
              "american"
            ],
            "type": "string",
            "description": "British: organise, favour, 3 October 2026, per cent, headlines in sentence case. American: organize, favor, October 3, 2026, percent, headlines in title case. Automatic: American when the news country is the US, British otherwise.",
            "default": "auto"
          },
          "citeSources": {
            "title": "Cite sources in the text",
            "type": "boolean",
            "description": "Mark quotes and specific figures with the outlet they came from, e.g. [BBC]. Articles written from a single source never carry markers.",
            "default": true
          },
          "minWords": {
            "title": "Minimum article length",
            "minimum": 150,
            "maximum": 1200,
            "type": "integer",
            "description": "Articles shorter than this are rejected and written again.",
            "default": 150
          },
          "fixedHashtags": {
            "title": "Fixed hashtags",
            "type": "array",
            "description": "Your own hashtags, added to every reel caption and Facebook hashtag line, e.g. #yoursite. Leave empty for none of your own.",
            "items": {
              "type": "string"
            }
          },
          "wpUrl": {
            "title": "WordPress site",
            "type": "string",
            "description": "Your site's address, e.g. https://example.com. It must be reachable from the internet. A security plugin or firewall (e.g. Cloudflare) may need to allow requests from Apify."
          },
          "wpUser": {
            "title": "WordPress username",
            "type": "string",
            "description": "The login name of the account that will own the posts (not its display name)."
          },
          "wpAppPassword": {
            "title": "WordPress application password",
            "type": "string",
            "description": "Create one in WordPress under Users → Profile → Application Passwords. It is not your login password, can be revoked at any time, and is stored encrypted here. Spaces are fine."
          },
          "wpStatus": {
            "title": "Post as",
            "enum": [
              "draft",
              "publish"
            ],
            "type": "string",
            "description": "Draft: saved for you to review and publish yourself. Publish: live straight away.",
            "default": "draft"
          },
          "wpCategoryId": {
            "title": "Category ID",
            "minimum": 0,
            "type": "integer",
            "description": "Numeric ID of the category for new posts (shown in the address bar when editing the category). Leave empty for the site's default."
          },
          "seoMetaPrefix": {
            "title": "SEO plugin field prefix",
            "type": "string",
            "description": "Where the SEO title, description and keywords are saved. hmt_ for Head Meta Tags, rank_math_ for Rank Math. The plugin must expose these fields to the REST API, or WordPress silently ignores them: check a post's page source the first time."
          },
          "makeReel": {
            "title": "Make a reel",
            "type": "boolean",
            "description": "Adds a reel for each article written, taking about a minute each. Runs with reels start with 4096 MB of memory instead of 1024 MB, so they cost more to run.",
            "default": false
          },
          "reelStyle": {
            "title": "Reel style",
            "enum": [
              "rotate",
              "presets",
              "basic",
              "clean_used_now:photo",
              "clean_used_now:card",
              "broadcast:photo",
              "broadcast:breaking",
              "magazine:photo",
              "magazine:card",
              "noir:photo",
              "noir:card",
              "captions:karaoke",
              "captions:sticker"
            ],
            "type": "string",
            "description": "Rotate: each reel takes the next of the ten styles, and the order carries on across runs. Mixed presets: a varied plain look. Basic: one fixed plain look. Or pick one style for every reel. The styles are built on the photo: an article without one gets a mixed preset.",
            "default": "rotate"
          },
          "reelBrand": {
            "title": "Name on the reel",
            "type": "string",
            "description": "Your publication's name, shown in the reel's header. If left empty: the site name from Writing, else the site address."
          },
          "reelSiteUrl": {
            "title": "Site address on the reel",
            "type": "string",
            "description": "Shown on the closing card, where the reel sends viewers, e.g. yoursite.com. If left empty: your WordPress site's address, when one is set."
          },
          "reelSection": {
            "title": "Section label",
            "type": "string",
            "description": "A short label some styles show beside the name, e.g. Education or Sport. If left empty: News."
          },
          "reelLogoUrl": {
            "title": "Logo",
            "type": "string",
            "description": "Upload your logo, or give a link to it: a wide PNG with a transparent background works best. Shown large at the top of the closing card; without one, your publication's name goes there instead."
          },
          "stateStoreName": {
            "title": "Memory storage name",
            "type": "string",
            "description": "Name of the key-value store that remembers written stories. Use a different name for each site you run, so their histories stay separate. Letters, digits and hyphens.",
            "default": "news-to-article-state"
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}