Xquik Communities API

X Community info, members, and tweets

Operations 6

GET /api/v1/x/communities/{id}/info Get community name, description and member count #
GET /api/v1/x/communities/{id}/members List members of a community #
GET /api/v1/x/communities/{id}/moderators List moderators of a community #
GET /api/v1/x/communities/{id}/tweets List tweets posted in a community #
GET /api/v1/x/communities/search Search tweets within an X Community by keyword #
GET /api/v1/x/communities/tweets Search tweets within an X Community #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/xquik-api-communities-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

xquik-api-communities-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Xquik Communities API
  version: '1.0'
  description: "Xquik is an independent third-party service. Not affiliated with X Corp. \"Twitter\" and \"X\" are trademarks of X Corp. Look up tweets, users, and X trends. Search tweets, check follow relationships, download media, and monitor accounts. 33 paid-read endpoints accept prepaid credits without a subscription. 7 fixed-price lookups also accept direct MPP payments. Write and automation endpoints require an API key or OAuth 2.1 bearer token.\n\n## Xquik SDKs\n\nStainless generates each SDK from this OpenAPI schema. Pick a language:\n\n- TypeScript / Node.js: `npm i x-twitter-scraper` -\n  [Xquik-dev/x-twitter-scraper-typescript](https://github.com/Xquik-dev/x-twitter-scraper-typescript)\n\n- Python: `pip install x-twitter-scraper` -\n  [Xquik-dev/x-twitter-scraper-python](https://github.com/Xquik-dev/x-twitter-scraper-python)\n\n- Go: `go get github.com/Xquik-dev/x-twitter-scraper-go` -\n  [Xquik-dev/x-twitter-scraper-go](https://github.com/Xquik-dev/x-twitter-scraper-go)\n\n- Ruby: `gem install x-twitter-scraper` -\n  [Xquik-dev/x-twitter-scraper-ruby](https://github.com/Xquik-dev/x-twitter-scraper-ruby)\n\n- Java (source build; Maven Central pending) -\n  [Xquik-dev/x-twitter-scraper-java](https://github.com/Xquik-dev/x-twitter-scraper-java)\n\n- Kotlin (source build; Maven Central pending) -\n  [Xquik-dev/x-twitter-scraper-kotlin](https://github.com/Xquik-dev/x-twitter-scraper-kotlin)\n\n- C# / .NET: `dotnet add package XTwitterScraper` -\n  [Xquik-dev/x-twitter-scraper-csharp](https://github.com/Xquik-dev/x-twitter-scraper-csharp)\n\n- PHP: `composer require xquik/x-twitter-scraper` -\n  [Xquik-dev/x-twitter-scraper-php](https://github.com/Xquik-dev/x-twitter-scraper-php)\n\n- CLI: `go install github.com/Xquik-dev/x-twitter-scraper-cli/cmd/x-twitter-scraper@latest` -\n  [Xquik-dev/x-twitter-scraper-cli](https://github.com/Xquik-dev/x-twitter-scraper-cli)\n\n- Terraform Provider (Terraform Registry) -\n  [Xquik-dev/terraform-provider-x-twitter-scraper](https://github.com/Xquik-dev/terraform-provider-x-twitter-scraper)\n\n\nOpenClaw plugin: [Xquik-dev/tweetclaw](https://github.com/Xquik-dev/tweetclaw) (`openclaw plugins install clawhub:@xquik/tweetclaw`)."
  x-guidance: '## Common tasks


    **Find a tweet** - GET /x/tweets/{id} with a numeric tweet ID. Returns full tweet data: text, author, metrics (likes, retweets, replies, views), media URLs, and creation timestamp. Cost: $0.00015 per lookup.


    **Search tweets** - GET /x/tweets/search?q={query}&limit={n}. Supports X search operators, structured filters like fromUser, mediaType, minFaves, hashtags, and verifiedOnly, plus exact lookup for a pasted Tweet ID or X status URL. Plain from:user date windows are optimized for timeline completeness. Returns up to 200 tweets per page with cursor-based pagination. Cost: $0.00015 per tweet returned.


    **Find a user** - GET /x/users/{id} where {id} is a numeric user ID or @username. Returns profile data: name, bio, follower/following counts, verification status, join date. Cost: $0.00015 per lookup.


    **Check if A follows B** - GET /x/followers/check?source={a}&target={b} where source and target are usernames, @usernames, or X or Twitter profile URLs. Cost: $0.00075.


    **Get trending topics** - GET /trends?woeid={region}&count={n}. WOEID 1 = worldwide, 23424977 = US, 23424975 = UK, 23424969 = Turkey. Cost: $0.00045.


    **Download media** - POST /x/media/download with {"tweetIds": ["123", "456"]} body. Returns download URLs for images and videos. Cost: 1 credit per fresh tweet processed with media; cached repeat downloads are free.


    **Read an article** - GET /x/articles/{tweetId} for long-form X Articles. Returns full article HTML, cover image, and metadata. Cost: $0.00075.


    ## Pagination


    Default v1 responses keep their existing pagination fields for compatibility. Platform list endpoints return `hasMore` and `nextCursor`; X data endpoints return `has_next_page` and `next_cursor`. Send `xquik-api-contract: 2026-04-29` to receive the unified best-practice fields `has_more` and `next_cursor`. Pass the cursor back as `?cursor={cursor}`; legacy `?after={cursor}` still works. Dynamic-priced endpoints charge per item returned, not per request.


    ## Authentication


    Eligible paid read endpoints accept accountless prepaid credit wallets. Fixed-price lookups also accept direct MPP payments. Media downloads, write endpoints, and automation features require authentication. Send an Xquik API key through `x-api-key`, `Xquik-Api-Key`, or `Authorization: Bearer xq_...`. Send an OAuth 2.1 access token through `Authorization: Bearer`.


    ## Best-Practice Response Contract


    v1 keeps its original response contract by default so existing integrations do not break. Send `xquik-api-contract: 2026-04-29` to opt in to the best-practice contract: snake_case response fields, Unix timestamps in seconds, structured error objects, `has_more` and `next_cursor` pagination fields, `object` resource identifiers, and prefixed IDs where available. Dependency failures that returned 502 in default v1 return 424 in the opt-in contract. Future major API versions should make this contract the default.'
  contact:
    name: Xquik
    url: https://xquik.com
    email: support@xquik.com
