# Athena Social Orchestrator (`ranil/athena-social-orchestrator`) Actor

Detects the platform of each public URL (X/Twitter, Instagram, TikTok, Facebook, Reddit, LinkedIn, YouTube, Medium), calls public Apify Store actors in a fallback chain, filters placeholder rows and emits the shared normalized post output.

- **URL**: https://apify.com/ranil/athena-social-orchestrator.md
- **Developed by:** [Rani-L](https://apify.com/ranil) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Athena Social Orchestrator

Scrape public posts from **8 social networks with one Actor and one output format**: X (Twitter), Instagram, TikTok, Facebook, Reddit, LinkedIn, YouTube and Medium.

Give it a list of public URLs (profiles, pages, channels, subreddits, posts or videos). For each URL, Athena detects the platform and runs a curated chain of well-rated Apify Store Actors. If one fails, returns nothing or returns placeholder/error rows, it tries the next one. Every result is converted to **one normalized post schema**, whichever Actor produced it.

### Why use it

- **One input, one output.** You don't have to learn eight different input and output schemas.
- **Fallback chains.** Each platform has a curated list of Actors, tried in order. The list was chosen from live test runs.
- **No fake successes.** Placeholder rows such as `{"noResults": true}`, `{"demo": true}` or `{"error": "no_items", ...}` are discarded, and the next Actor is tried.
- **Honest data.** Unknown counts are `null`, never `0`. Dates are ISO 8601 or `null`, never epoch numbers. `url` always points to the post, never to a media file.
- **Transparent runs.** A `RUN_SUMMARY` record lists, for every URL, which Actors were tried, how long each took and why each one failed.

### Supported platforms and Actor chains

The Actors are tried in this order. Entries marked *(last resort)* run only after every other Actor for that platform has failed.

| Platform    | Actors                                                                                                                                                |
| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| X / Twitter | `apidojo/tweet-scraper`, `apidojo/twitter-scraper-lite`, `xquik/x-tweet-scraper`                                                                      |
| Instagram   | `apify/instagram-scraper`, `apify/instagram-api-scraper`                                                                                              |
| TikTok      | `clockworks/tiktok-scraper` (profile URLs are sent as a handle), `apidojo/tiktok-scraper`, `apidojo/tiktok-scraper-api`                               |
| Facebook    | `apify/facebook-posts-scraper`, `apify/facebook-groups-scraper`                                                                                       |
| Reddit      | `harshmaur/reddit-scraper`, `fatihtahta/reddit-scraper-search-fast`, `practicaltools/apify-reddit-api`, `trudax/reddit-scraper-lite` *(last resort)*  |
| LinkedIn    | `harvestapi/linkedin-profile-posts`, `supreme_coder/linkedin-post`, `harvestapi/linkedin-profile-scraper` *(last resort, returns the profile record)* |
| YouTube     | `streamers/youtube-scraper`, `apidojo/youtube-scraper`, `streamers/youtube-channel-scraper` *(last resort)*                                           |
| Medium      | `automation-lab/medium-scraper` (author, publication and tag pages), `apify/website-content-crawler` *(last resort)*                                  |

`old.reddit.com` URLs are rewritten to `www.reddit.com`. Any other host is reported as `unsupported`; Athena never guesses the platform.

### Input

| Field                     | Type             | Default     | Description                                                                                      |
| ------------------------- | ---------------- | ----------- | ------------------------------------------------------------------------------------------------ |
| `urls`                    | array of strings | required    | 1 to 100 public URLs.                                                                            |
| `maxItemsPerUrl`          | integer          | 20          | Maximum posts per URL (1 to 100).                                                                |
| `concurrency`             | integer          | 3           | How many URLs are processed at the same time (1 to 10).                                          |
| `childTimeoutSecs`        | integer          | 120         | Timeout for each Store Actor run. It is also capped to this run's remaining time.                |
| `childMemoryMbytes`       | integer          | 1024        | Memory for each Store Actor run, in MB. Must be a power of 2 from 128 to 32768.                  |
| `maxChargeUsdPerChildRun` | number           | 0.50        | Cost cap for each Store Actor run, in USD. `clockworks/tiktok-scraper` refuses caps below $0.50. |
| `proxyConfiguration`      | object           | Apify Proxy | Ignored by this Actor. It exists only so both Athena Actors share the same input.                |

Example:

```json
{
    "urls": [
        "https://x.com/nasa",
        "https://www.instagram.com/nasa/",
        "https://www.reddit.com/r/golang/",
        "https://www.youtube.com/@GoogleDevelopers"
    ],
    "maxItemsPerUrl": 10
}
```

### Output

Each dataset item is one post:

```json
{
    "platform": "reddit",
    "inputUrl": "https://www.reddit.com/r/golang/",
    "id": "1wmm0au",
    "url": "https://www.reddit.com/r/golang/comments/1wmm0au/small_projects/",
    "text": "Small Projects\n\nThis is the weekly thread for small projects...",
    "createdAt": "2026-09-21T13:00:31.000Z",
    "author": { "username": "AutoModerator", "displayName": null, "url": null, "followers": null, "verified": null },
    "stats": { "likes": 12, "comments": 34, "shares": null, "views": null },
    "media": [],
    "source": { "kind": "store-actor", "name": "harshmaur~reddit-scraper" },
    "fetchedAt": "2026-09-24T02:40:51.123Z"
}
```

The values above illustrate the shape; they are not taken from a real run.

The key-value store holds a `RUN_SUMMARY` record with totals and, for each URL:

- its platform and status (`succeeded`, `failed` or `unsupported`);
- the number of items and the latency;
- every attempt, with its source Actor, result, latency and error.

The record is also written while the run is in progress, so an aborted run still leaves a partial summary. Failures are reported only there and never become dataset rows.

### Cost

This Actor runs with 256 MB of memory and spends most of its time waiting. **Most of the cost comes from the Store Actors it calls.** Those runs are billed to your account at their own prices (pay per result or pay per event). `maxItemsPerUrl` and `maxChargeUsdPerChildRun` limit how much each call can spend.

### Limitations

- **Public Store Actors must be allowed on your account.** If your plan refuses them (`public-actor-disabled`) or you reach your monthly usage limit, the run stops making calls after the first refusal. Every remaining URL is marked `failed` with that reason.
- **Some Actors have weaker test coverage.** `apify/facebook-groups-scraper` was checked only against its input schema, not with a live run.
- **Medium article URLs usually fail.** Only the last-resort crawler handles them, and it needs about 55 s.
- **Results depend on third-party Actors.** Their behaviour and pricing can change, and the platforms' own terms of service apply to the data you collect.

# Actor input Schema

## `urls` (type: `array`):

Public URLs of profiles, channels, subreddits or posts (X/Twitter, Instagram, TikTok, Facebook, Reddit, LinkedIn, YouTube, Medium).

## `maxItemsPerUrl` (type: `integer`):

Maximum number of items collected for each URL.

## `proxyConfiguration` (type: `object`):

Proxy settings. Ignored by Athena Social Orchestrator (it calls Store actors, which use their own proxies). Athena Social Scraper uses it for its browser fallback and for the HTTP techniques that need a proxy (LinkedIn, Reddit, Instagram).

## `concurrency` (type: `integer`):

Number of URLs processed in parallel.

## `childTimeoutSecs` (type: `integer`):

Timeout of each child Store actor run.

## `childMemoryMbytes` (type: `integer`):

Memory of each child Store actor run. Must be a power of 2 between 128 and 32768.

## `maxChargeUsdPerChildRun` (type: `number`):

Maximum total charge of each child run (maxTotalChargeUsd). clockworks/tiktok-scraper refuses caps below 0.50.

## Actor input object example

```json
{
  "urls": [
    "https://medium.com/@netflixtechblog",
    "https://www.youtube.com/@GoogleDevelopers"
  ],
  "maxItemsPerUrl": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "concurrency": 3,
  "childTimeoutSecs": 120,
  "childMemoryMbytes": 1024,
  "maxChargeUsdPerChildRun": 0.5
}
```

# Actor output Schema

## `posts` (type: `string`):

Normalized posts: platform, inputUrl, id, url (post link), text, createdAt (ISO 8601 or null), author, stats (null when unknown, never 0 by default), media, source and fetchedAt. Failures never appear here; see Run summary.

## `runSummary` (type: `string`):

RUN_SUMMARY record: totals and, for every input URL, its platform, status (succeeded, failed or unsupported), item count, latency and each Store actor attempt with its error.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://medium.com/@netflixtechblog",
        "https://www.youtube.com/@GoogleDevelopers"
    ],
    "maxItemsPerUrl": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("ranil/athena-social-orchestrator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": [
        "https://medium.com/@netflixtechblog",
        "https://www.youtube.com/@GoogleDevelopers",
    ],
    "maxItemsPerUrl": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("ranil/athena-social-orchestrator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://medium.com/@netflixtechblog",
    "https://www.youtube.com/@GoogleDevelopers"
  ],
  "maxItemsPerUrl": 3
}' |
apify call ranil/athena-social-orchestrator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ranil/athena-social-orchestrator"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Pm5unuxhSgTTX5J02/builds/vu4ATodW1PeB8oahg/openapi.json
