Update your profile
Change the name, bio, location, website or birth date of your account. Fields you leave out stay as they are.
/client/profileYour account, your proxy, your risk.
Account actions run with the session cookie of your own X account and go out through your own proxy. Use only accounts you control and follow X's rules. Automated posting, following or liking can get the account limited or suspended; that is between you and X. Treat the cookie like a password: it gives full access to the account. Trial keys cannot call these endpoints.
Runs the same request as the Edit profile dialog on x.com. Send at least one of the profile fields; an empty string clears description, location or url.
Parameters
cookiebody · string · requiredCookie header of your own logged-in X session. Must contain auth_token and ct0; guest_id is used when present.
proxybody · string · requiredYour proxy, format http://user:pass@host:port. The requests to X go out through it. Used only for this request.
namebody · string · optionalDisplay name, up to 50 characters. Cannot be empty.
descriptionbody · string · optionalBio, up to 160 characters.
locationbody · string · optionalLocation, up to 30 characters.
urlbody · string · optionalWebsite, up to 100 characters.
birthdatebody · object | null · optional{day, month, year, visibility?, year_visibility?}. visibility and year_visibility are public, followers, following, mutualfollow or self; left out, X keeps the current setting. The date must be real, not in the future and at most 120 years back. null removes the birth date.
Body parameters are sent as a JSON object with Content-Type: application/json.
Notes
- On a verified (Premium) account, x.com warns that changing the name can remove the checkmark until X has reviewed the change.
Example request
curl -X POST 'https://api.twittrapi.com/client/profile' \
--header 'X-API-KEY: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{"cookie":"auth_token=...; ct0=...","proxy":"http://user:pass@host:port","description":"Building things with the API","location":"Berlin"}'import httpx
resp = httpx.post(
"https://api.twittrapi.com/client/profile",
headers={"X-API-KEY": "YOUR_API_KEY"},
json={
"cookie": "auth_token=...; ct0=...",
"proxy": "http://user:pass@host:port",
"description": "Building things with the API",
"location": "Berlin",
},
timeout=60,
)
print(resp.status_code, resp.json())const resp = await fetch("https://api.twittrapi.com/client/profile", {
method: "POST",
headers: { "X-API-KEY": process.env.TWITTRAPI_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({
cookie: "auth_token=...; ct0=...",
proxy: "http://user:pass@host:port",
description: "Building things with the API",
location: "Berlin",
}),
});
console.log(resp.status, await resp.json());Base URL https://api.twittrapi.com, key in the X-API-KEY header. The SDKs do not wrap account actions, so the examples are plain HTTP calls.
Response
Wrapper built by the API: {"status_code": <X status>, "response": "<X response body as a string>"}. The HTTP status is X's status when X answered 4xx or 5xx, otherwise 200. Parse response a second time to get X's JSON. On success response is your updated user object (X's v1.1 user: name, description, location, url, profile_image_url_https, ...).
Simple format (?format=simple or X-Response-Format: simple): {data: User}: your profile after the change, the same User object as the read endpoints. When X reports an error inside the wrapper (for example a tweet that is already liked), the usual wrapper is returned unchanged. Schema.
{
"status_code": 200,
"response": "{\"id\":1000000000000000001,\"id_str\":\"1000000000000000001\",\"name\":\"Example\",\"screen_name\":\"example_user\",\"location\":\"Somewhere\",\"profile_location\":null,\"description\":\"Example profile\",\"url\":\"https://t.co/1LvaPkUT0U\",\"entities\":{\"url\":{\"urls\":[{\"url\":\"https://t.co/1LvaPkUT0U\",\"expanded_url\":\"https://ph.com\",\"display_url\":\"ph.com\",\"indices\":[0,23]}]},\"description\":{\"urls\":[]}},\"protected\":false,\"followers_count\":0,\"fast_followers_count\":0,\"normal_followers_count\":0,\"friends_count\":0,\"listed_count\":0,\"created_at\":\"Tue Oct 13 05:32:03 +0000 2026\",\"favourites_count\":0,\"utc_offset\":null,\"time_zone\":null,\"geo_enabled\":false,\"verified\":false,\"statuses_count\":0,\"media_count\":0,\"lang\":null,\"contributors_enabled\":false,\"is_translator\":false,\"is_translation_enabled\":false,\"profile_background_color\":\"F5F8FA\",\"profile_background_image_url\":null,\"profile_background_image_url_https\":null,\"profile_background_tile\":false,\"profile_image_url\":\"http://pbs.twimg.com/profile_images/1000000000000000002/sL01K8MD_normal.jpg\",\"profile_image_url_https\":\"https://pbs.twimg.com/profile_images/1000000000000000002/sL01K8MD_normal.jpg\",\"profile_link_color\":\"1DA1F2\",\"profile_sidebar_border_color\":\"C0DEED\",\"profile_sidebar_fill_color\":\"DDEEF6\",\"profile_text_color\":\"333333\",\"profile_use_background_image\":true,\"has_extended_profile\":true,\"default_profile\":true,\"default_profile_image\":false,\"pinned_tweet_ids\":[],\"pinned_tweet_ids_str\":[],\"has_custom_timelines\":false,\"can_media_tag\":true,\"followed_by\":null,\"following\":false,\"follow_request_sent\":false,\"notifications\":false,\"advertiser_account_type\":\"none\",\"advertiser_account_service_levels\":[],\"extended_profile\":{\"id\":1000000000000000001,\"id_str\":\"1000000000000000001\",\"birthdate\":{\"month\":11,\"day\":3,\"year\":1999,\"visibility\":\"self\",\"year_visibility\":\"self\"}},\"business_profile_state\":\"none\",\"translator_type\":\"none\",\"withheld_in_countries\":[],\"require_some_consent\":false}"
}{
"data": {
"id": "1000000000000000001",
"username": "example_user",
"name": "Example",
"description": "Example profile",
"location": "Somewhere",
"url": "https://ph.com",
"createdAt": "2026-10-13T05:32:03Z",
"avatarUrl": "https://pbs.twimg.com/profile_images/1000000000000000002/sL01K8MD.jpg",
"bannerUrl": null,
"verified": false,
"verifiedType": null,
"protected": false,
"counts": {
"followers": 0,
"following": 0,
"tweets": 0,
"likes": 0,
"media": 0,
"listed": 0
},
"pinnedTweetIds": [],
"isAutomated": false
}
}In the raw format, field names and nesting come from X and can change without notice. See Response format; the simple format keeps a fixed schema.
Errors
- 400The body is not valid JSON.
- 422cookie or proxy is missing, or the cookie has no ct0. No profile field is set, a field is too long or not a string, name is empty, or birthdate is not a valid date or visibility. Also: the account is suspended, or X rejected the session.
- 407The proxy is unreachable or timed out.
- X'sX refused the change: answered with X's status and {"error": "X refused the profile update: <X's reason>"}; when the image upload itself fails: "X refused the image upload: <reason>".
Errors every endpoint can return (401, 402, 403, 404, 408, 409, 429, 5xx), and which of them are charged, are on the Errors page. Calls that fail with 400, 408, 409 or a 5xx error are refunded.