{
  "data": {
    "similar": [
      {
        "grade": "BB",
        "json": "https://www.anchorterminal.com/tools/google-ads-api.json",
        "name": "Google Ads API",
        "score": 76.4,
        "shared": [
          "ads.reporting",
          "ads.campaigns",
          "ads.budgets",
          "ads.audiences",
          "ads.creatives"
        ],
        "slug": "google-ads-api"
      },
      {
        "grade": "B",
        "json": "https://www.anchorterminal.com/tools/meta-marketing-api.json",
        "name": "Meta Marketing API",
        "score": 67.7,
        "shared": [
          "ads.reporting",
          "ads.campaigns",
          "ads.budgets",
          "ads.audiences",
          "ads.creatives"
        ],
        "slug": "meta-marketing-api"
      },
      {
        "grade": "B",
        "json": "https://www.anchorterminal.com/tools/linkedin-marketing-api.json",
        "name": "LinkedIn Marketing APIs",
        "score": 62.4,
        "shared": [
          "ads.reporting",
          "ads.campaigns",
          "ads.budgets",
          "ads.audiences",
          "ads.creatives"
        ],
        "slug": "linkedin-marketing-api"
      },
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/microsoft-advertising-api.json",
        "name": "Microsoft Advertising API",
        "score": 60.3,
        "shared": [
          "ads.reporting",
          "ads.campaigns",
          "ads.budgets",
          "ads.audiences",
          "ads.creatives"
        ],
        "slug": "microsoft-advertising-api"
      },
      {
        "grade": "C",
        "json": "https://www.anchorterminal.com/tools/amazon-ads-api.json",
        "name": "Amazon Ads API",
        "score": 59,
        "shared": [
          "ads.reporting",
          "ads.campaigns",
          "ads.budgets",
          "ads.audiences",
          "ads.creatives"
        ],
        "slug": "amazon-ads-api"
      },
      {
        "grade": "D",
        "json": "https://www.anchorterminal.com/tools/snapchat-ads.json",
        "name": "Snapchat Ads API",
        "score": 50.4,
        "shared": [
          "ads.reporting",
          "ads.campaigns",
          "ads.budgets",
          "ads.audiences",
          "ads.creatives"
        ],
        "slug": "snapchat-ads"
      }
    ],
    "tool": {
      "slug": "x-ads",
      "name": "X Ads API",
      "vendor": "X Corp.",
      "vendorUrl": "https://docs.x.com/x-ads-api/introduction",
      "kind": "http-api",
      "category": "advertising",
      "summary": "X's Ads API creates and manages campaigns, line items, targeting, creatives and audiences on X and returns performance analytics. Agents call versioned REST endpoints at ads-api.x.com with OAuth 1.0a, or use the X Ads MCP server with OAuth 2.0.",
      "url": "https://www.anchorterminal.com/tools/x-ads",
      "markdownUrl": "https://www.anchorterminal.com/tools/x-ads.md",
      "slimMarkdownUrl": "https://www.anchorterminal.com/tools/x-ads.min.md",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/x-ads.json",
      "license": "Proprietary service under the X Developer Agreement and its incorporated Developer Policy",
      "transports": [
        "http"
      ],
      "remoteUrl": "https://ads-api.x.com/mcp",
      "packages": [],
      "auth": "oauth",
      "authNotes": "Access needs approval. A person creates an app in the X Developer Console and requests Ads API access with the Ads API Access Form, which the docs say is reviewed within three business days, at the Conversion Only or Standard Access tier. The MCP page instead says selecting Ads Project under Project Access enables Ads API access for the app. REST calls are signed with OAuth 1.0a using the app key and a user access token from the three-legged or PIN flow. The docs say these tokens do not expire and the user can revoke them. The X Ads MCP server uses OAuth 2.0 with PKCE and the scopes `ads.read`, `ads.write`, `media.write` and `offline.access`. Calls act with the user's ad account role.",
      "pricing": "free",
      "pricingNotes": "No fee for Ads API access was found in the pages read, and the X API pricing page does not mention the Ads API. Ad spend is billed to the ad account's funding instrument, and advertising prices were not read. The sandbox host creates test accounts and funding instruments and never serves ads, so an approved app can start without spend. Whether a developer account needs a payment card was not established (checked 2026-10-09).",
      "priceSummary": "Free",
      "where": "hosted",
      "x402": {
        "level": "no",
        "evidence": "No x402, MPP or L402 in the Ads API documentation, the X API pricing page or the Developer Agreement (checked 2026-10-09).",
        "endpoints": []
      },
      "toolCount": null,
      "popularity": {
        "githubStars": null,
        "npmWeekly": null,
        "pypiWeekly": null,
        "asOf": "2026-10-09"
      },
      "docsUrl": "https://docs.x.com/x-ads-api/introduction",
      "llmsTxt": "https://docs.x.com/x-ads-api/llms.txt",
      "capabilities": [
        "ads.reporting",
        "ads.campaigns",
        "ads.budgets",
        "ads.audiences",
        "ads.creatives"
      ],
      "tags": [
        "hosted",
        "free",
        "oauth",
        "mcp",
        "llms-txt",
        "sandbox",
        "approval-required",
        "closed-source"
      ],
      "lastRelease": "2026-09-17",
      "graded": true,
      "anchor": {
        "graded": true,
        "score": 57.3,
        "grade": "C",
        "agentReady": false,
        "rank": 616,
        "ranked": true,
        "rankOf": 950,
        "categoryRank": 6,
        "methodology": "0.4",
        "run": "2026-10-01",
        "scores": {
          "ergonomics": 62,
          "maintenance": 63,
          "payments": 20,
          "reliability": 75,
          "schema": 64,
          "security": 48,
          "transparency": 62
        },
        "pending": [
          "performance",
          "tasks"
        ],
        "breakdown": [
          {
            "key": "reliability",
            "name": "Reliability",
            "weight": 16,
            "effectiveWeight": 20,
            "score": 75,
            "points": 15,
            "reason": "Read with the hosted lines, grading the public REST API. A status page is linked at developer.x.com/status, though it is script-drawn and its component list was not read, so whether it has an Ads API component is not established (15 of 20). The incident history at docs.x.com/incidents says it covers the Ads API. Its latest entry ended on 1 July 2026, so the 90 days to 9 October show none, and no entry in 2026 names the Ads API. Whether Ads API incidents are recorded there is not established (25 of 30). Rate limits are published by endpoint type, such as 450 writes a minute and 10,000 core entity reads per 15 minutes (15). The analytics guide says to wait for `x-rate-limit-reset` after a 429 and for `retry-after` after a 503. No idempotency key or safe-retry guidance for writes was found (10 of 15). No SLA was found (0). Version 12 is the current, generally available version (10). Total 75."
          },
          {
            "key": "performance",
            "name": "Performance",
            "weight": 10,
            "effectiveWeight": 0,
            "pending": true,
            "points": 0,
            "reason": "Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes."
          },
          {
            "key": "schema",
            "name": "Schema \u0026 documentation",
            "weight": 13,
            "effectiveWeight": 16.25,
            "score": 64,
            "points": 10.4,
            "reason": "No OpenAPI file covers the Ads API. The published file (version 2.170, 178 paths) describes api.x.com only. A Postman collection is linked and was not read (5 of 25). The docs have an llms.txt index for the Ads API and a Markdown twin for every page (10). Reference pages describe each endpoint and guides cover objectives, targeting, pacing and analytics, with little on when not to use an endpoint (14 of 20). Parameters are typed, with required and optional flags, defaults, ranges and 41 lists of possible values in the campaign management reference. Targeting values are looked up through separate endpoints (11 of 15). Each endpoint has an example request and response. The errors page lists about 77 error constants with HTTP codes and no explanation for each (11 of 15). Versions are in the URL path with a table of introduction and end-of-life dates, and a dated changelog with an RSS feed. Version 12 dates from 27 October 2022 and changes since then ship in place (13 of 15). Total 64."
          },
          {
            "key": "ergonomics",
            "name": "Agent ergonomics",
            "weight": 13,
            "effectiveWeight": 16.25,
            "score": 62,
            "points": 10.07,
            "reason": "Lists take `count` from 1 to 1,000 and filters by ID. No field selection on entity reads was found, and the campaign management reference is about 274 KB of Markdown. The MCP server lists 74 tools, which can be narrowed by scope (14 of 25). Cursor paging, `sort_by`, name search with `q`, `with_deleted`, `with_draft`, asynchronous analytics jobs and an Active Entities endpoint that says which entities changed (18 of 20). Errors carry a constant `code`, a `message` and often the `parameter` and `details` (15 of 20). No idempotency key was found. Batch endpoints take up to 40 items and succeed or fail as a group, PUT changes only the fields sent, and the sandbox host never serves ads. MCP tool annotations were not read (8 of 20). REST calls need an OAuth 1.0a signature on each request. The official Python and Ruby SDKs are at v11.0.0 from May 2022, one API version behind (7 of 15). Total 62."
          },
          {
            "key": "security",
            "name": "Security \u0026 auth",
            "weight": 14,
            "effectiveWeight": 17.5,
            "score": 48,
            "points": 8.4,
            "reason": "REST calls use OAuth 1.0a with an app key and a user access token. The docs say these tokens do not expire, the user can revoke them, and app keys last until regenerated. The MCP server uses OAuth 2.0 with PKCE, scopes `ads.read`, `ads.write` and `media.write`, access tokens of about two hours and rotating refresh tokens. The manual token example in the MCP docs uses `code_challenge_method=plain` with a fixed verifier (24 of 30). Account-level roles include Campaign analyst and Organic analyst, the `ads.read` scope gives a read-only MCP session, MCP writes are created paused with separate activation tools, and the sandbox never serves. No confirmation step for a write was found (15 of 20). Lead exports, post text and audience names are third-party text, and no prompt-injection guidance was found in the Ads API or MCP pages (4 of 15). No audit log or change history endpoint was found. Deleted entities remain readable with `with_deleted=true` (2 of 15). x.com's robots.txt closes its security.txt to us, developer.x.com and docs.x.com return 404 for the file, and no certification or bounty statement was found in the pages read (3 of 20). Total 48."
          },
          {
            "key": "payments",
            "name": "Payments \u0026 pricing",
            "weight": 10,
            "effectiveWeight": 12.5,
            "score": 20,
            "points": 2.5,
            "reason": "No x402, MPP or L402 (0). No page read states a fee for Ads API access, and the X API pricing page does not mention the Ads API. Advertising prices were not read (10). The sandbox creates test accounts and funding instruments at no stated cost. Whether a developer account or an Ads app needs a payment card was not established (10). A person has to create a developer app, request Ads API access and consent in a browser (0). Total 20."
          },
          {
            "key": "tasks",
            "name": "Task success",
            "weight": 10,
            "effectiveWeight": 0,
            "pending": true,
            "points": 0,
            "reason": "Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored."
          },
          {
            "key": "maintenance",
            "name": "Maintenance \u0026 community",
            "weight": 7,
            "effectiveWeight": 8.75,
            "score": 63,
            "points": 5.51,
            "reason": "The latest changelog entry labelled X Ads API is dated 17 September 2026, 22 days before the check (30). Four Ads API entries fall in the 90 days to 9 October 2026, on 13 August and 15, 16 and 17 September (20). Closed service with a dated changelog and RSS feed. The developer forum's robots.txt closes it to us, so replies there were not read (8 of 15). The two official SDKs, for Python and Ruby, were last tagged v11.0.0 on 27 May 2022 and target API version 11 (3 of 15). Both SDK repositories have CI workflows, with no commit since May 2022 (2 of 10). Total 63."
          },
          {
            "key": "transparency",
            "name": "Transparency \u0026 trust",
            "weight": 7,
            "effectiveWeight": 8.75,
            "score": 62,
            "points": 5.43,
            "note": "editorial 40, provenance 84",
            "reason": "Editorial half only. Closed service with clear terms. The Developer Agreement was last updated on 27 April 2026 and names X Corp. or X Internet Unlimited Company by the developer's location (15 of 30). The privacy policy at x.com/privacy is closed to us by robots.txt and was not read. The Conversion API page sets SHA256 hashing for email and phone. No data processing agreement or retention period for advertiser data was found in the pages read (8 of 30). The versions page gives introduction, deprecation and end-of-life dates for 13 versions and promises six months of overlap and 90 days' notice for a breaking change outside a version. The `video_total_views` metric was redefined on 13 August 2026 with a changelog entry dated the same day, and the Developer Agreement allows X to change or discontinue any feature (17 of 20). No sub-processor list or data location statement was found in the pages read (0 of 20). Total 40."
          }
        ],
        "assessment": {
          "date": "2026-10-09",
          "basis": "public evidence",
          "confidence": "medium",
          "notes": {
            "ergonomics": "Lists take `count` from 1 to 1,000 and filters by ID. No field selection on entity reads was found, and the campaign management reference is about 274 KB of Markdown. The MCP server lists 74 tools, which can be narrowed by scope (14 of 25). Cursor paging, `sort_by`, name search with `q`, `with_deleted`, `with_draft`, asynchronous analytics jobs and an Active Entities endpoint that says which entities changed (18 of 20). Errors carry a constant `code`, a `message` and often the `parameter` and `details` (15 of 20). No idempotency key was found. Batch endpoints take up to 40 items and succeed or fail as a group, PUT changes only the fields sent, and the sandbox host never serves ads. MCP tool annotations were not read (8 of 20). REST calls need an OAuth 1.0a signature on each request. The official Python and Ruby SDKs are at v11.0.0 from May 2022, one API version behind (7 of 15). Total 62.",
            "maintenance": "The latest changelog entry labelled X Ads API is dated 17 September 2026, 22 days before the check (30). Four Ads API entries fall in the 90 days to 9 October 2026, on 13 August and 15, 16 and 17 September (20). Closed service with a dated changelog and RSS feed. The developer forum's robots.txt closes it to us, so replies there were not read (8 of 15). The two official SDKs, for Python and Ruby, were last tagged v11.0.0 on 27 May 2022 and target API version 11 (3 of 15). Both SDK repositories have CI workflows, with no commit since May 2022 (2 of 10). Total 63.",
            "payments": "No x402, MPP or L402 (0). No page read states a fee for Ads API access, and the X API pricing page does not mention the Ads API. Advertising prices were not read (10). The sandbox creates test accounts and funding instruments at no stated cost. Whether a developer account or an Ads app needs a payment card was not established (10). A person has to create a developer app, request Ads API access and consent in a browser (0). Total 20.",
            "reliability": "Read with the hosted lines, grading the public REST API. A status page is linked at developer.x.com/status, though it is script-drawn and its component list was not read, so whether it has an Ads API component is not established (15 of 20). The incident history at docs.x.com/incidents says it covers the Ads API. Its latest entry ended on 1 July 2026, so the 90 days to 9 October show none, and no entry in 2026 names the Ads API. Whether Ads API incidents are recorded there is not established (25 of 30). Rate limits are published by endpoint type, such as 450 writes a minute and 10,000 core entity reads per 15 minutes (15). The analytics guide says to wait for `x-rate-limit-reset` after a 429 and for `retry-after` after a 503. No idempotency key or safe-retry guidance for writes was found (10 of 15). No SLA was found (0). Version 12 is the current, generally available version (10). Total 75.",
            "schema": "No OpenAPI file covers the Ads API. The published file (version 2.170, 178 paths) describes api.x.com only. A Postman collection is linked and was not read (5 of 25). The docs have an llms.txt index for the Ads API and a Markdown twin for every page (10). Reference pages describe each endpoint and guides cover objectives, targeting, pacing and analytics, with little on when not to use an endpoint (14 of 20). Parameters are typed, with required and optional flags, defaults, ranges and 41 lists of possible values in the campaign management reference. Targeting values are looked up through separate endpoints (11 of 15). Each endpoint has an example request and response. The errors page lists about 77 error constants with HTTP codes and no explanation for each (11 of 15). Versions are in the URL path with a table of introduction and end-of-life dates, and a dated changelog with an RSS feed. Version 12 dates from 27 October 2022 and changes since then ship in place (13 of 15). Total 64.",
            "security": "REST calls use OAuth 1.0a with an app key and a user access token. The docs say these tokens do not expire, the user can revoke them, and app keys last until regenerated. The MCP server uses OAuth 2.0 with PKCE, scopes `ads.read`, `ads.write` and `media.write`, access tokens of about two hours and rotating refresh tokens. The manual token example in the MCP docs uses `code_challenge_method=plain` with a fixed verifier (24 of 30). Account-level roles include Campaign analyst and Organic analyst, the `ads.read` scope gives a read-only MCP session, MCP writes are created paused with separate activation tools, and the sandbox never serves. No confirmation step for a write was found (15 of 20). Lead exports, post text and audience names are third-party text, and no prompt-injection guidance was found in the Ads API or MCP pages (4 of 15). No audit log or change history endpoint was found. Deleted entities remain readable with `with_deleted=true` (2 of 15). x.com's robots.txt closes its security.txt to us, developer.x.com and docs.x.com return 404 for the file, and no certification or bounty statement was found in the pages read (3 of 20). Total 48.",
            "transparency": "Editorial half only. Closed service with clear terms. The Developer Agreement was last updated on 27 April 2026 and names X Corp. or X Internet Unlimited Company by the developer's location (15 of 30). The privacy policy at x.com/privacy is closed to us by robots.txt and was not read. The Conversion API page sets SHA256 hashing for email and phone. No data processing agreement or retention period for advertiser data was found in the pages read (8 of 30). The versions page gives introduction, deprecation and end-of-life dates for 13 versions and promises six months of overlap and 90 days' notice for a breaking change outside a version. The `video_total_views` metric was redefined on 13 August 2026 with a changelog entry dated the same day, and the Developer Agreement allows X to change or discontinue any feature (17 of 20). No sub-processor list or data location statement was found in the pages read (0 of 20). Total 40."
          },
          "sources": [
            {
              "what": "Ads API introduction and access form notice",
              "url": "https://docs.x.com/x-ads-api/introduction",
              "seen": "2026-10-09"
            },
            {
              "what": "Ads API docs index (llms.txt)",
              "url": "https://docs.x.com/x-ads-api/llms.txt",
              "seen": "2026-10-09"
            },
            {
              "what": "X Ads MCP page, tools, scopes and client setup",
              "url": "https://docs.x.com/x-ads-api/mcp",
              "seen": "2026-10-09"
            },
            {
              "what": "step-by-step access guide and access tiers",
              "url": "https://docs.x.com/x-ads-api/getting-started/step-by-step-guide",
              "seen": "2026-10-09"
            },
            {
              "what": "increasing access",
              "url": "https://docs.x.com/x-ads-api/getting-started/increasing-access",
              "seen": "2026-10-09"
            },
            {
              "what": "accessing ads accounts, tokens and account roles",
              "url": "https://docs.x.com/x-ads-api/fundamentals/accessing-ads-accounts",
              "seen": "2026-10-09"
            },
            {
              "what": "making authenticated requests (OAuth 1.0a)",
              "url": "https://docs.x.com/x-ads-api/fundamentals/making-authenticated-requests",
              "seen": "2026-10-09"
            },
            {
              "what": "rate limiting",
              "url": "https://docs.x.com/x-ads-api/fundamentals/rate-limiting",
              "seen": "2026-10-09"
            },
            {
              "what": "sandbox",
              "url": "https://docs.x.com/x-ads-api/fundamentals/sandbox",
              "seen": "2026-10-09"
            },
            {
              "what": "error codes and responses",
              "url": "https://docs.x.com/x-ads-api/fundamentals/error-codes-and-responses",
              "seen": "2026-10-09"
            },
            {
              "what": "pagination",
              "url": "https://docs.x.com/x-ads-api/fundamentals/pagination",
              "seen": "2026-10-09"
            },
            {
              "what": "versions and versioning strategy",
              "url": "https://docs.x.com/x-ads-api/fundamentals/versioning",
              "seen": "2026-10-09"
            },
            {
              "what": "campaign management reference",
              "url": "https://docs.x.com/x-ads-api/campaign-management/reference",
              "seen": "2026-10-09"
            },
            {
              "what": "analytics guide, retries and metric locking",
              "url": "https://docs.x.com/x-ads-api/analytics",
              "seen": "2026-10-09"
            },
            {
              "what": "web conversions (Conversion API)",
              "url": "https://docs.x.com/x-ads-api/measurement/web-conversions",
              "seen": "2026-10-09"
            },
            {
              "what": "tools and libraries",
              "url": "https://docs.x.com/x-ads-api/tools-and-libraries",
              "seen": "2026-10-09"
            },
            {
              "what": "platform changelog",
              "url": "https://docs.x.com/changelog",
              "seen": "2026-10-09"
            },
            {
              "what": "incident history",
              "url": "https://docs.x.com/incidents",
              "seen": "2026-10-09"
            },
            {
              "what": "developer support page, status link",
              "url": "https://docs.x.com/support",
              "seen": "2026-10-09"
            },
            {
              "what": "status page (script-drawn, component list not read)",
              "url": "https://developer.x.com/status",
              "seen": "2026-10-09"
            },
            {
              "what": "Developer Agreement",
              "url": "https://docs.x.com/developer-terms/agreement",
              "seen": "2026-10-09"
            },
            {
              "what": "Developer Policy",
              "url": "https://docs.x.com/developer-terms/policy",
              "seen": "2026-10-09"
            },
            {
              "what": "X API pricing page",
              "url": "https://docs.x.com/x-api/getting-started/pricing",
              "seen": "2026-10-09"
            },
            {
              "what": "OpenAPI description for api.x.com, read as the file",
              "url": "https://docs.x.com/openapi.json",
              "seen": "2026-10-09"
            },
            {
              "what": "AGENTS.md",
              "url": "https://docs.x.com/AGENTS.md",
              "seen": "2026-10-09"
            },
            {
              "what": "Python Ads SDK repository (tags and commits from a shallow clone)",
              "url": "https://github.com/xdevplatform/twitter-python-ads-sdk",
              "seen": "2026-10-09"
            },
            {
              "what": "Ruby Ads SDK repository (tags and commits from a shallow clone)",
              "url": "https://github.com/xdevplatform/twitter-ruby-ads-sdk",
              "seen": "2026-10-09"
            },
            {
              "what": "robots.txt for ads-api.x.com, which disallows every path",
              "url": "https://ads-api.x.com/robots.txt",
              "seen": "2026-10-09"
            },
            {
              "what": "robots.txt for x.com, which disallows every path for unnamed agents",
              "url": "https://x.com/robots.txt",
              "seen": "2026-10-09"
            },
            {
              "what": "RDAP record for x.com",
              "url": "https://rdap.verisign.com/com/v1/domain/x.com",
              "seen": "2026-10-09"
            }
          ],
          "openQuestions": [
            "unchecked: the privacy policy at x.com/privacy and x.com's security.txt, because x.com's robots.txt disallows every path for unnamed agents",
            "unchecked: the MCP server's tool definitions, annotations and OAuth metadata, because the robots.txt of ads-api.x.com disallows every path. The tool names come from the docs page",
            "unchecked: the component list on developer.x.com/status (script-drawn), so whether the status page has an Ads API component is not established",
            "unchecked: devcommunity.x.com (robots.txt disallows unnamed agents), so the version 12 announcement and forum replies were not read",
            "unchecked: the Postman collection for the Ads API, the access form at help.x.com, and advertising prices and advertiser terms on business.x.com",
            "Whether Ads API access carries a fee. No page read states one, and the X API pricing page does not mention the Ads API",
            "The introduction says access is requested through a form reviewed within three business days. The MCP page says selecting Ads Project in the Developer Console enables Ads API access for an app. Which applies to a new developer was not established",
            "Whether notice was given before the `video_total_views` change of 13 August 2026. The changelog entry is dated the day of the change, and no deduction was taken",
            "Whether X publishes a data processing agreement, a sub-processor list or security certifications for advertisers. None was found in the pages read",
            "The lead was right about the REST API and the access form. It did not mention the X Ads MCP server, and the REST API uses OAuth 1.0a, not OAuth 2.0",
            "The Developer Agreement (section III.C) treats usage statistics and data on the X API's performance and responsiveness as Confidential Information for internal, non-commercial use. This matters before any probe is run",
            "docs.x.com/AGENTS.md is addressed to AI agents and tells them which documentation files to prefer. We treated it as data"
          ]
        },
        "negative": 0,
        "verdict": "Rate limits are published per endpoint type, a sandbox host never serves ads, and the X Ads MCP server has separate read and write scopes and creates campaigns paused. The REST API needs OAuth 1.0a signing and an approved app, no OpenAPI file covers it, and the official Python and Ruby SDKs were last released in May 2022.",
        "bestFor": "An agent that manages or reports on X campaigns for an advertiser with an approved developer app, especially through the MCP server, where scopes separate reads from writes and writes start paused.",
        "strengths": [
          "Rate limits are published by endpoint type, such as 450 writes a minute and 250 synchronous analytics requests per 15 minutes, with remaining quota in `x-rate-limit-*` headers",
          "The sandbox host `ads-api-sandbox.x.com` creates test ad accounts and funding instruments, and campaigns made there are not served",
          "The X Ads MCP server at `https://ads-api.x.com/mcp` lists 74 tools, with `ads.read`, `ads.write` and `media.write` as separate OAuth 2.0 scopes",
          "The MCP docs say campaigns and line items are always created paused, and spending starts only after `activate_campaign` or `activate_line_item`",
          "Every docs page has a Markdown twin, and https://docs.x.com/x-ads-api/llms.txt indexes the Ads API pages"
        ],
        "weaknesses": [
          "No OpenAPI file covers the Ads API. The published file (version 2.170, 178 paths) describes api.x.com only",
          "REST calls need an OAuth 1.0a signature on each request, and the docs say user access tokens do not expire",
          "The official Python and Ruby SDKs were last released on 27 May 2022 at v11.0.0, while the current API version is 12",
          "No idempotency key, audit log endpoint or SLA was found in the reviewed documentation",
          "The Developer Agreement treats statistics on the X API's performance and responsiveness as Confidential Information for internal, non-commercial use, which matters before any probe is run",
          "The `video_total_views` metric was redefined in place on 13 August 2026 with no version change"
        ],
        "agentNotes": [
          "Build against `https://ads-api-sandbox.x.com/12/` first. Create a test account with `POST accounts` and a funding instrument there before touching a live account",
          "On HTTP 429 wait until the time in `x-rate-limit-reset`. On 503 wait for `retry-after`. The docs say apps that ignore these can be throttled or lose access without notice",
          "Read the account-level limit from `x-account-rate-limit-*` when present and use `x-rate-limit-*` only when it is absent",
          "For a read-only MCP session request `ads.read offline.access` only. Without `offline.access` the token expires in about two hours with no refresh",
          "Page with `count` (1 to 1,000, default 200) and `cursor` until `next_cursor` is null. Analytics endpoints page by time range instead, and `with_total_count` cannot be combined with `cursor`"
        ],
        "metrics": {
          "kind": "remote",
          "measured": false
        },
        "reviewCount": 0,
        "avgRating": 0,
        "history": [
          {
            "basis": "public evidence",
            "confidence": "medium",
            "grade": "C",
            "methodology": "0.4",
            "pending": [
              "performance",
              "tasks"
            ],
            "run": "2026-10-01",
            "runLabel": "October 2026 research run",
            "score": 57.3
          }
        ],
        "editorialScores": {
          "ergonomics": 62,
          "maintenance": 63,
          "payments": 20,
          "reliability": 75,
          "schema": 64,
          "security": 48,
          "transparency": 40
        },
        "provenanceScore": 84
      },
      "connect": {
        "http": "twurl -H ads-api.x.com \"/11/accounts\"",
        "claudeCode": "claude mcp add x-ads https://ads-api.x.com/mcp \\\n  --transport http \\\n  --client-id YOUR_OAUTH2_CLIENT_ID \\\n  --callback-port 8080"
      },
      "letme": {
        "capability": "https://letme.dev/ads.reporting",
        "tool": "https://letme.dev/x-ads"
      },
      "sameCompany": [
        "x-mcp"
      ],
      "notable": [
        "The X Ads MCP server at `https://ads-api.x.com/mcp` uses Streamable HTTP and lists 74 tools for reads, analytics, targeting, audiences, creatives, conversion tags and campaign writes. The docs name Grok, Grok Build and Claude Code as clients (https://docs.x.com/x-ads-api/mcp)",
        "The MCP docs say campaigns and line items are always created paused and spend only after `activate_campaign` or `activate_line_item` (https://docs.x.com/x-ads-api/mcp)",
        "X keeps one live OAuth 2.0 grant for each app and user, so signing in from a second MCP client revokes the first client's tokens (https://docs.x.com/x-ads-api/mcp)",
        "Rate limits are 450 writes and 1,500 audience calls a minute, and per 15 minutes 250 synchronous analytics requests, 10,000 core entity reads per endpoint and 5 global reads (https://docs.x.com/x-ads-api/fundamentals/rate-limiting)",
        "The sandbox at `ads-api-sandbox.x.com` has six sandbox-only endpoints for creating and deleting test accounts, account feature flags and funding instruments (https://docs.x.com/x-ads-api/fundamentals/sandbox)",
        "Version 12 was introduced on 27 October 2022 and has no deprecation date. The policy is six months of overlap between versions and 90 days' notice for a breaking change outside a version (https://docs.x.com/x-ads-api/fundamentals/versioning)",
        "The official Python and Ruby SDKs were last tagged v11.0.0 on 27 May 2022 and set API version 11 (https://github.com/xdevplatform/twitter-python-ads-sdk)",
        "The Developer Agreement, last updated 27 April 2026, forbids using the X API or X Content to fine-tune or train a foundation or frontier model (https://docs.x.com/developer-terms/agreement)",
        "The robots.txt of ads-api.x.com disallows every path, so the MCP server's tool definitions and OAuth metadata were not read (https://ads-api.x.com/robots.txt)"
      ],
      "area": "communication",
      "details": [
        {
          "label": "Surface graded",
          "value": "The public REST API at `https://ads-api.x.com/12/`. The X Ads MCP server at `https://ads-api.x.com/mcp` is recorded from its docs page and not graded, since its host's robots.txt closes it to us"
        },
        {
          "label": "Access",
          "value": "A developer app plus Ads API approval. The introduction points to an access form reviewed within three business days. Tiers are Conversion Only and Standard Access, and apps approved before July 2023 may be limited to five OAuth tokens"
        },
        {
          "label": "Credentials",
          "value": "REST uses OAuth 1.0a with HMAC-SHA1 signatures, an app key and secret, and a user access token that the docs say does not expire. MCP uses OAuth 2.0 with PKCE, access tokens of about two hours and rotating refresh tokens"
        },
        {
          "label": "Roles",
          "value": "Account administrator, Ad manager, Campaign analyst, Organic analyst and Creative Manager. `GET accounts/:account_id/authenticated_user_access` returns the current user's permissions"
        },
        {
          "label": "X Ads MCP",
          "value": "74 tools listed in the docs. Scopes `ads.read` for reads and analytics, `ads.write` for campaign and creative writes, `media.write` for media library writes. Native app (public client) recommended, and no dynamic client registration is described"
        },
        {
          "label": "Rate limits",
          "value": "Per minute, 450 writes and 1,500 audience calls. Per 15 minutes, 250 synchronous analytics, 10,000 core entity reads, 2,000 other account reads, 400 targeting criteria, 5 global reads and 60,000 conversions. The docs say limits are not raised"
        },
        {
          "label": "Retries",
          "value": "`x-rate-limit-reset` after a 429 and `retry-after` after a 503. No idempotency key was found"
        },
        {
          "label": "Test mode",
          "value": "`ads-api-sandbox.x.com` creates test ad accounts and funding instruments, and campaigns there are not served"
        },
        {
          "label": "Checks before spend",
          "value": "Campaigns take `entity_status` of ACTIVE, DRAFT or PAUSED. MCP writes are always created paused, and `estimate_audience` and reach tools exist. Batch endpoints take up to 40 items and fail or succeed as a group"
        },
        {
          "label": "Reporting",
          "value": "Synchronous and asynchronous analytics. Metrics lock after 24 hours, except `billed_charge_local_micro`, which is an estimate for up to three days. One segmentation per request"
        },
        {
          "label": "Pagination",
          "value": "`count` from 1 to 1,000 (default 200) with `cursor` and `next_cursor`, `sort_by`, and `q` for name prefix search. Analytics endpoints page by time range"
        },
        {
          "label": "Errors",
          "value": "An `errors` array with a constant `code`, a `message` and often `parameter` and `details`. About 77 constants are listed with their HTTP codes"
        },
        {
          "label": "Versioning",
          "value": "The version is the first path element. Version 12 dates from 27 October 2022. Responses carry `x-current-api-version`, and `x-api-warn` on deprecated endpoints"
        },
        {
          "label": "Clients",
          "value": "Official Python and Ruby SDKs, both last tagged v11.0.0 on 27 May 2022. A Postman collection and community libraries for PHP, Java and Node.js are linked"
        },
        {
          "label": "Status",
          "value": "developer.x.com/status, and an incident history at docs.x.com/incidents whose latest entry ended on 1 July 2026. No 2026 entry names the Ads API"
        },
        {
          "label": "Security programme",
          "value": "Not established. x.com's robots.txt closes its security.txt to us, and developer.x.com and docs.x.com return 404 for the file"
        }
      ],
      "provenance": {
        "legalEntity": "X Corp.",
        "domain": "x.com",
        "domainRegistered": "1993-04-02",
        "endpointOnVendorDomain": true,
        "terms": "https://docs.x.com/developer-terms/agreement",
        "privacy": "https://x.com/privacy",
        "statusPage": "https://developer.x.com/status",
        "changelog": "https://docs.x.com/changelog",
        "securityTxt": "unknown",
        "checked": "2026-10-09",
        "notes": [
          "The Developer Agreement (last updated 27 April 2026) governs use of the X API and incorporates the Developer Policy and the API Restricted Use Rules. The contracting entity is X Corp. (Bastrop, Texas), or X Internet Unlimited Company (Dublin) for a developer in the EU, EFTA or the United Kingdom.",
          "The privacy link is the one the Developer Policy cites. x.com's robots.txt disallows every path for unnamed agents, so the policy was not read.",
          "No advertiser agreement or data processing agreement was found in the pages read. business.x.com was not read.",
          "API calls go to https://ads-api.x.com and https://ads-api-sandbox.x.com, and OAuth 2.0 tokens come from api.x.com. The documentation is at docs.x.com.",
          "x.com/.well-known/security.txt is closed to us by robots.txt. developer.x.com and docs.x.com return 404 for the file.",
          "The status page at developer.x.com/status is script-drawn and its components were not read. The incident history is at https://docs.x.com/incidents.",
          "RDAP gives a registration date of 1993-04-02 for x.com."
        ],
        "score": 84,
        "checks": [
          {
            "check": "Legal entity named",
            "value": "X Corp.",
            "points": 20,
            "max": 20,
            "state": "ok"
          },
          {
            "check": "Domain age",
            "value": "x.com, registered 1993-04-02 (33 years)",
            "points": 15,
            "max": 15,
            "state": "ok"
          },
          {
            "check": "Endpoint on the vendor's domain",
            "value": "ads-api.x.com",
            "points": 15,
            "max": 15,
            "state": "ok"
          },
          {
            "check": "Terms of service",
            "value": "read, states 6 of the 7 things a reader expects, and has 1 clause that costs points",
            "points": 7.1,
            "max": 10,
            "state": "part"
          },
          {
            "check": "Privacy policy",
            "value": "published, but our reader couldn't read it",
            "points": 7,
            "max": 10,
            "state": "part"
          },
          {
            "check": "Status page",
            "value": "developer.x.com/status",
            "points": 10,
            "max": 10,
            "state": "ok"
          },
          {
            "check": "Changelog",
            "value": "published",
            "points": 10,
            "max": 10,
            "state": "ok"
          },
          {
            "check": "security.txt",
            "value": "could not be fetched",
            "points": 0,
            "max": 10,
            "state": "no"
          }
        ],
        "policies": [
          {
            "kind": "terms",
            "url": "https://docs.x.com/developer-terms/agreement",
            "state": "read",
            "readAt": "2026-10-08",
            "statedDate": "2026-04-27",
            "words": 8254,
            "points": 7.1,
            "max": 10,
            "expected": [
              {
                "key": "terms.date",
                "label": "Gives the date it was last updated",
                "found": true,
                "quote": "Last Updated: April 27, 2026",
                "says": "Last updated 2026-04-27"
              },
              {
                "key": "terms.law",
                "label": "Names the governing law or courts",
                "found": true,
                "quote": "The laws of the State of Texas, excluding its choice of law provisions, will govern this Agreement and any dispute that arises between you and X, notwithstanding any other agreement between the parties to the contrary.",
                "says": "The law of the State of Texas"
              },
              {
                "key": "terms.liability",
                "label": "States a limit on its liability",
                "found": true,
                "quote": "IN ANY CASE, X’S AGGREGATE LIABILITY FOR ANY AND ALL CLAIMS UNDER THIS AGREEMENT WILL NOT EXCEED FIFTY DOLLARS ($50.00).",
                "says": "Capped at $50.00"
              },
              {
                "key": "terms.termination",
                "label": "Says how the agreement or account can be ended",
                "found": true,
                "quote": "If you exceed or X reasonably believes that you have attempted to circumvent Rate Limits, controls to limit use of the X APIs, or the terms of this Agreement, then your ability to use the Licensed Material may be temporarily suspended or permanently blocked."
              },
              {
                "key": "terms.changes",
                "label": "Says how changes to the terms are announced",
                "found": true,
                "quote": "X will alert you of material revisions to these terms by posting the updated terms on these sites, via a service notification, or by other suitable means (e.g., via email to an email address associated with your account).",
                "says": "Says it gives notice of a change"
              },
              {
                "key": "terms.use",
                "label": "Lists what users may not do",
                "found": true,
                "quote": "If you do not understand the terms herein or do not accept any part of them, then you may not use or access any Licensed Material."
              },
              {
                "key": "terms.sla",
                "label": "Refers to a service level or uptime commitment",
                "found": false
              }
            ],
            "toKnow": [
              {
                "key": "terms.benchmark",
                "label": "Restricts benchmarking or competitive use",
                "found": true,
                "quote": "use or access the Licensed Material to create or attempt to create a substitute or similar service or product to the X Applications",
                "costsPoints": true
              },
              {
                "key": "terms.cutoff",
                "label": "Says access can be ended without notice or for any reason",
                "found": true,
                "quote": "X may terminate this Agreement for any reason at X’s sole discretion."
              },
              {
                "key": "terms.arbitration",
                "label": "Requires arbitration or waives class actions",
                "found": true,
                "quote": "Class Action Waiver. To the extent permitted by law, you also waive the right to participate as a plaintiff or class member in any purported class action, collective action, or representative action proceeding."
              }
            ],
            "notes": [
              {
                "date": "2026-10-08",
                "text": "X's total liability for all claims under the agreement is capped at 50 US dollars.",
                "quote": "IN ANY CASE, X’S AGGREGATE LIABILITY FOR ANY AND ALL CLAIMS UNDER THIS AGREEMENT WILL NOT EXCEED FIFTY DOLLARS ($50.00)."
              },
              {
                "date": "2026-10-08",
                "text": "The X API and X Content may not be used to fine-tune or train a foundation or frontier model.",
                "quote": "use the X API or X Content to fine-tune or train a foundation or frontier model"
              },
              {
                "date": "2026-10-08",
                "text": "On termination the developer must permanently delete all Licensed Material and, if X asks, give evidence of deletion within ten business days.",
                "quote": "Upon the request of X for any reason, you will promptly (and in any event within ten (10) business days of such request) provide evidence (e.g., screenshots of deletion confirmation) of compliance with the provisions of the aforementioned subpart (b) of this Section."
              }
            ]
          },
          {
            "kind": "privacy",
            "url": "https://x.com/privacy",
            "state": "unreadable",
            "reason": "robots.txt asks readers like ours not to fetch it",
            "readAt": "2026-10-09",
            "points": 7,
            "max": 10
          }
        ]
      },
      "pageJsonUrl": "https://www.anchorterminal.com/tools/x-ads.json",
      "live": {
        "slug": "x-ads",
        "probe": {
          "target": "https://ads-api.x.com/mcp",
          "method": "get",
          "lastAt": "2026-10-10T05:39:11.133080434Z",
          "lastOk": true,
          "lastStatus": 401,
          "lastMs": 128,
          "lastNote": "asks for credentials",
          "authRequired": true,
          "uptime24h": 100,
          "uptime30d": 100,
          "p50ms24h": 133,
          "p95ms24h": 286,
          "samples24h": 143,
          "samples30d": 143,
          "days": [
            {
              "date": "2026-10-09",
              "probes": 85,
              "ok": 85
            },
            {
              "date": "2026-10-10",
              "probes": 58,
              "ok": 58
            }
          ]
        },
        "vendorStatus": {
          "page": "https://developer.x.com/status",
          "indicator": "unknown",
          "summary": "no machine-readable status found",
          "checkedAt": "2026-10-10T00:51:26.152185931Z"
        },
        "pages": [
          {
            "url": "https://docs.x.com/changelog",
            "kind": "changelog",
            "status": 200,
            "checkedAt": "2026-10-09T18:38:47.238452338Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "d1064f68558e"
          },
          {
            "url": "https://x.com/privacy",
            "kind": "privacy",
            "status": 0,
            "checkedAt": "2026-10-09T18:56:08.988834251Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "blockedByRobots": true
          },
          {
            "url": "https://docs.x.com/developer-terms/agreement",
            "kind": "terms",
            "status": 200,
            "checkedAt": "2026-10-09T18:38:49.524865418Z",
            "changedAt": "0001-01-01T00:00:00Z",
            "fingerprint": "69ecb268f31a"
          }
        ],
        "updatedAt": "2026-10-10T05:39:11.133080434Z"
      }
    },
    "verify": {
      "accepts": "a page on docs.x.com or one of its subdomains",
      "badgeUrl": "https://www.anchorterminal.com/badges/x-ads.svg",
      "body": {
        "slug": "x-ads",
        "url": "the page with the badge or the link"
      },
      "docs": "https://www.anchorterminal.com/builders/#verify",
      "effect": "none, it never changes a grade, rank or review",
      "endpoint": "https://www.anchorterminal.com/api/v1/verify",
      "listingUrl": "https://www.anchorterminal.com/tools/x-ads",
      "mcpTool": "verify_listing",
      "recheck": "weekly; two failed checks in a row and it lapses, a later pass restores it",
      "snippets": {
        "html": "\u003ca href=\"https://www.anchorterminal.com/tools/x-ads\"\u003e\u003cimg src=\"https://www.anchorterminal.com/badges/x-ads.svg\" alt=\"X Ads API on Anchor Terminal\" height=\"20\"\u003e\u003c/a\u003e",
        "markdown": "[![X Ads API on Anchor Terminal](https://www.anchorterminal.com/badges/x-ads.svg)](https://www.anchorterminal.com/tools/x-ads)",
        "link": "\u003ca href=\"https://www.anchorterminal.com/tools/x-ads\"\u003eX Ads API on Anchor Terminal\u003c/a\u003e"
      }
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/x-ads",
    "json": "https://www.anchorterminal.com/tools/x-ads.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/x-ads.md",
    "slim": "https://www.anchorterminal.com/tools/x-ads.min.md"
  },
  "markdown": "## Overview\n\n**Grade C · 57.3/100 · rank #616 of 950 · #6 in Advertising \u0026 campaign operations · not agent-ready · confidence medium**\n\n\nMore from X Corp., listed separately because each is its own product: [X MCP](https://www.anchorterminal.com/tools/x-mcp.md) (Social media posting APIs).\n\n## Assessment\n\nRate limits are published per endpoint type, a sandbox host never serves ads, and the X Ads MCP server has separate read and write scopes and creates campaigns paused. The REST API needs OAuth 1.0a signing and an approved app, no OpenAPI file covers it, and the official Python and Ruby SDKs were last released in May 2022.\n\n## Facts\n\n| Field | Value |\n| --- | --- |\n| Vendor | X Corp. (https://docs.x.com/x-ads-api/introduction) |\n| Kind | HTTP API |\n| Category | Advertising \u0026 campaign operations (https://www.anchorterminal.com/categories/advertising) |\n| Transport | HTTP |\n| Endpoint | `https://ads-api.x.com/mcp` |\n| Auth | OAuth · Access needs approval. A person creates an app in the X Developer Console and requests Ads API access with the Ads API Access Form, which the docs say is reviewed within three business days, at the Conversion Only or Standard Access tier. The MCP page instead says selecting Ads Project under Project Access enables Ads API access for the app. REST calls are signed with OAuth 1.0a using the app key and a user access token from the three-legged or PIN flow. The docs say these tokens do not expire and the user can revoke them. The X Ads MCP server uses OAuth 2.0 with PKCE and the scopes `ads.read`, `ads.write`, `media.write` and `offline.access`. Calls act with the user's ad account role. |\n| Pricing | Free (Free) · No fee for Ads API access was found in the pages read, and the X API pricing page does not mention the Ads API. Ad spend is billed to the ad account's funding instrument, and advertising prices were not read. The sandbox host creates test accounts and funding instruments and never serves ads, so an approved app can start without spend. Whether a developer account needs a payment card was not established (checked 2026-10-09). |\n| x402 | No · No x402, MPP or L402 in the Ads API documentation, the X API pricing page or the Developer Agreement (checked 2026-10-09). |\n| Licence | Proprietary service under the X Developer Agreement and its incorporated Developer Policy |\n| Docs | https://docs.x.com/x-ads-api/introduction |\n| llms.txt | https://docs.x.com/x-ads-api/llms.txt |\n| Last release | 2026-09-17 |\n| Surface graded | The public REST API at `https://ads-api.x.com/12/`. The X Ads MCP server at `https://ads-api.x.com/mcp` is recorded from its docs page and not graded, since its host's robots.txt closes it to us |\n| Access | A developer app plus Ads API approval. The introduction points to an access form reviewed within three business days. Tiers are Conversion Only and Standard Access, and apps approved before July 2023 may be limited to five OAuth tokens |\n| Credentials | REST uses OAuth 1.0a with HMAC-SHA1 signatures, an app key and secret, and a user access token that the docs say does not expire. MCP uses OAuth 2.0 with PKCE, access tokens of about two hours and rotating refresh tokens |\n| Roles | Account administrator, Ad manager, Campaign analyst, Organic analyst and Creative Manager. `GET accounts/:account_id/authenticated_user_access` returns the current user's permissions |\n| X Ads MCP | 74 tools listed in the docs. Scopes `ads.read` for reads and analytics, `ads.write` for campaign and creative writes, `media.write` for media library writes. Native app (public client) recommended, and no dynamic client registration is described |\n| Rate limits | Per minute, 450 writes and 1,500 audience calls. Per 15 minutes, 250 synchronous analytics, 10,000 core entity reads, 2,000 other account reads, 400 targeting criteria, 5 global reads and 60,000 conversions. The docs say limits are not raised |\n| Retries | `x-rate-limit-reset` after a 429 and `retry-after` after a 503. No idempotency key was found |\n| Test mode | `ads-api-sandbox.x.com` creates test ad accounts and funding instruments, and campaigns there are not served |\n| Checks before spend | Campaigns take `entity_status` of ACTIVE, DRAFT or PAUSED. MCP writes are always created paused, and `estimate_audience` and reach tools exist. Batch endpoints take up to 40 items and fail or succeed as a group |\n| Reporting | Synchronous and asynchronous analytics. Metrics lock after 24 hours, except `billed_charge_local_micro`, which is an estimate for up to three days. One segmentation per request |\n| Pagination | `count` from 1 to 1,000 (default 200) with `cursor` and `next_cursor`, `sort_by`, and `q` for name prefix search. Analytics endpoints page by time range |\n| Errors | An `errors` array with a constant `code`, a `message` and often `parameter` and `details`. About 77 constants are listed with their HTTP codes |\n| Versioning | The version is the first path element. Version 12 dates from 27 October 2022. Responses carry `x-current-api-version`, and `x-api-warn` on deprecated endpoints |\n| Clients | Official Python and Ruby SDKs, both last tagged v11.0.0 on 27 May 2022. A Postman collection and community libraries for PHP, Java and Node.js are linked |\n| Status | developer.x.com/status, and an incident history at docs.x.com/incidents whose latest entry ended on 1 July 2026. No 2026 entry names the Ads API |\n| Security programme | Not established. x.com's robots.txt closes its security.txt to us, and developer.x.com and docs.x.com return 404 for the file |\n| Capabilities | ads.reporting, ads.campaigns, ads.budgets, ads.audiences, ads.creatives |\n| Tags | hosted, free, oauth, mcp, llms-txt, sandbox, approval-required, closed-source |\n| JSON | https://www.anchorterminal.com/api/v1/tools/x-ads.json |\n\n## Score breakdown (methodology v0.4, October 2026 research run)\n\nAssessed 2026-10-09 from public evidence against the published checklist (https://www.anchorterminal.com/benchmark/#checklist). Confidence: medium. Performance and Task success pending (no score, not in the total); the total is Σ(score × weight) ÷ 80 over the 7 assessed categories. \"This run\" is each category's share of the 100 points.\n\n| Category | Weight | This run | Score (0–100) | Points |\n| --- | --- | --- | --- | --- |\n| Reliability | 16% | 20 | 75 | 15.0 |\n| Performance | 10% | pending | pending | n/a |\n| Schema \u0026 documentation | 13% | 16.2 | 64 | 10.4 |\n| Agent ergonomics | 13% | 16.2 | 62 | 10.1 |\n| Security \u0026 auth | 14% | 17.5 | 48 | 8.4 |\n| Payments \u0026 pricing | 10% | 12.5 | 20 | 2.5 |\n| Task success | 10% | pending | pending | n/a |\n| Maintenance \u0026 community | 7% | 8.8 | 63 | 5.5 |\n| Transparency \u0026 trust (editorial 40, provenance 84) | 7% | 8.8 | 62 | 5.4 |\n| Negative events | up to −15 | up to −15 | none recorded | 0 |\n| **Total** | | | | **57.3 → C** |\n\n### Why each score\n\n- Reliability 75: Read with the hosted lines, grading the public REST API. A status page is linked at developer.x.com/status, though it is script-drawn and its component list was not read, so whether it has an Ads API component is not established (15 of 20). The incident history at docs.x.com/incidents says it covers the Ads API. Its latest entry ended on 1 July 2026, so the 90 days to 9 October show none, and no entry in 2026 names the Ads API. Whether Ads API incidents are recorded there is not established (25 of 30). Rate limits are published by endpoint type, such as 450 writes a minute and 10,000 core entity reads per 15 minutes (15). The analytics guide says to wait for `x-rate-limit-reset` after a 429 and for `retry-after` after a 503. No idempotency key or safe-retry guidance for writes was found (10 of 15). No SLA was found (0). Version 12 is the current, generally available version (10). Total 75.\n- Performance: Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes.\n- Schema \u0026 documentation 64: No OpenAPI file covers the Ads API. The published file (version 2.170, 178 paths) describes api.x.com only. A Postman collection is linked and was not read (5 of 25). The docs have an llms.txt index for the Ads API and a Markdown twin for every page (10). Reference pages describe each endpoint and guides cover objectives, targeting, pacing and analytics, with little on when not to use an endpoint (14 of 20). Parameters are typed, with required and optional flags, defaults, ranges and 41 lists of possible values in the campaign management reference. Targeting values are looked up through separate endpoints (11 of 15). Each endpoint has an example request and response. The errors page lists about 77 error constants with HTTP codes and no explanation for each (11 of 15). Versions are in the URL path with a table of introduction and end-of-life dates, and a dated changelog with an RSS feed. Version 12 dates from 27 October 2022 and changes since then ship in place (13 of 15). Total 64.\n- Agent ergonomics 62: Lists take `count` from 1 to 1,000 and filters by ID. No field selection on entity reads was found, and the campaign management reference is about 274 KB of Markdown. The MCP server lists 74 tools, which can be narrowed by scope (14 of 25). Cursor paging, `sort_by`, name search with `q`, `with_deleted`, `with_draft`, asynchronous analytics jobs and an Active Entities endpoint that says which entities changed (18 of 20). Errors carry a constant `code`, a `message` and often the `parameter` and `details` (15 of 20). No idempotency key was found. Batch endpoints take up to 40 items and succeed or fail as a group, PUT changes only the fields sent, and the sandbox host never serves ads. MCP tool annotations were not read (8 of 20). REST calls need an OAuth 1.0a signature on each request. The official Python and Ruby SDKs are at v11.0.0 from May 2022, one API version behind (7 of 15). Total 62.\n- Security \u0026 auth 48: REST calls use OAuth 1.0a with an app key and a user access token. The docs say these tokens do not expire, the user can revoke them, and app keys last until regenerated. The MCP server uses OAuth 2.0 with PKCE, scopes `ads.read`, `ads.write` and `media.write`, access tokens of about two hours and rotating refresh tokens. The manual token example in the MCP docs uses `code_challenge_method=plain` with a fixed verifier (24 of 30). Account-level roles include Campaign analyst and Organic analyst, the `ads.read` scope gives a read-only MCP session, MCP writes are created paused with separate activation tools, and the sandbox never serves. No confirmation step for a write was found (15 of 20). Lead exports, post text and audience names are third-party text, and no prompt-injection guidance was found in the Ads API or MCP pages (4 of 15). No audit log or change history endpoint was found. Deleted entities remain readable with `with_deleted=true` (2 of 15). x.com's robots.txt closes its security.txt to us, developer.x.com and docs.x.com return 404 for the file, and no certification or bounty statement was found in the pages read (3 of 20). Total 48.\n- Payments \u0026 pricing 20: No x402, MPP or L402 (0). No page read states a fee for Ads API access, and the X API pricing page does not mention the Ads API. Advertising prices were not read (10). The sandbox creates test accounts and funding instruments at no stated cost. Whether a developer account or an Ads app needs a payment card was not established (10). A person has to create a developer app, request Ads API access and consent in a browser (0). Total 20.\n- Task success: Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored.\n- Maintenance \u0026 community 63: The latest changelog entry labelled X Ads API is dated 17 September 2026, 22 days before the check (30). Four Ads API entries fall in the 90 days to 9 October 2026, on 13 August and 15, 16 and 17 September (20). Closed service with a dated changelog and RSS feed. The developer forum's robots.txt closes it to us, so replies there were not read (8 of 15). The two official SDKs, for Python and Ruby, were last tagged v11.0.0 on 27 May 2022 and target API version 11 (3 of 15). Both SDK repositories have CI workflows, with no commit since May 2022 (2 of 10). Total 63.\n- Transparency \u0026 trust 62: Editorial half only. Closed service with clear terms. The Developer Agreement was last updated on 27 April 2026 and names X Corp. or X Internet Unlimited Company by the developer's location (15 of 30). The privacy policy at x.com/privacy is closed to us by robots.txt and was not read. The Conversion API page sets SHA256 hashing for email and phone. No data processing agreement or retention period for advertiser data was found in the pages read (8 of 30). The versions page gives introduction, deprecation and end-of-life dates for 13 versions and promises six months of overlap and 90 days' notice for a breaking change outside a version. The `video_total_views` metric was redefined on 13 August 2026 with a changelog entry dated the same day, and the Developer Agreement allows X to change or discontinue any feature (17 of 20). No sub-processor list or data location statement was found in the pages read (0 of 20). Total 40.\n\nFix list for a coding agent, everything this grade says the listing lacks, the biggest gain first (22 items): https://www.anchorterminal.com/fixes/x-ads.md (JSON https://www.anchorterminal.com/fixes/x-ads.json)\n\n### What we couldn't check\n\n- unchecked: the privacy policy at x.com/privacy and x.com's security.txt, because x.com's robots.txt disallows every path for unnamed agents\n- unchecked: the MCP server's tool definitions, annotations and OAuth metadata, because the robots.txt of ads-api.x.com disallows every path. The tool names come from the docs page\n- unchecked: the component list on developer.x.com/status (script-drawn), so whether the status page has an Ads API component is not established\n- unchecked: devcommunity.x.com (robots.txt disallows unnamed agents), so the version 12 announcement and forum replies were not read\n- unchecked: the Postman collection for the Ads API, the access form at help.x.com, and advertising prices and advertiser terms on business.x.com\n- Whether Ads API access carries a fee. No page read states one, and the X API pricing page does not mention the Ads API\n- The introduction says access is requested through a form reviewed within three business days. The MCP page says selecting Ads Project in the Developer Console enables Ads API access for an app. Which applies to a new developer was not established\n- Whether notice was given before the `video_total_views` change of 13 August 2026. The changelog entry is dated the day of the change, and no deduction was taken\n- Whether X publishes a data processing agreement, a sub-processor list or security certifications for advertisers. None was found in the pages read\n- The lead was right about the REST API and the access form. It did not mention the X Ads MCP server, and the REST API uses OAuth 1.0a, not OAuth 2.0\n- The Developer Agreement (section III.C) treats usage statistics and data on the X API's performance and responsiveness as Confidential Information for internal, non-commercial use. This matters before any probe is run\n- docs.x.com/AGENTS.md is addressed to AI agents and tells them which documentation files to prefer. We treated it as data\n\n### Sources\n\n- Ads API introduction and access form notice: \u003chttps://docs.x.com/x-ads-api/introduction\u003e (seen 2026-10-09)\n- Ads API docs index (llms.txt): \u003chttps://docs.x.com/x-ads-api/llms.txt\u003e (seen 2026-10-09)\n- X Ads MCP page, tools, scopes and client setup: \u003chttps://docs.x.com/x-ads-api/mcp\u003e (seen 2026-10-09)\n- step-by-step access guide and access tiers: \u003chttps://docs.x.com/x-ads-api/getting-started/step-by-step-guide\u003e (seen 2026-10-09)\n- increasing access: \u003chttps://docs.x.com/x-ads-api/getting-started/increasing-access\u003e (seen 2026-10-09)\n- accessing ads accounts, tokens and account roles: \u003chttps://docs.x.com/x-ads-api/fundamentals/accessing-ads-accounts\u003e (seen 2026-10-09)\n- making authenticated requests (OAuth 1.0a): \u003chttps://docs.x.com/x-ads-api/fundamentals/making-authenticated-requests\u003e (seen 2026-10-09)\n- rate limiting: \u003chttps://docs.x.com/x-ads-api/fundamentals/rate-limiting\u003e (seen 2026-10-09)\n- sandbox: \u003chttps://docs.x.com/x-ads-api/fundamentals/sandbox\u003e (seen 2026-10-09)\n- error codes and responses: \u003chttps://docs.x.com/x-ads-api/fundamentals/error-codes-and-responses\u003e (seen 2026-10-09)\n- pagination: \u003chttps://docs.x.com/x-ads-api/fundamentals/pagination\u003e (seen 2026-10-09)\n- versions and versioning strategy: \u003chttps://docs.x.com/x-ads-api/fundamentals/versioning\u003e (seen 2026-10-09)\n- campaign management reference: \u003chttps://docs.x.com/x-ads-api/campaign-management/reference\u003e (seen 2026-10-09)\n- analytics guide, retries and metric locking: \u003chttps://docs.x.com/x-ads-api/analytics\u003e (seen 2026-10-09)\n- web conversions (Conversion API): \u003chttps://docs.x.com/x-ads-api/measurement/web-conversions\u003e (seen 2026-10-09)\n- tools and libraries: \u003chttps://docs.x.com/x-ads-api/tools-and-libraries\u003e (seen 2026-10-09)\n- platform changelog: \u003chttps://docs.x.com/changelog\u003e (seen 2026-10-09)\n- incident history: \u003chttps://docs.x.com/incidents\u003e (seen 2026-10-09)\n- developer support page, status link: \u003chttps://docs.x.com/support\u003e (seen 2026-10-09)\n- status page (script-drawn, component list not read): \u003chttps://developer.x.com/status\u003e (seen 2026-10-09)\n- Developer Agreement: \u003chttps://docs.x.com/developer-terms/agreement\u003e (seen 2026-10-09)\n- Developer Policy: \u003chttps://docs.x.com/developer-terms/policy\u003e (seen 2026-10-09)\n- X API pricing page: \u003chttps://docs.x.com/x-api/getting-started/pricing\u003e (seen 2026-10-09)\n- OpenAPI description for api.x.com, read as the file: \u003chttps://docs.x.com/openapi.json\u003e (seen 2026-10-09)\n- AGENTS.md: \u003chttps://docs.x.com/AGENTS.md\u003e (seen 2026-10-09)\n- Python Ads SDK repository (tags and commits from a shallow clone): \u003chttps://github.com/xdevplatform/twitter-python-ads-sdk\u003e (seen 2026-10-09)\n- Ruby Ads SDK repository (tags and commits from a shallow clone): \u003chttps://github.com/xdevplatform/twitter-ruby-ads-sdk\u003e (seen 2026-10-09)\n- robots.txt for ads-api.x.com, which disallows every path: \u003chttps://ads-api.x.com/robots.txt\u003e (seen 2026-10-09)\n- robots.txt for x.com, which disallows every path for unnamed agents: \u003chttps://x.com/robots.txt\u003e (seen 2026-10-09)\n- RDAP record for x.com: \u003chttps://rdap.verisign.com/com/v1/domain/x.com\u003e (seen 2026-10-09)\n\n## Who's behind it (provenance 84/100, checked 2026-10-09)\n\n| Check | Finding | Points |\n| --- | --- | --- |\n| Legal entity named | X Corp. | 20/20 |\n| Domain age | x.com, registered 1993-04-02 (33 years) | 15/15 |\n| Endpoint on the vendor's domain | ads-api.x.com | 15/15 |\n| Terms of service | read, states 6 of the 7 things a reader expects, and has 1 clause that costs points | 7.1/10 |\n| Privacy policy | published, but our reader couldn't read it | 7/10 |\n| Status page | developer.x.com/status | 10/10 |\n| Changelog | published | 10/10 |\n| security.txt | could not be fetched | 0/10 |\n\nThe Developer Agreement (last updated 27 April 2026) governs use of the X API and incorporates the Developer Policy and the API Restricted Use Rules. The contracting entity is X Corp. (Bastrop, Texas), or X Internet Unlimited Company (Dublin) for a developer in the EU, EFTA or the United Kingdom.\n\nThe privacy link is the one the Developer Policy cites. x.com's robots.txt disallows every path for unnamed agents, so the policy was not read.\n\nNo advertiser agreement or data processing agreement was found in the pages read. business.x.com was not read.\n\nAPI calls go to https://ads-api.x.com and https://ads-api-sandbox.x.com, and OAuth 2.0 tokens come from api.x.com. The documentation is at docs.x.com.\n\nx.com/.well-known/security.txt is closed to us by robots.txt. developer.x.com and docs.x.com return 404 for the file.\n\nThe status page at developer.x.com/status is script-drawn and its components were not read. The incident history is at https://docs.x.com/incidents.\n\nRDAP gives a registration date of 1993-04-02 for x.com.\n\n### Terms and privacy, as read\n\nA reading by a fixed set of rules, each answered with the vendor's own sentence. Not legal advice.\n\n**Terms of service** (https://docs.x.com/developer-terms/agreement), read 2026-10-08, dated 2026-04-27, states 6 of the 7 things a reader expects.\n\n- To know. Restricts benchmarking or competitive use (costs points). \"use or access the Licensed Material to create or attempt to create a substitute or similar service or product to the X Applications\"\n- To know. Says access can be ended without notice or for any reason. \"X may terminate this Agreement for any reason at X’s sole discretion.\"\n- To know. Requires arbitration or waives class actions. \"Class Action Waiver. To the extent permitted by law, you also waive the right to participate as a plaintiff or class member in any purported class action, collective action, or representative action proceeding.\"\n- Gives the date it was last updated. Last updated 2026-04-27.\n- Names the governing law or courts. The law of the State of Texas.\n- States a limit on its liability. Capped at $50.00.\n- Says how changes to the terms are announced. Says it gives notice of a change.\n- Not found in the text. Refers to a service level or uptime commitment.\n- Also in the text (2026-10-08). X's total liability for all claims under the agreement is capped at 50 US dollars. \"IN ANY CASE, X’S AGGREGATE LIABILITY FOR ANY AND ALL CLAIMS UNDER THIS AGREEMENT WILL NOT EXCEED FIFTY DOLLARS ($50.00).\"\n- Also in the text (2026-10-08). The X API and X Content may not be used to fine-tune or train a foundation or frontier model. \"use the X API or X Content to fine-tune or train a foundation or frontier model\"\n- Also in the text (2026-10-08). On termination the developer must permanently delete all Licensed Material and, if X asks, give evidence of deletion within ten business days. \"Upon the request of X for any reason, you will promptly (and in any event within ten (10) business days of such request) provide evidence (e.g., screenshots of deletion confirmation) of compliance with the provisions of the aforementioned subpart (b) of this Section.\"\n\n**Privacy policy** (https://x.com/privacy), read 2026-10-09. Our reader couldn't read it (robots.txt asks readers like ours not to fetch it).\n\n\n## Live (updated 2026-10-10 05:39 UTC)\n\n- Right now: up, HTTP 401, 128 ms, checked 2026-10-10 05:39 UTC (get on `https://ads-api.x.com/mcp`, asks for auth)\n- Uptime 24h 100.0% (143 probes) · 30 days 100.0% (143 probes) · p50 133 ms · p95 286 ms\n- Vendor status page: unknown, no machine-readable status found\n- Watching changelog \u003chttps://docs.x.com/changelog\u003e\n- Watching privacy \u003chttps://x.com/privacy\u003e\n- Watching terms \u003chttps://docs.x.com/developer-terms/agreement\u003e\n- Always current: https://www.anchorterminal.com/api/v1/live/x-ads.json\n\n## Probe metrics\n\nNot measured yet. Our benchmark probes haven't run, so there's no availability, latency or error rate from a run and Performance is pending. Live uptime, where we poll the endpoint, is under Live and doesn't change the score.\n\n## Strengths\n\n- Rate limits are published by endpoint type, such as 450 writes a minute and 250 synchronous analytics requests per 15 minutes, with remaining quota in `x-rate-limit-*` headers\n- The sandbox host `ads-api-sandbox.x.com` creates test ad accounts and funding instruments, and campaigns made there are not served\n- The X Ads MCP server at `https://ads-api.x.com/mcp` lists 74 tools, with `ads.read`, `ads.write` and `media.write` as separate OAuth 2.0 scopes\n- The MCP docs say campaigns and line items are always created paused, and spending starts only after `activate_campaign` or `activate_line_item`\n- Every docs page has a Markdown twin, and https://docs.x.com/x-ads-api/llms.txt indexes the Ads API pages\n\n## Weaknesses\n\n- No OpenAPI file covers the Ads API. The published file (version 2.170, 178 paths) describes api.x.com only\n- REST calls need an OAuth 1.0a signature on each request, and the docs say user access tokens do not expire\n- The official Python and Ruby SDKs were last released on 27 May 2022 at v11.0.0, while the current API version is 12\n- No idempotency key, audit log endpoint or SLA was found in the reviewed documentation\n- The Developer Agreement treats statistics on the X API's performance and responsiveness as Confidential Information for internal, non-commercial use, which matters before any probe is run\n- The `video_total_views` metric was redefined in place on 13 August 2026 with no version change\n\n## Before you call it (notes for agents)\n\n1. Build against `https://ads-api-sandbox.x.com/12/` first. Create a test account with `POST accounts` and a funding instrument there before touching a live account\n2. On HTTP 429 wait until the time in `x-rate-limit-reset`. On 503 wait for `retry-after`. The docs say apps that ignore these can be throttled or lose access without notice\n3. Read the account-level limit from `x-account-rate-limit-*` when present and use `x-rate-limit-*` only when it is absent\n4. For a read-only MCP session request `ads.read offline.access` only. Without `offline.access` the token expires in about two hours with no refresh\n5. Page with `count` (1 to 1,000, default 200) and `cursor` until `next_cursor` is null. Analytics endpoints page by time range instead, and `with_total_count` cannot be combined with `cursor`\n\n## Connect\n\nFirst request:\n\n```bash\ntwurl -H ads-api.x.com \"/11/accounts\"\n```\n\nClaude Code:\n\n```bash\nclaude mcp add x-ads https://ads-api.x.com/mcp \\\n  --transport http \\\n  --client-id YOUR_OAUTH2_CLIENT_ID \\\n  --callback-port 8080\n```\n\nThrough letme (picks today, calling later): https://letme.dev/x-ads. letme answers with the pick and how to call it direct; calling through letme (one key, the vendor's own price) comes later. How it works: https://www.anchorterminal.com/letme/index.md\n\n## Similar tools\n\nRanked by shared capabilities, then score. Same-category tools with no shared capability key are listed last.\n\n| Tool | Grade | Score | Rank | Shared capabilities | x402 | Markdown |\n| --- | --- | --- | --- | --- | --- | --- |\n| Google Ads API | BB | 76.4 | 33 | ads.reporting, ads.campaigns, ads.budgets, ads.audiences, ads.creatives | no | https://www.anchorterminal.com/tools/google-ads-api.md |\n| Meta Marketing API | B | 67.7 | 243 | ads.reporting, ads.campaigns, ads.budgets, ads.audiences, ads.creatives | no | https://www.anchorterminal.com/tools/meta-marketing-api.md |\n| LinkedIn Marketing APIs | B | 62.4 | 434 | ads.reporting, ads.campaigns, ads.budgets, ads.audiences, ads.creatives | no | https://www.anchorterminal.com/tools/linkedin-marketing-api.md |\n| Microsoft Advertising API | C | 60.3 | 522 | ads.reporting, ads.campaigns, ads.budgets, ads.audiences, ads.creatives | no | https://www.anchorterminal.com/tools/microsoft-advertising-api.md |\n| Amazon Ads API | C | 59 | 563 | ads.reporting, ads.campaigns, ads.budgets, ads.audiences, ads.creatives | no | https://www.anchorterminal.com/tools/amazon-ads-api.md |\n| Snapchat Ads API | D | 50.4 | 771 | ads.reporting, ads.campaigns, ads.budgets, ads.audiences, ads.creatives | no | https://www.anchorterminal.com/tools/snapchat-ads.md |\n\n## Panel reviews (0)\n\nReviewed by the Anchor panel (https://www.anchorterminal.com/reviewers/index.md): .\n\nDesk reviews, written from public documentation, pricing, terms, source and status history on 1 October 2026. No calls made. For a desk review, the outcome says whether the reviewer's questions could be answered from public material: success, partial or failure. How reviews work: https://www.anchorterminal.com/reviews/how-it-works.md\n\n## Notable\n\n- The X Ads MCP server at `https://ads-api.x.com/mcp` uses Streamable HTTP and lists 74 tools for reads, analytics, targeting, audiences, creatives, conversion tags and campaign writes. The docs name Grok, Grok Build and Claude Code as clients (source: \u003chttps://docs.x.com/x-ads-api/mcp\u003e)\n- The MCP docs say campaigns and line items are always created paused and spend only after `activate_campaign` or `activate_line_item` (source: \u003chttps://docs.x.com/x-ads-api/mcp\u003e)\n- X keeps one live OAuth 2.0 grant for each app and user, so signing in from a second MCP client revokes the first client's tokens (source: \u003chttps://docs.x.com/x-ads-api/mcp\u003e)\n- Rate limits are 450 writes and 1,500 audience calls a minute, and per 15 minutes 250 synchronous analytics requests, 10,000 core entity reads per endpoint and 5 global reads (source: \u003chttps://docs.x.com/x-ads-api/fundamentals/rate-limiting\u003e)\n- The sandbox at `ads-api-sandbox.x.com` has six sandbox-only endpoints for creating and deleting test accounts, account feature flags and funding instruments (source: \u003chttps://docs.x.com/x-ads-api/fundamentals/sandbox\u003e)\n- Version 12 was introduced on 27 October 2022 and has no deprecation date. The policy is six months of overlap between versions and 90 days' notice for a breaking change outside a version (source: \u003chttps://docs.x.com/x-ads-api/fundamentals/versioning\u003e)\n- The official Python and Ruby SDKs were last tagged v11.0.0 on 27 May 2022 and set API version 11 (source: \u003chttps://github.com/xdevplatform/twitter-python-ads-sdk\u003e)\n- The Developer Agreement, last updated 27 April 2026, forbids using the X API or X Content to fine-tune or train a foundation or frontier model (source: \u003chttps://docs.x.com/developer-terms/agreement\u003e)\n- The robots.txt of ads-api.x.com disallows every path, so the MCP server's tool definitions and OAuth metadata were not read (source: \u003chttps://ads-api.x.com/robots.txt\u003e)\n\n- #6 of 8 in Best advertising platform APIs for AI agents: https://www.anchorterminal.com/best/advertising/index.md\n- All 28 advertising comparisons: https://www.anchorterminal.com/compare/advertising/index.md\n\n## Compare\n\n- [Amazon Ads API vs X Ads API](https://www.anchorterminal.com/compare/amazon-ads-api-vs-x-ads.md): C 59 vs C 57.3\n- [Apple Ads Platform API vs X Ads API](https://www.anchorterminal.com/compare/apple-ads-vs-x-ads.md): D 53.8 vs C 57.3\n- [Google Ads API vs X Ads API](https://www.anchorterminal.com/compare/google-ads-api-vs-x-ads.md): BB 76.4 vs C 57.3\n- [LinkedIn Marketing APIs vs X Ads API](https://www.anchorterminal.com/compare/linkedin-marketing-api-vs-x-ads.md): B 62.4 vs C 57.3\n- [Meta Marketing API vs X Ads API](https://www.anchorterminal.com/compare/meta-marketing-api-vs-x-ads.md): B 67.7 vs C 57.3\n- [Microsoft Advertising API vs X Ads API](https://www.anchorterminal.com/compare/microsoft-advertising-api-vs-x-ads.md): C 60.3 vs C 57.3\n- [Snapchat Ads API vs X Ads API](https://www.anchorterminal.com/compare/snapchat-ads-vs-x-ads.md): D 50.4 vs C 57.3\n\n## Verify this listing\n\nFor the vendor. The badge or a plain link to this page verifies the listing, from a page on docs.x.com or one of its subdomains. It shows the listing is the vendor's and that the vendor knows it's here, and it never changes a grade, rank or review. The vendor sends the page's address to `POST https://www.anchorterminal.com/api/v1/verify` as `{\"slug\": \"x-ads\", \"url\": \"…\"}`, or calls the `verify_listing` tool at https://www.anchorterminal.com/mcp. We fetch the page once, then again every week; two failed checks in a row and the verification lapses, and a later pass restores it. What we check: https://www.anchorterminal.com/builders/index.md#verify\n\nHTML badge:\n\n```html\n\u003ca href=\"https://www.anchorterminal.com/tools/x-ads\"\u003e\u003cimg src=\"https://www.anchorterminal.com/badges/x-ads.svg\" alt=\"X Ads API on Anchor Terminal\" height=\"20\"\u003e\u003c/a\u003e\n```\n\nMarkdown badge, for a README:\n\n```markdown\n[![X Ads API on Anchor Terminal](https://www.anchorterminal.com/badges/x-ads.svg)](https://www.anchorterminal.com/tools/x-ads)\n```\n\nPlain link:\n\n```html\n\u003ca href=\"https://www.anchorterminal.com/tools/x-ads\"\u003eX Ads API on Anchor Terminal\u003c/a\u003e\n```\n\n## Share this listing\n\nFor the vendor. Sharing assets for social media, two PNGs of 1200 × 630 that say X Ads API is listed on Anchor Terminal, with the vendor's logo and this page's address and no grade or score.\n\n- Dark: https://www.anchorterminal.com/assets/share/x-ads-dark.png\n- Light: https://www.anchorterminal.com/assets/share/x-ads-light.png\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-10",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Advertising \u0026 campaign operations",
        "url": "https://www.anchorterminal.com/categories/advertising"
      },
      {
        "name": "X Ads API",
        "url": ""
      }
    ],
    "description": "X's Ads API creates and manages campaigns, line items, targeting, creatives and audiences on X and returns performance analytics. Agents call versioned REST endpoints at ads-api.x.com with OAuth 1.0a, or use the X Ads MCP server with OAuth 2.0.",
    "facts": [
      "rank #616 of 950",
      "OAuth auth",
      "0 desk reviews"
    ],
    "h1": "X Ads API",
    "image": "https://www.anchorterminal.com/assets/og/tools-x-ads.png",
    "path": "/tools/x-ads",
    "published": "2026-10-01",
    "section": "tools",
    "title": "X Ads review (2026): pricing, alternatives and grade C",
    "toc": null,
    "updated": "2026-10-10",
    "url": "https://www.anchorterminal.com/tools/x-ads"
  },
  "tokens": {
    "markdown": 8300,
    "slim": 1980
  },
  "version": 1
}