servers:
- url: https://xquik.com
security:
- apiKey: []
- oauthBearer: []
tags:
- name: Communities
  description: X Community info, members, and tweets
paths:
  /api/v1/x/communities/{id}/info:
    get:
      operationId: getCommunityInfo
      summary: Get community name, description and member count
      tags:
      - Communities
      security:
      - apiKey: []
      - oauthBearer: []
      - {}
      x-payment-info:
        offers:
        - amount: '150'
          currency: '0x20c000000000000000000000b9537d11c60e8b50'
          intent: charge
          method: tempo
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
        description: Community ID
      responses:
        '200':
          description: Community details
          content:
            application/json:
              schema:
                type: object
                required:
                - community
                properties:
                  community:
                    type: object
                    description: Community info object
                    example:
                      id: '1500000000000000000'
                      name: Tesla Fans
                    properties:
                      id:
                        type: string
                        description: Unique community identifier
                      name:
                        type: string
                        description: Display name of the community
                      description:
                        type: string
                        description: About text for the community
                      banner_url:
                        type: string
                        description: Community banner image URL
                      created_at:
                        type: string
                        description: Community creation timestamp
                      join_policy:
                        type: string
                        description: Join policy (open or restricted)
                      invites_policy:
                        type: string
                        description: Invitation policy
                      is_nsfw:
                        type: boolean
                        description: Whether the community is marked sensitive
                      creator:
                        type: object
                        required:
                        - id
                        - username
                        - verified
                        properties:
                          id:
                            type: string
                          username:
                            type: string
                          verified:
                            type: boolean
                          name:
                            type: string
                      member_count:
                        type: integer
                        description: Total member count
                      moderator_count:
                        type: integer
                        description: Total moderator count
                      primary_topic:
                        type: object
                        description: Primary topic
                        properties:
                          id:
                            type: string
                          name:
                            type: string
                      rules:
                        type: array
                        description: Community rules
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                            name:
                              type: string
                            description:
                              type: string
                    required:
                    - id
              example:
                community:
                  id: '1500000000000000000'
                  name: Tesla Fans
                  description: A community for Tesla enthusiasts
                  banner_url: https://xquik.com/example
                  created_at: '2025-01-15T12:00:00Z'
                  join_policy: open
                  member_count: 10000
                  moderator_count: 5
        '400':
          $ref: '#/components/responses/InvalidInput'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '404':
          $ref: '#/components/responses/NotFound'
        '424':
          $ref: '#/components/responses/XApiError'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '502':
          $ref: '#/components/responses/XApiError'
        default:
          content:
            application/json:
              example:
                error: internal_error
                message: Unexpected error. Try again.
              schema:
                $ref: '#/components/schemas/Error'
          description: Unexpected error.
      description: Get community name, description and member count.
  /api/v1/x/communities/{id}/members:
    get:
      operationId: getCommunityMembers
      summary: List members of a community
      tags:
      - Communities
      security:
      - apiKey: []
      - oauthBearer: []
      - {}
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
        description: Community ID for member lookup
      - name: cursor
        in: query
        schema:
          type: string
        description: Pagination cursor
      - name: pageSize
        in: query
        schema:
          type: integer
          minimum: 20
          maximum: 200
          default: 20
        description: 'Items per page (20-200, default 20). This is an upper bound for paid authenticated calls: remaining credits can reduce the returned page size, and zero affordable results returns 402 insufficient_credits.

          '
      responses:
        '200':
          description: List of community members
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedUsers'
        '400':
          $ref: '#/components/responses/InvalidInput'
        '401':
          $ref: '#/components/responses/AnonymousGuestAuthenticationRequired'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '404':
          $ref: '#/components/responses/NotFound'
        '424':
          $ref: '#/components/responses/XApiError'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '502':
          $ref: '#/components/responses/XApiError'
        default:
          content:
            application/json:
              example:
                error: internal_error
                message: Unexpected error. Try again.
              schema:
                $ref: '#/components/schemas/Error'
          description: Unexpected error.
      description: List members of a community.
  /api/v1/x/communities/{id}/moderators:
    get:
      operationId: getCommunityModerators
      summary: List moderators of a community
      tags:
      - Communities
      security:
      - apiKey: []
      - oauthBearer: []
      - {}
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
        description: Community ID for moderator lookup
      - name: cursor
        in: query
        schema:
          type: string
        description: Pagination cursor for community moderators
      responses:
        '200':
          description: List of community moderators
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedUsers'
        '400':
          $ref: '#/components/responses/InvalidInput'
        '401':
          $ref: '#/components/responses/AnonymousGuestAuthenticationRequired'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '404':
          $ref: '#/components/responses/NotFound'
        '424':
          $ref: '#/components/responses/XApiError'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '502':
          $ref: '#/components/responses/XApiError'
        default:
          content:
            application/json:
              example:
                error: internal_error
                message: Unexpected error. Try again.
              schema:
                $ref: '#/components/schemas/Error'
          description: Unexpected error.
      description: List moderators of a community.
  /api/v1/x/communities/{id}/tweets:
    get:
      operationId: getCommunityTweets
      summary: List tweets posted in a community
      tags:
      - Communities
      security:
      - apiKey: []
      - oauthBearer: []
      - {}
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
        description: Community ID for tweet lookup
      - name: cursor
        in: query
        schema:
          type: string
        description: Pagination cursor for community tweets
      - $ref: '#/components/parameters/ResultPageSize'
      responses:
        '200':
          description: List of community tweets
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTweets'
        '400':
          $ref: '#/components/responses/InvalidInput'
        '401':
          $ref: '#/components/responses/AnonymousGuestAuthenticationRequired'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '404':
          $ref: '#/components/responses/NotFound'
        '424':
          $ref: '#/components/responses/XApiError'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '502':
          $ref: '#/components/responses/XApiError'
        default:
          content:
            application/json:
              example:
                error: internal_error
                message: Unexpected error. Try again.
              schema:
                $ref: '#/components/schemas/Error'
          description: Unexpected error.
      description: List tweets posted in a community.
  /api/v1/x/communities/search:
    get:
      operationId: searchCommunities
      summary: Search tweets within an X Community by keyword
      description: Returns tweets, not community records. Requires a Community ID.
      tags:
      - Communities
      security:
      - apiKey: []
      - oauthBearer: []
      - {}
      parameters:
      - name: communityId
        in: query
        required: true
        schema:
          type: string
          pattern: ^\d+$
        description: Numeric ID of the community whose posts to search
      - name: q
        in: query
        required: true
        schema:
          type: string
        description: Search query
      - name: queryType
        in: query
        schema:
          type: string
          enum:
          - Latest
          - Top
          default: Latest
        description: Sort order (Latest or Top)
      - name: cursor
        in: query
        schema:
          type: string
        description: Pagination cursor for community search
      - $ref: '#/components/parameters/ResultPageSize'
      responses:
        '200':
          description: Tweet search results from the selected X Community
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTweets'
        '400':
          $ref: '#/components/responses/InvalidInput'
        '401':
          $ref: '#/components/responses/AnonymousGuestAuthenticationRequired'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '424':
          $ref: '#/components/responses/XApiError'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '502':
          $ref: '#/components/responses/XApiError'
        default:
          content:
            application/json:
              example:
                error: internal_error
                message: Unexpected error. Try again.
              schema:
                $ref: '#/components/schemas/Error'
          description: Unexpected error.
  /api/v1/x/communities/tweets:
    get:
      operationId: getAllCommunityTweets
      summary: Search tweets within an X Community
      description: Requires a Community ID and keyword query.
      tags:
      - Communities
      security:
      - apiKey: []
      - oauthBearer: []
      - {}
      parameters:
      - name: communityId
        in: query
        required: true
        schema:
          type: string
          pattern: ^\d+$
        description: Numeric ID of the community to search
      - name: q
        in: query
        required: true
        schema:
          type: string
        description: Keyword query within the selected community
      - name: queryType
        in: query
        schema:
          type: string
          enum:
          - Latest
          - Top
          default: Latest
        description: Sort order for community results (Latest or Top)
      - name: cursor
        in: query
        schema:
          type: string
        description: Pagination cursor for community results
      - $ref: '#/components/parameters/ResultPageSize'
      responses:
        '200':
          description: Paginated matching tweets from the selected community
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedTweets'
        '400':
          $ref: '#/components/responses/InvalidInput'
        '401':
          $ref: '#/components/responses/AnonymousGuestAuthenticationRequired'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '424':
          $ref: '#/components/responses/XApiError'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '502':
          $ref: '#/components/responses/XApiError'
        default:
          content:
            application/json:
              example:
                error: internal_error
                message: Unexpected error. Try again.
              schema:
                $ref: '#/components/schemas/Error'
          description: Unexpected error.
