X

Connect your client's X with a sign-in, and call its API through Operate As.

Website
x.com
Connects by
Signing in with X
Category
Social and video
Services
1
Tools
230
ServiceKey
Xx

Connecting

Your client presses Connect on their link and approves on X's own screen. Operate As never sees their password.

Check they're connected
curl https://api.operate.as/v1/me/clients \  -H "Authorization: Bearer $OPERATE_AS_API_KEY"
Response
[  {    "id": "6f1c2a7e-...",    "name": "Miller Dental",    "services": [      "x"    ]  }]

Permissions

What the client readsPermission it asks for
See poststweet.read
Post as youtweet.write
See your profile and other accountsusers.read

Tools

Install X's typed package for your language:

pip install operate-as-x
Run x.accept_chat_message_request
curl -X POST https://api.operate.as/v1/actions/x.accept_chat_message_request \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "id": "<id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/x.accept_chat_message_request

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Pass-through

Paths continue from https://api.x.com/2. Your Operate As key goes in Authorization; the client's access is added for you.

See Pass-through requests for the full request and response format.

Call any endpoint
curl "https://api.operate.as/v1/clients/6f1c2a7e-.../x/..." \  -H "Authorization: Bearer $OPERATE_AS_API_KEY"
Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

When access ends

Operate As renews the sign-in before it runs out and checks it daily. If X refuses to renew it, the service shows Expired, you're alerted, and your client reconnects from the same link.

See Keeping access alive and Removing access.

Calls answer
HTTP/1.1 409 ConflictContent-Type: application/json{  "detail": "Miller Dental's X access ended. Send them their link to reconnect."}
Your webhook receives
{  "id": "evt_3f9a1c…",  "type": "connection.expired",  "createdAt": "2026-10-16T08:00:00+00:00",  "data": {    "clientId": "6f1c2a7e-...",    "clientName": "Miller Dental",    "provider": "x",    "services": [      "x"    ],    "reconnectUrl": "https://…"  }}