{
  "openapi": "3.0.1",
  "info": {
    "title": "Truth Social Scraper - Posts, Replies, Profiles & Media",
    "description": "Scrape Truth Social posts, replies, media and profiles by handle or post URL: text, likes, ReTruths, replies, video links, quotes, polls and author stats. Date filters, pinned posts and a monitor that also flags edited and deleted posts. No login. $1.40 per 1,000 posts.",
    "version": "0.1",
    "x-build-id": "9bhhrmO2WvNMGCGKU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/topapi~truth-social-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-topapi-truth-social-scraper",
        "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/topapi~truth-social-scraper/runs": {
      "post": {
        "operationId": "runs-sync-topapi-truth-social-scraper",
        "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/topapi~truth-social-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-topapi-truth-social-scraper",
        "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": {
          "profiles": {
            "title": "👤 Profiles",
            "type": "array",
            "description": "Handles or profile URLs, e.g. \"realDonaldTrump\", \"@WhiteHouse\", \"https://truthsocial.com/@DonaldJTrumpJr\". Newest posts first, 20 per page.",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "🔗 Post URLs or ids",
            "type": "array",
            "description": "Single posts, e.g. \"https://truthsocial.com/@realDonaldTrump/posts/117394656543560911\" or \"117394656543560911\". One row per post; a deleted or wrong id gives a free error row. The filters do not apply to posts asked for by URL or id. In monitor mode each post comes once per memory; maxItems and the run's maximum charge still count them.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeLandingFeed": {
            "title": "📰 Include the landing feed",
            "type": "boolean",
            "description": "Also read the posts Truth Social shows signed-out visitors on its home page (about 11 recent posts from Trump, the White House, cabinet members and news accounts).",
            "default": false
          },
          "contentType": {
            "title": "📄 Content to scrape",
            "enum": [
              "posts",
              "replies",
              "posts-and-replies",
              "profile-details"
            ],
            "type": "string",
            "description": "What to read from each profile. Replies carry the post they answer in inReplyTo. Profile details = one profile row per handle and no posts.",
            "default": "posts"
          },
          "onlyMedia": {
            "title": "🖼️ Only posts with media",
            "type": "boolean",
            "description": "Only posts with a photo or video (the profile's Media tab).",
            "default": false
          },
          "includePinned": {
            "title": "📌 Include pinned posts",
            "type": "boolean",
            "description": "Also read the posts each profile pinned to its top (marked isPinned, delivered first). Fills pinnedPostIds on the profile row. The date and id filters apply to pinned posts too.",
            "default": false
          },
          "includeMuted": {
            "title": "🔇 Include muted posts",
            "type": "boolean",
            "description": "Include posts Truth Social marks as muted (its with_muted switch on timelines and pinned posts; landing-feed posts by their muted flag). On by default, as on the site.",
            "default": true
          },
          "postedAfter": {
            "title": "📅 Posted after",
            "type": "string",
            "description": "Only posts newer than this: a date (2026-09-01, 2026-09-01T12:00:00Z) or relative (7 days, 12 hours, 2 weeks). The timeline stops at the first older post; older pinned and landing-feed posts are skipped."
          },
          "postedBefore": {
            "title": "📅 Posted before",
            "type": "string",
            "description": "Only posts older than this date (or relative, e.g. 30 days). A bare date means 00:00 UTC, so that day itself is left out: for 15-17 September use 2026-09-18. The walk jumps straight to that date, so a past window costs only its own pages; newer pinned and landing-feed posts are skipped. Ignored in monitor mode."
          },
          "includeReblogs": {
            "title": "🔁 Include ReTruths",
            "type": "boolean",
            "description": "Keep reposts (ReTruths). Each carries the original post in reblog and its URL in rebloggedFromUrl.",
            "default": true
          },
          "keywords": {
            "title": "🔤 Keywords",
            "type": "array",
            "description": "Keep only posts whose text (or the reposted / quoted text, link title, hashtags) contains any of these words, case-insensitive, e.g. \"tariff\", \"China\".",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minFavourites": {
            "title": "❤️ Minimum likes",
            "minimum": 0,
            "maximum": 100000000,
            "type": "integer",
            "description": "Keep only posts with at least this many likes (favouritesCount). 0 = no minimum. In monitor mode a post is judged once, when it is first seen.",
            "default": 0
          },
          "includeProfile": {
            "title": "👤 Include a profile row",
            "type": "boolean",
            "description": "One profile row per handle (followers, posts count, bio, website, verified, join date, averages of the posts read). Charged as the profile event ($0.004). Monitor mode: only on a handle's first run; a profile-details monitor then returns it only when a profile field changed.",
            "default": true
          },
          "monitorMode": {
            "title": "🔁 Monitor mode (only new posts)",
            "type": "boolean",
            "description": "Return only posts not delivered by earlier runs. With edit/delete notices off, a quiet account costs one lookup and no timeline call. Memory is kept per handle and content type, for post URLs and for the landing feed. A profile's first run returns its newest posts up to Max posts per profile. If maxItems or the run's maximum charge stops a run early, or a later run reaches Max posts per profile before it gets back to the previous run's posts, the rest is left for the next run.",
            "default": false
          },
          "monitorStoreName": {
            "title": "🗂️ Monitor memory name",
            "type": "string",
            "description": "Named key-value store that keeps the memory. Use a different name per independent schedule.",
            "default": "truth-social-monitor"
          },
          "emitEdited": {
            "title": "✏️ Report edited posts",
            "type": "boolean",
            "description": "Monitor mode: a watched post whose text was edited since the last run comes back once as a free row with recordType \"edited\" and previousText.",
            "default": false
          },
          "emitDeleted": {
            "title": "🗑️ Report deleted posts",
            "type": "boolean",
            "description": "Monitor mode: a post among the newest 20 at the last run that is now gone (confirmed 404) comes back once as a free row with recordType \"deleted\".",
            "default": false
          },
          "peek": {
            "title": "👀 Peek (don't update the memory)",
            "type": "boolean",
            "description": "Monitor mode: return what is new but leave the memory as it was, so the next run sees the same posts as new.",
            "default": false
          },
          "sinceId": {
            "title": "⏭️ Only posts newer than id",
            "type": "string",
            "description": "One-off: only posts with an id above this one (a post id from an earlier run), e.g. \"117394656543560911\". Applies to pinned and landing-feed posts too."
          },
          "maxId": {
            "title": "⏮️ Start below post id",
            "type": "string",
            "description": "Resume a backfill: start the walk below this post id (pinned and landing-feed posts at or above it are skipped). RUN_SUMMARY prints nextMaxId for each profile when a run stops on a cap."
          },
          "maxPostsPerProfile": {
            "title": "🔢 Max posts per profile",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Posts per profile (and for the landing feed). 0 = everything Truth Social serves, up to 20,000 posts per profile per run (measured: 1,000 posts back about 6 weeks on Trump's profile); continue a longer backfill with maxId = the nextMaxId in RUN_SUMMARY.",
            "default": 100
          },
          "maxItems": {
            "title": "🧮 Max posts per run",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Cap on post rows for the whole run, across all inputs. 0 = no run cap. Profile rows are not counted.",
            "default": 0
          },
          "compact": {
            "title": "🤏 Compact output",
            "type": "boolean",
            "description": "Core fields only (id, url, text, date, counts, media and link URLs, author, input line), sized for AI agents and MCP.",
            "default": false
          },
          "includeRaw": {
            "title": "🧾 Include the raw object",
            "type": "boolean",
            "description": "Add Truth Social's own JSON object to every row (raw), for fields not mapped above.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy",
            "type": "object",
            "description": "Residential (default) passes Truth Social's Cloudflare on 39 of 40 measured exits. Apify's own IPs and most datacenter IPs are blocked or challenged.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "apifyProxyCountry": "US"
            }
          },
          "maxConcurrency": {
            "title": "⚡ Parallel exits",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "Profiles read in parallel, each proxy exit kept under Truth Social's limit of 6 timeline pages per minute. More exits = faster deep runs.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}