components:
  responses:
    PaymentRequired:
      description: 'Payment required. Fixed-price direct MPP requests return a Machine Payments Protocol problem document and a WWW-Authenticate challenge. Authenticated X data requests return balances and explicit Stripe checkout-creation actions. Guest paid-read keys receive only the accountless guest top-up action. Direct MPP challenges also advertise the Stripe wallet action. Other authenticated endpoints return a legacy error shape. A failed request never creates checkout. Create checkout only after the user confirms a payment option.

        '
      headers:
        WWW-Authenticate:
          description: MPP payment challenge for eligible anonymous pay-per-use requests. Authenticated credit or subscription errors omit this header.
          schema:
            type: string
      content:
        application/json:
          schema:
            oneOf:
            - $ref: '#/components/schemas/XWritePaymentRequired'
            - $ref: '#/components/schemas/AuthenticatedPaymentRequired'
            - $ref: '#/components/schemas/GuestPaymentRequired'
            - allOf:
              - $ref: '#/components/schemas/Error'
              - not:
                  required:
                  - payment_options
          example:
            balance: '0'
            dashboard: /dashboard/account
            error: insufficient_credits
            message: Insufficient credits. Top up or subscribe to continue.
            next_step: Ask the user to confirm a payment option before creating checkout.
            payment_options:
              credits:
                create_checkout:
                  body:
                    dollars: 10
                    locale: en
                  creates: checkout_url
                  method: POST
                  path: /api/v1/credits/topup
                  provider: stripe
                  requires_authentication: true
                  requires_user_confirmation: true
                  response_url_field: url
              subscription:
                create_checkout:
                  body:
                    tier: starter
                  creates: checkout_url
                  method: POST
                  path: /api/v1/subscribe
                  provider: stripe
                  requires_authentication: true
                  requires_user_confirmation: true
                  response_url_field: url
            required: '1'
            top_up_endpoint: /api/v1/credits/topup
            top_up_url: POST /api/v1/credits/topup
        application/problem+json:
          schema:
            $ref: '#/components/schemas/MppPaymentRequired'
          example:
            account_required: false
            challengeId: Opaque MPP challenge identifier
            detail: Payment is required.
            hint: Use a supported wallet with an offer from the WWW-Authenticate header.
            status: 402
            title: Payment Required
            type: https://paymentauth.org/problems/payment-required
            next_step: Ask the user to confirm a USD amount before creating checkout.
            payment_options:
              guest_wallet:
                create_checkout:
                  account_required: false
                  amount_bounds:
                    currency: usd
                    maximum_minor: 25000
                    minimum_minor: 1000
                  body:
                    amount_minor: 1000
                    currency: usd
                  creates: checkout_url
                  method: POST
                  path: /api/v1/guest-wallets
                  provider: stripe
                  required_headers:
                    Idempotency-Key: <cryptographically random UUID v4>
                  requires_authentication: false
                  requires_user_confirmation: true
                  requires_user_interaction: true
                  response_fields:
                  - checkout_url
                  - api_key
                  - status_url
                  response_url_field: checkout_url
    NotFound:
      description: Not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: not_found
            message: Resource not found.
    Unauthenticated:
      description: Unauthenticated
      headers:
        Cache-Control:
          description: Prevents storage of authentication responses.
          schema:
            type: string
            const: no-store
        WWW-Authenticate:
          description: Bearer authentication challenge.
          schema:
            type: string
            const: Bearer realm="xquik"
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: unauthenticated
            message: Authentication required. Provide a valid API key or bearer token.
    AnonymousGuestAuthenticationRequired:
      description: 'Authentication required for a non-MPP paid read. The Bearer challenge requests authentication and is not a Payment challenge. Requests without credentials advertise accountless Stripe checkout, but create no checkout. Explicit invalid credentials return the plain error shape. Call an advertised action only after explicit user confirmation.

        '
      headers:
        Cache-Control:
          description: Prevents storage of the guest checkout action.
          schema:
            type: string
            const: no-store
        WWW-Authenticate:
          description: Bearer authentication challenge, not a Payment challenge.
          schema:
            type: string
            const: Bearer realm="xquik"
      content:
        application/json:
          schema:
            oneOf:
            - $ref: '#/components/schemas/AnonymousGuestAuthenticationRequired'
            - allOf:
              - $ref: '#/components/schemas/Error'
              - not:
                  required:
                  - payment_options
          example:
            account_required: false
            error: unauthenticated
            message: Authentication required.
            next_step: Ask the user to confirm a USD amount before creating checkout.
            payment_options:
              guest_wallet:
                create_checkout:
                  account_required: false
                  amount_bounds:
                    currency: usd
                    maximum_minor: 25000
                    minimum_minor: 1000
                  body:
                    amount_minor: 1000
                    currency: usd
                  creates: checkout_url
                  method: POST
                  path: /api/v1/guest-wallets
                  provider: stripe
                  required_headers:
                    Idempotency-Key: <cryptographically random UUID v4>
                  requires_authentication: false
                  requires_user_confirmation: true
                  requires_user_interaction: true
                  response_fields:
                  - checkout_url
                  - api_key
                  - status_url
                  response_url_field: checkout_url
    RateLimitExceeded:
      description: 'Xquik tier rate limit exceeded. The response includes a `Retry-After` header with the number of seconds to wait before retrying.

        '
      content:
        application/json:
          schema:
            allOf:
            - $ref: '#/components/schemas/Error'
            - type: object
              properties:
                retryAfter:
                  type: integer
                  example: 60
          example:
            error: rate_limit_exceeded
            message: Too many requests. Try again later.
            retryAfter: 60
      headers:
        Retry-After:
          description: Seconds until the next permitted request.
          schema:
            example: 60
            minimum: 1
            type: integer
    XApiError:
      description: 'Dependency unavailable, unauthorized, or rate limited. Default v1 returns 502. The best-practice response contract returns 424 for transparent dependency failures.

        '
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: x_api_unavailable
            message: X data source temporarily unavailable. Try again later.
    InvalidInput:
      description: Invalid input
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: invalid_input
            message: Invalid input. Check the request body.
  parameters:
    ResultPageSize:
      name: pageSize
      in: query
      description: 'Maximum page items (1-100, default 20). Source, filters, or credits can reduce results. Continue while has_next_page is true. Deprecated limit and count aliases remain accepted.

        '
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
  schemas:
    XWritePaymentRequired:
      allOf:
      - $ref: '#/components/schemas/XWriteAction'
      - type: object
        required:
        - error
        - message
      description: 'Durable failed write action with the applicable payment guidance.

        '
    GuestWalletPurchaseRequest:
      description: User-confirmed guest wallet checkout request.
      type: object
      additionalProperties: false
      required:
      - amount_minor
      - currency
      properties:
        amount_minor:
          type: integer
          minimum: 1000
          maximum: 25000
          description: USD cents accepted for this checkout.
          example: 1000
        currency:
          type: string
          const: usd
    UserIdentityVerification:
      description: Identity verification metadata displayed by X.
      type: object
      properties:
        description:
          type: string
        isIdentityVerified:
          type: boolean
        verifiedSinceMsec:
          type: string
    TweetArticleMetadata:
      description: Article metadata attached to a tweet.
      type: object
      properties:
        id:
          type: string
        title:
          type: string
        previewText:
          type: string
        coverMediaUrl:
          type: string
    TweetMedia:
      description: Normalized media attached to a tweet.
      type: object
      required:
      - mediaUrl
      - type
      - url
      properties:
        mediaUrl:
          type: string
          description: Media preview URL
        type:
          type: string
          enum:
          - photo
          - video
          - animated_gif
        url:
          type: string
          description: X media link from the tweet
        allowDownload:
          type: boolean
          description: Whether X permits direct media download.
        altText:
          type: string
          description: Accessibility text supplied for the media.
        aspectRatio:
          type: array
          description: Video aspect ratio as width and height.
          items:
            type: integer
        availabilityStatus:
          type: string
          description: Media availability state reported by X.
        displayUrl:
          type: string
          description: Display-friendly media URL reported by X.
        durationMillis:
          type: integer
          description: Video duration in milliseconds.
        expandedUrl:
          type: string
          description: Expanded X media URL.
        faceRects:
          type: object
          description: Face-aware crop rectangles grouped by media size.
          additionalProperties:
            type: array
            items:
              type: object
              required:
              - x
              - y
              - w
              - h
              properties:
                x:
                  type: integer
                y:
                  type: integer
                w:
                  type: integer
                h:
                  type: integer
        focusRects:
          type: array
          description: Suggested image crops reported by X.
          items:
            type: object
            required:
            - x
            - y
            - w
            - h
            properties:
              x:
                type: integer
              y:
                type: integer
              w:
                type: integer
              h:
                type: integer
        height:
          type: integer
          description: Original media height.
        id:
          type: string
          description: X media entity ID.

# --- truncated at 32 KB (82 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/xquik-api/refs/heads/main/openapi/xquik-api-communities-api-openapi.yml