curl --request PATCH \
--url https://api.social-api.ai/v1/users/me \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"job_role": "Founder / CEO",
"lock_accounts_to_brand": true,
"onboarding": false,
"referral": "Google search",
"signup_metadata": {},
"use_case": "Managing my own brand's social accounts"
}
EOFconst options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
job_role: 'Founder / CEO',
lock_accounts_to_brand: true,
onboarding: false,
referral: 'Google search',
signup_metadata: {},
use_case: 'Managing my own brand\'s social accounts'
})
};
fetch('https://api.social-api.ai/v1/users/me', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.social-api.ai/v1/users/me"
payload = {
"job_role": "Founder / CEO",
"lock_accounts_to_brand": True,
"onboarding": False,
"referral": "Google search",
"signup_metadata": {},
"use_case": "Managing my own brand's social accounts"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"allowed_platforms": [
"instagram",
"facebook"
],
"avatar_url": "https://example.com/avatar.jpg",
"beta_tester": false,
"billing_block_reason": "past_due",
"billing_blocked": false,
"billing_blocked_at": "<string>",
"billing_currency": "usd",
"email": "user@example.com",
"experiment_enrolled": false,
"experiment_variant": "control",
"facebook_page_selection": false,
"id": "550e8400-e29b-41d4-a716-446655440000",
"job_role": "Founder / CEO",
"lock_accounts_to_brand": false,
"onboarding": true,
"plan": "free",
"role": "admin",
"signup_metadata": {},
"use_case": "Managing clients' accounts (agency)"
}{
"error": {
"code": "resource.not_found",
"message": "Account not found",
"meta": {}
},
"request_id": "01HZ9X3Q4R5M6N7P8V2K0W1J"
}{
"error": {
"code": "resource.not_found",
"message": "Account not found",
"meta": {}
},
"request_id": "01HZ9X3Q4R5M6N7P8V2K0W1J"
}{
"error": {
"code": "resource.not_found",
"message": "Account not found",
"meta": {}
},
"request_id": "01HZ9X3Q4R5M6N7P8V2K0W1J"
}Update current user
Updates the authenticated user’s profile. Supports setting onboarding=false to mark onboarding as complete, and optionally recording use_case, referral, job_role and signup_metadata. The response reflects the current billing_blocked state, unaffected by this update. The response includes the caller’s team role: “admin”, “developer”, or "" for the account owner.
curl --request PATCH \
--url https://api.social-api.ai/v1/users/me \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"job_role": "Founder / CEO",
"lock_accounts_to_brand": true,
"onboarding": false,
"referral": "Google search",
"signup_metadata": {},
"use_case": "Managing my own brand's social accounts"
}
EOFconst options = {
method: 'PATCH',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
job_role: 'Founder / CEO',
lock_accounts_to_brand: true,
onboarding: false,
referral: 'Google search',
signup_metadata: {},
use_case: 'Managing my own brand\'s social accounts'
})
};
fetch('https://api.social-api.ai/v1/users/me', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.social-api.ai/v1/users/me"
payload = {
"job_role": "Founder / CEO",
"lock_accounts_to_brand": True,
"onboarding": False,
"referral": "Google search",
"signup_metadata": {},
"use_case": "Managing my own brand's social accounts"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"allowed_platforms": [
"instagram",
"facebook"
],
"avatar_url": "https://example.com/avatar.jpg",
"beta_tester": false,
"billing_block_reason": "past_due",
"billing_blocked": false,
"billing_blocked_at": "<string>",
"billing_currency": "usd",
"email": "user@example.com",
"experiment_enrolled": false,
"experiment_variant": "control",
"facebook_page_selection": false,
"id": "550e8400-e29b-41d4-a716-446655440000",
"job_role": "Founder / CEO",
"lock_accounts_to_brand": false,
"onboarding": true,
"plan": "free",
"role": "admin",
"signup_metadata": {},
"use_case": "Managing clients' accounts (agency)"
}{
"error": {
"code": "resource.not_found",
"message": "Account not found",
"meta": {}
},
"request_id": "01HZ9X3Q4R5M6N7P8V2K0W1J"
}{
"error": {
"code": "resource.not_found",
"message": "Account not found",
"meta": {}
},
"request_id": "01HZ9X3Q4R5M6N7P8V2K0W1J"
}{
"error": {
"code": "resource.not_found",
"message": "Account not found",
"meta": {}
},
"request_id": "01HZ9X3Q4R5M6N7P8V2K0W1J"
}Authorizations
Prefix your API key with "Bearer ". Example: Authorization: Bearer sapi_key_...
Body
Fields to update
JobRole records what best describes the user. Surrounding whitespace is trimmed, an empty value leaves the current one unchanged, and values longer than 120 characters are truncated.
"Founder / CEO"
LockAccountsToBrand toggles whether a social account already connected to one brand may be re-connected (moved) to a different brand. When true, such a connect attempt is rejected with 409 account.already_linked.
true
false
"Google search"
SignupMetadata adds keys to the signup answers on record: a shallow merge, so keys sent replace the same keys and others are kept. At most 4096 bytes once encoded.
Show child attributes
Show child attributes
"Managing my own brand's social accounts"
Response
Updated user profile
["instagram", "facebook"]
"https://example.com/avatar.jpg"
false
BillingBlockReason is why access is paused, empty when it is not. "past_due": a payment failed, and settling it restores access. "ban": the account was suspended for a Terms of Service violation. Paying does not lift it, and every route except this one returns 403 auth.suspended. Contact support to appeal.
"past_due"
BillingBlocked is true when API access and webhook delivery are paused. Read BillingBlockReason to tell why and whether paying lifts it.
false
BillingBlockedAt is when the block began, or null when not blocked.
BillingCurrency is the currency your subscription is billed in: "usd" or "eur". A subscription never changes currency, so plan changes are priced in it. Kept after a cancellation; "" when you never subscribed.
"usd"
"user@example.com"
ExperimentEnrolled is true only when ExperimentVariant was assigned by the experiment itself. False means the "control" above is a fallback (not enrolled, flag off, or evaluation failed) and must not be recorded as the caller's arm.
false
ExperimentVariant is the caller's variant for staged feature rollouts: "control" or "treatment". "control" unless the caller is enrolled.
"control"
FacebookPageSelection, when true, makes a Facebook connection (and an Instagram connection through Facebook Login) end with status=selection_required so you choose the Pages. Read-only.
false
"550e8400-e29b-41d4-a716-446655440000"
JobRole is what best describes the user, as answered during onboarding. Null until answered.
"Founder / CEO"
LockAccountsToBrand, when true, rejects connecting a social account that is already connected to another of your brands (409 account.already_linked) instead of moving it. Default false.
false
true
"free"
Role is the caller's team role: "admin", "developer", or "" for the account Owner, who holds no Role. An API key and an OAuth token both read "".
"admin"
SignupMetadata holds open-ended answers recorded at signup, such as referral_source and search_query. An empty object until answered.
Show child attributes
Show child attributes
"Managing clients' accounts (agency)"