# Cross-Platform Username OSINT (`maximedupre/cross-platform-osint-monitoring`) Actor

Check public usernames across selected platform groups without source credentials. Get matched accounts, optional no-match rows, and public profile, post, video, and linked-account details when sources expose them.

- **URL**: https://apify.com/maximedupre/cross-platform-osint-monitoring.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Developer tools, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$36.00 / 1,000 username checks

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## 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

### 🔎 Map Usernames Across Public Platforms

Investigators, researchers, trust and safety teams, and developers can check one or more public usernames across selected platform groups. The Actor returns matched rows and, when requested, no-match rows for the username and platform checks that produce a saved status. Rows can include public profile context when a source exposes it. This gives you a structured starting point for a public username footprint review without source credentials. A shared username is a lead, not proof that accounts belong to the same person.

- Check one username across selected public platforms with **[Cross-platform username search](https://apify.com/maximedupre/cross-platform-osint-monitoring/examples/cross-platform-username-search)**.
- Build a first public account map with **[Digital footprint search](https://apify.com/maximedupre/cross-platform-osint-monitoring/examples/digital-footprint-search)**.
- Check a handle across social sites with **[Social media username checker](https://apify.com/maximedupre/cross-platform-osint-monitoring/examples/social-media-username-checker)**.
- Look for public accounts tied to a username with **[Online username search](https://apify.com/maximedupre/cross-platform-osint-monitoring/examples/online-username-search)**.
- Review where a public username appears with **[Username lookup](https://apify.com/maximedupre/cross-platform-osint-monitoring/examples/username-lookup)**.

#### 📊 See Account Matches and Public Context

Each row names the submitted username and the platform checked. A matched row can include a public profile URL, source account ID, profile details, posts, videos, and accounts linked by the source. A `presence` value of `"noMatch"` is an explicit no-match row when you turn on **Include no-match results**. Uncertain or blocked checks are not saved as rows and are not treated as no-match results.

The Actor saves the first eligible occurrence of a source account for a submitted username and platform. If the same source account is found again during discovery, the later match is ignored. The saved row describes only the first match and does not collect evidence from later matches.

#### ▶️ Check Usernames in One Run

1. Add one or more public usernames.
2. Choose the platform categories to check. Leave the list empty to check all non-sensitive groups.
3. Add public federated server domains only when **Federated** is selected. The list narrows the servers checked and has no effect otherwise.
4. Turn on **Include no-match results** when you need explicit no-match rows for checks that return no public account.
5. Start the run and open the public dataset.

Each submitted username is checked as its own footprint. A single run processes the submitted list independently.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `usernames` | array of strings | Required. Add one or more public usernames. Each username is checked as its own footprint. |
| `platformCategories` | array of strings | Choose `social`, `developer`, `gaming`, `forums`, `media`, `business`, `federated`, or `sensitive`. Leave it empty to check all non-sensitive groups. |
| `federatedServers` | array of strings | Add public federated server domains, such as `mastodon.social`. This list narrows checks only when `federated` is selected and is ignored otherwise. |
| `includeNoMatchResults` | boolean | Default `false`. Turn it on to save an explicit no-match row for each username and platform check that returns no public account. Uncertain or blocked checks stay separate. |

**Example input**

This is the public input from a successful current-beta default-input run:

```json
{
  "usernames": [
    "apify"
  ],
  "platformCategories": [
    "social",
    "developer"
  ],
  "includeNoMatchResults": false
}
```

#### 🧾 Output

The Output tab opens the public default dataset. Every dataset row has `username`, `platform`, and `presence`. Optional fields appear when the source exposes them. The tables below cover the no-match, profile, post, linked-account, and video row forms seen in successful current-beta runs.

**Output link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | URL | Opens the public result rows in the default dataset overview. |

**No-match rows**

| Field | Type | What it does |
| --- | --- | --- |
| `username` | string | The submitted public username. |
| `platform` | string | The public platform checked for this username. |
| `presence` | string | The exact value `"noMatch"` when the source check found no public account and no-match rows were requested. |

**Example no-match row**

This complete row is from a successful current-beta run:

```json
{
  "username": "Gargron",
  "platform": "Bluesky",
  "presence": "noMatch"
}
```

**Matched profile rows**

| Field | Type | What it does |
| --- | --- | --- |
| `username` | string | The submitted public username. |
| `platform` | string | The public platform where the account was matched. |
| `presence` | string | The exact value `"matched"` for a confirmed public account match. |
| `profileUrl` | URL | Direct public URL of the matched account, when exposed. |
| `accountId` | string | Stable public identifier from the source, when exposed. |
| `profile` | object | Public profile fields from the matched account, when exposed. |
| `profile.displayName` | string | Public display name shown by the source. |
| `profile.biography` | string | Public biography or profile description, when exposed. |
| `profile.avatarUrl` | URL | Direct public URL of the account avatar, when exposed. |
| `profile.location` | string | Public location shown by the source, when exposed. |
| `profile.websiteUrl` | URL | Public website listed by the account, when exposed. |
| `profile.followers` | integer | Source-reported follower count, when exposed. |
| `profile.following` | integer | Source-reported following count, when exposed. |
| `profile.postsCount` | integer | Source-reported post count, when exposed. |
| `profile.videosCount` | integer | Source-reported video count, when exposed. |
| `profile.createdAt` | ISO date-time | Source-owned account creation date, when exposed. |
| `profile.lastActiveAt` | ISO date-time | Source-owned last activity date, when exposed. |

**Example matched profile row**

This complete row is from a successful current-beta run:

```json
{
  "username": "Gargron",
  "platform": "GitHub",
  "presence": "matched",
  "profileUrl": "https://github.com/Gargron",
  "accountId": "184731",
  "profile": {
    "displayName": "Eugen Rochko",
    "biography": "Executive Strategy & Product Advisor at Mastodon.",
    "avatarUrl": "https://avatars.githubusercontent.com/u/184731?v=4",
    "location": "Germany",
    "websiteUrl": "https://eugenrochko.com/",
    "followers": 2388,
    "following": 6,
    "createdAt": "2010-01-18T16:30:34.000Z",
    "lastActiveAt": "2026-08-20T11:30:11.000Z"
  }
}
```

**Matched rows with posts and linked accounts**

| Field | Type | What it does |
| --- | --- | --- |
| `username` | string | The submitted public username. |
| `platform` | string | The public platform where the account was matched. |
| `presence` | string | The exact value `"matched"` for a confirmed public account match. |
| `profileUrl` | URL | Direct public URL of the matched account, when exposed. |
| `accountId` | string | Stable public identifier from the source, when exposed. |
| `profile` | object | Public profile fields from the matched account, when exposed. |
| `profile.displayName` | string | Public display name shown by the source. |
| `profile.biography` | string | Public biography or profile description, when exposed. |
| `profile.avatarUrl` | URL | Direct public URL of the account avatar, when exposed. |
| `profile.location` | string | Public location shown by the source, when exposed. |
| `profile.websiteUrl` | URL | Public website listed by the account, when exposed. |
| `profile.followers` | integer | Source-reported follower count, when exposed. |
| `profile.following` | integer | Source-reported following count, when exposed. |
| `profile.postsCount` | integer | Source-reported post count, when exposed. |
| `profile.videosCount` | integer | Source-reported video count, when exposed. |
| `profile.createdAt` | ISO date-time | Source-owned account creation date, when exposed. |
| `profile.lastActiveAt` | ISO date-time | Source-owned last activity date, when exposed. |
| `posts` | array of objects | Public posts from the matched account, when exposed. |
| `posts[].url` | URL | Direct public URL of the post. |
| `posts[].text` | string | Public post text, when exposed. |
| `posts[].publishedAt` | ISO date-time | Source-owned publication date of the post, when exposed. |
| `posts[].author` | object | Public author context shown with the post, when exposed. |
| `posts[].author.username` | string | Public author username. |
| `posts[].author.displayName` | string | Public author display name, when exposed. |
| `posts[].author.profileUrl` | URL | Direct public URL of the author profile. |
| `posts[].media` | array of objects | Public media attached to the post, when exposed. |
| `posts[].media[].type` | string | Source-reported media type. |
| `posts[].media[].url` | URL | Direct public URL of the media file. |
| `posts[].media[].thumbnailUrl` | URL | Direct public URL of a media thumbnail, when exposed. |
| `posts[].engagement` | object | Source-reported post engagement counts, when exposed. |
| `posts[].engagement.likes` | integer | Source-reported like count. |
| `posts[].engagement.comments` | integer | Source-reported comment count. |
| `posts[].engagement.shares` | integer | Source-reported share count. |
| `posts[].engagement.views` | integer | Source-reported view count, when exposed. |
| `linkedAccounts` | array of objects | Other public accounts explicitly linked by the source account. |
| `linkedAccounts[].platform` | string | Platform of the explicitly linked account. |
| `linkedAccounts[].username` | string | Public username of the linked account, when exposed. |
| `linkedAccounts[].profileUrl` | URL | Direct public URL of the explicitly linked account. |

**Example matched row with posts and a linked account**

This is a shortened genuine row from a successful current-beta run. The source row has more posts, so the `posts` array uses `"..."` after its first real post as an omission marker.

```json
{
  "username": "Gargron",
  "platform": "Mastodon",
  "presence": "matched",
  "profileUrl": "https://mastodon.social/@Gargron",
  "accountId": "1",
  "profile": {
    "displayName": "Eugen Rochko",
    "biography": "Executive Strategy & Product Advisor, Founder of @ Mastodon . Film photography, prog metal, Dota 2. Likes all things analog. Luddite.",
    "avatarUrl": "https://files.mastodon.social/accounts/avatars/000/000/001/original/6b2384b33799a0dd.png",
    "websiteUrl": "https://eugenrochko.com/",
    "followers": 382546,
    "following": 742,
    "postsCount": 82267,
    "createdAt": "2016-03-16T00:00:00.000Z",
    "lastActiveAt": "2026-09-15T20:53:55.351Z"
  },
  "posts": [
    {
      "url": "https://mastodon.social/@Gargron/117277041317773052",
      "text": "@ TheBreadmonkey People don’t read. You could’ve put it as the first sentence and someone would’ve missed it.",
      "publishedAt": "2026-09-15T20:53:55.351Z",
      "author": {
        "username": "Gargron",
        "displayName": "Eugen Rochko",
        "profileUrl": "https://mastodon.social/@Gargron"
      },
      "engagement": {
        "likes": 2,
        "comments": 0,
        "shares": 0
      }
    },
    "..."
  ],
  "linkedAccounts": [
    {
      "platform": "GitHub",
      "profileUrl": "https://github.com/Gargron",
      "username": "Gargron"
    }
  ]
}
```

**Matched rows with videos**

| Field | Type | What it does |
| --- | --- | --- |
| `username` | string | The submitted public username. |
| `platform` | string | The public platform where the account was matched. |
| `presence` | string | The exact value `"matched"` for a confirmed public account match. |
| `profileUrl` | URL | Direct public URL of the matched account, when exposed. |
| `accountId` | string | Stable public identifier from the source, when exposed. |
| `profile` | object | Public profile fields from the matched account, when exposed. |
| `profile.displayName` | string | Public display name shown by the source. |
| `profile.biography` | string | Public biography or profile description, when exposed. |
| `profile.avatarUrl` | URL | Direct public URL of the account avatar, when exposed. |
| `profile.location` | string | Public location shown by the source, when exposed. |
| `profile.websiteUrl` | URL | Public website listed by the account, when exposed. |
| `profile.followers` | integer | Source-reported follower count, when exposed. |
| `profile.following` | integer | Source-reported following count, when exposed. |
| `profile.postsCount` | integer | Source-reported post count, when exposed. |
| `profile.videosCount` | integer | Source-reported video count, when exposed. |
| `profile.createdAt` | ISO date-time | Source-owned account creation date, when exposed. |
| `profile.lastActiveAt` | ISO date-time | Source-owned last activity date, when exposed. |
| `videos` | array of objects | Public videos from the matched account, when exposed. |
| `videos[].url` | URL | Direct public URL of the video. |
| `videos[].title` | string | Public video title, when exposed. |
| `videos[].channel` | object | Public channel context shown with the video, when exposed. |
| `videos[].channel.name` | string | Public channel name. |
| `videos[].channel.url` | URL | Direct public URL of the channel, when exposed. |
| `videos[].description` | string | Public video description, when exposed. |
| `videos[].publishedAt` | ISO date-time | Source-owned publication date of the video, when exposed. |
| `videos[].durationSeconds` | number | Source-reported video duration in seconds, when exposed. |
| `videos[].thumbnailUrl` | URL | Direct public URL of the video thumbnail, when exposed. |
| `videos[].engagement` | object | Source-reported video engagement counts, when exposed. |
| `videos[].engagement.views` | integer | Source-reported view count. |
| `videos[].engagement.likes` | integer | Source-reported like count. |
| `videos[].engagement.comments` | integer | Source-reported comment count. |

**Example matched row with videos**

This complete row is from a successful current-beta run:

```json
{
  "username": "dailymotion",
  "platform": "Dailymotion",
  "presence": "matched",
  "profileUrl": "https://www.dailymotion.com/dailymotion",
  "accountId": "x43py0",
  "profile": {
    "displayName": "Dailymotion",
    "biography": "DayOne : Tout commence le jour où on y croit ✨",
    "avatarUrl": "https://s1.dmcdn.net/u/QIeO1ggVYwOsQUoA/720x720",
    "followers": 11944,
    "following": 103,
    "videosCount": 141,
    "createdAt": "2007-05-16T11:45:46.000Z",
    "lastActiveAt": "2026-09-11T09:26:49.000Z"
  },
  "videos": [
    {
      "url": "https://www.dailymotion.com/video/xb6qxim",
      "title": "Bienvenue dans les coulisses de DayOne. Entre deux prise, notre CM est allée poser quelques questions aux ambassadeurs. Et visiblement, certains ont l’âme d’un enquêteur…",
      "publishedAt": "2026-09-11T09:26:49.000Z",
      "durationSeconds": 95,
      "thumbnailUrl": "https://s2.dmcdn.net/v/eKVuk1ge-JI_lLkkV/x720",
      "channel": {
        "name": "Dailymotion",
        "url": "https://www.dailymotion.com/dailymotion"
      },
      "engagement": {
        "views": 76,
        "likes": 1,
        "comments": 0
      }
    },
    {
      "url": "https://www.dailymotion.com/video/xb6qrbe",
      "title": "T’as le projet. Il te manque les moyens pour le faire exister ?Avec #DayOne, Dailymotion peut financer ton projet jusqu’à 50 000€",
      "publishedAt": "2026-09-11T09:17:17.000Z",
      "durationSeconds": 59,
      "thumbnailUrl": "https://s2.dmcdn.net/v/eKTxA1ge-K6Elzlcv/x720",
      "channel": {
        "name": "Dailymotion",
        "url": "https://www.dailymotion.com/dailymotion"
      },
      "engagement": {
        "views": 53,
        "likes": 1,
        "comments": 0
      }
    },
    {
      "url": "https://www.dailymotion.com/video/xb53wii",
      "title": "DayOne - le programme de Dailymotion (Teaser officiel)",
      "description": "Toi aussi, rejoins l’aventure DayOne ! Partage ta vidéo de présentation sur Dailymotion et tente ta chance pour bénéficier d’un accompagnement afin de donner vie au projet de tes rêves. Retrouve toutes les informations et le formulaire d’inscription en bio 😉",
      "publishedAt": "2026-09-07T14:00:07.000Z",
      "durationSeconds": 47,
      "thumbnailUrl": "https://s1.dmcdn.net/v/e9_XQ1gdk3tCuxtxR/x720",
      "channel": {
        "name": "Dailymotion",
        "url": "https://www.dailymotion.com/dailymotion"
      },
      "engagement": {
        "views": 216,
        "likes": 5,
        "comments": 0
      }
    },
    {
      "url": "https://www.dailymotion.com/video/xaz9c66",
      "title": "Entre pole dance et makeup d'envergure... on a demandé à by.indy de nous blazer ses préfs | Le blaze",
      "publishedAt": "2026-08-20T08:00:43.000Z",
      "durationSeconds": 64,
      "thumbnailUrl": "https://s2.dmcdn.net/v/daX3U1gYeQWzeXifk/x720",
      "channel": {
        "name": "Dailymotion",
        "url": "https://www.dailymotion.com/dailymotion"
      },
      "engagement": {
        "views": 221,
        "likes": 0,
        "comments": 0
      }
    },
    {
      "url": "https://www.dailymotion.com/video/xawfgp2",
      "title": "On ne juge pas mais on jauge avec @amahgauche | La jauge",
      "publishedAt": "2026-08-10T11:23:40.000Z",
      "durationSeconds": 90,
      "thumbnailUrl": "https://s1.dmcdn.net/v/dIOf61gXD_hrzU7vi/x720",
      "channel": {
        "name": "Dailymotion",
        "url": "https://www.dailymotion.com/dailymotion"
      },
      "engagement": {
        "views": 255,
        "likes": 1,
        "comments": 0
      }
    }
  ]
}
```

#### 💳 Pricing

The Actor uses pay-per-event pricing. The current primary event is $0.036 for each submitted username check. The event is tied to the check, not to the number of rows it saves. No-match rows are written only when requested, and uncertain or blocked checks are not turned into no-match rows.

#### 🔌 Integrations

Read the dataset in the Apify Console or through the standard Apify API. Export the structured rows for your own workflow. The Actor uses public source data and does not need source credentials.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### How should I read `noMatch`?

It means the selected source check found no public account for that username, and the check was saved as an explicit no-match row. It does not prove that the username is unused everywhere.

##### When should I include no-match results?

Turn it on when your review needs explicit no-match rows for username and platform checks that return no public account. Leave it off when you only want matched accounts and their public details.

##### What happens when a source is uncertain or blocked?

The check is kept separate from `noMatch`. The Actor does not treat an uncertain or blocked source as proof that an account is absent, and those checks are not saved as dataset rows.

##### Can I check several usernames in one run?

Yes. Add each public username to the list. The Actor checks each submitted username as its own footprint in the same run.

##### What does an empty platform category list do?

It checks all non-sensitive platform groups. Sensitive public platforms are checked only when you select **Sensitive public platforms**.

##### How do federated servers affect a run?

Select **Federated** to check public federated accounts. Add server domains to narrow that check. The server list has no effect when **Federated** is not selected.

##### Does a shared username prove two accounts belong to one person?

No. A shared username shows public account presence on each source. It is not proof of common ownership or an identity verdict.

##### Will every matched row include posts or videos?

No. Posts, videos, profile fields, engagement counts, and linked accounts appear only when the source exposes them for that match. The tables above show the fields that can be present.

##### Does this run continuously monitor accounts?

Each run checks the usernames you submit. Run it again when you need a new check, but the Actor does not combine separate runs or claim change history.

##### Can it access private or login-gated accounts?

No. It uses public source access and does not bypass privacy controls, login gates, or other access limits.

### 📝 Changelog

**v0.0** (16-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~cross-platform-osint-monitoring/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Instagram Profile Stats Scraper](https://apify.com/maximedupre/instagram-profile-stats-scraper): Enrich a matched Instagram username with public profile stats, links, and recent post previews.
- [TikTok Creator Analytics Scraper](https://apify.com/maximedupre/tiktok-creator-analytics): Review public TikTok profile, audience, and recent post metrics for a matched handle.
- [Twitter Scraper](https://apify.com/maximedupre/twitter-scraper): Follow a public X account match with profile or post data, links, and engagement fields.
- [Telegram Info Scraper](https://apify.com/maximedupre/telegram-info-scraper): Inspect a matched public Telegram username, channel, group, or bot.
- [Influencer Scraper](https://apify.com/maximedupre/influencer-scraper): Compare public creator profiles across TikTok, Instagram, and YouTube from handles or profile URLs.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `usernames` (type: `array`):

Enter one or more public usernames to check. Each username is checked as its own footprint.

## `platformCategories` (type: `array`):

Choose the platform groups to check. Leave this empty to check all non-sensitive groups. Sensitive public platforms are checked only when you select Sensitive public platforms.

## `federatedServers` (type: `array`):

Add public federated server domains, such as mastodon.social. This list narrows the servers checked when Federated is selected and has no effect otherwise.

## `includeNoMatchResults` (type: `boolean`):

Turn this on to keep an explicit no-match result for every username and platform check that finds no public account. Uncertain or blocked checks stay labeled separately.

## Actor input object example

```json
{
  "usernames": [
    "apify"
  ],
  "platformCategories": [
    "social",
    "developer"
  ],
  "includeNoMatchResults": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the public result rows.

# 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 = {
    "usernames": [
        "apify"
    ],
    "platformCategories": [
        "social",
        "developer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/cross-platform-osint-monitoring").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 = {
    "usernames": ["apify"],
    "platformCategories": [
        "social",
        "developer",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/cross-platform-osint-monitoring").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 '{
  "usernames": [
    "apify"
  ],
  "platformCategories": [
    "social",
    "developer"
  ]
}' |
apify call maximedupre/cross-platform-osint-monitoring --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/cross-platform-osint-monitoring"
        }
    }
}
```

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/k4x8wbJlTX0cGccs0/builds/nV0VxHk0neBE5UHcJ/openapi.json
