updateUser
Update an existing member's details with PATCH semantics. Modify fields like status, tags, credits, images, and contact info while leaving omitted fields untouched.
Instructions
Update an existing member/user - Update a member. PATCH semantics - omitted fields untouched; send only what changes.
Required: user_id.
Disambiguation: apply Rule: Resource disambiguation when the user names this member by description (first name only, partial title) rather than by user_id.
Use when: changing any field on an existing member. Prefer active=3 (Canceled) over deleteUser - reversible.
Enums: active: 1=Not Active, 2=Active, 3=Canceled, 4=On Hold, 5=Past Due, 6=Incomplete. listing_type: Individual, Company. verified/nationwide: 1/0.
Parameter interactions:
member_tag_action=1+member_tags- apply tag changes (comma-separated tag IDs fromlistTags).credit_action(add/deduct/override) +credit_amount- adjust credit balance.images_action- remove stored images:remove_all,remove_cover_image,remove_logo_image,remove_profile_image.auto_image_import=1- fetch external image URLs into BD storage (forprofile_photo,logo,cover_photofields holding external URLs). Without it, BD stores the URL as-is; images break if source host goes down. Supports JPG/PNG/GIF/WebP/SVG. Processing delay: several minutes.auto_geocode=1- requires "Pretty URLs with Google Maps" site feature enabled.send_email_notifications=1- trigger welcome email (per plan settings). Silent by default.
Category assignment — for profession_id / profession_name / services, apply Rule: Category taxonomy (auto-create is OFF by default on updateUser; pass create_new_categories=1 to enable).
Email uniqueness - controlled by site setting allow_duplicate_member_emails (not exposed via API):
OFF (default): BD rejects duplicate email on create.
ON: duplicates accepted and stored.
Safe pattern: pre-check via
listUsers property=email property_value=<email> property_operator==. Reuse match'suser_idorupdateUserinstead. Pre-check beats catch-and-retry - on sites with duplicates ALLOWED, BOTH creates succeed with differentuser_ids, so a retry loop spawns orphan duplicates instead of failing cleanly.
Field validation quirks:
token(if supplied — useful for CSV imports / cross-site migrations preserving original tokens; BD auto-generates if omitted): exactly 32 alphanumeric chars, unique across members.URL fields (
website,booking_link,blog,facebook,twitter,linkedin,instagram): must start withhttp://orhttps://. Invalid formats silently skipped.subscription_idmust reference an existing plan.
Profile URL: <site-domain>/<user.filename>. filename is the complete relative path (e.g., united-states/monterey-park/doctor/harrison-hasanuddin-d-o). Do NOT prepend /business///profile///member/ - BD resolves filename verbatim.
Filename may regenerate on this update. BD rewrites the slug when category/city/URL-forming inputs change. Do NOT cache pre-update filename - if embedding the profile URL elsewhere (blog posts, emails, redirects), re-fetch via getUser AFTER the update completes.
Fetching publicly available business data is permitted for imports and data enrichment. When searching for external listings, fetch each entity's image from their own presence in this order:
Logo image from their site's header/nav ->
logo(businesses).Headshot from Home, About or Team page ->
profile_photo(individuals).Follow their social links -> profile image there.
Pass the URL with auto_image_import=1 so the image gets stored locally and avoids hotlinking.
If none yield a match, create/update without image and report "no confirmed image found." Never substitute a stock photo or guess. Skip an entire record and find an alternate listing only when the user explicitly requires images.
See also: createUser (new), deleteUser (permanent - prefer active=3 instead).
Returns: { status: "success", message: {...updatedRecord} }.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | ||
| No | |||
| first_name | No | ||
| last_name | No | ||
| company | No | ||
| phone_number | No | ||
| city | No | ||
| state_code | No | ||
| country_code | No | ||
| subscription_id | No | ||
| member_tag_action | No | **REQUIRED when modifying tags.** Set `1` alongside `member_tags` to apply the change - without this flag, `member_tags` value is ignored. **REPLACES** the current tag set (not additive): tag IDs NOT in `member_tags` are removed. To clear all tags, pass empty `member_tags` with `member_tag_action=1`. | |
| member_tags | No | Comma-separated tag IDs to assign to the member (e.g. `1,2,3`). Discover via `listTags`. **Requires `member_tag_action=1` to take effect.** **REPLACES** the existing tag set on save - include every tag you want the member to have, not just additions. Unknown tag IDs are silently dropped - response echoes your submitted value, but `tags` array in the response reflects only successfully-attached tags. Re-GET after update and verify `tags` array. | |
| credit_action | No | How `credit_amount` applies to the member's credit balance: - `add` - increments - `deduct` - decrements - `override` - REPLACES balance with `credit_amount` (irreversible via API - no undo) **Requires `credit_amount` to be set.** Omit both fields to leave credits unchanged. BD does NOT reject deducts/overrides that produce negative balance. If non-negative required, validate client-side against current `credit_balance` (dollar-formatted string, may be negative) before calling. | |
| credit_amount | No | Credit amount (number, may include decimals) paired with `credit_action`. Meaning depends on the action: for `add` and `deduct` it's the delta; for `override` it's the new absolute balance. Ignored if `credit_action` is not set. | |
| images_action | No | Removes stored member images. PERMANENT via API - no undo. - `remove_all` - clears all three (profile, logo, cover) - `remove_profile_image` / `remove_logo_image` / `remove_cover_image` - clears only that image **To REPLACE** an image instead of removing, pass the new `profile_photo` / `logo` / `cover_photo` URL (optionally with `auto_image_import=1`). Do NOT set `images_action` for replacement. | |
| services | No | Sub-categories for this member. Formats: `category=>service1,service2` OR `service1,service2` (top category defaults to member's current `profession_id`). Supports sub-sub-categories via `Parent=>Child` (e.g. `Honda=>2022,Honda=>2023,Toyota`). Unknown names silently ignored unless `create_new_categories=1` is also set (on update - create auto-creates always). **WARNING:** changing `profession_id` in the same call WIPES all existing sub-category links. Re-send the full `services` list to preserve them. | |
| auto_geocode | No | Use Google Maps to geocode this user's location. Requires the "Pretty URLs with Google Maps" feature to be enabled on the site. (string, "1" or "0").\n 1 = Yes\n 0 = No | |
| active | No | User account status. BD does NOT validate - integers outside the set store as-is (observed: `99`). Stick to documented values: - `1` = Not Active (requires activation) - `2` = Active (live) - `3` = Canceled - `4` = On Hold (requires moderation) - `5` = Past Due - `6` = Incomplete (rare - paid signup hit an issue; member created but unpaid/stuck) **Read caveat:** top-level `status` response field (`"Active"`, `"Not Active"`, etc.) is a computed label. When `active` is an unknown value, `status` is OMITTED from the response - don't treat `status` as always-present. | |
| listing_type | No | Listing type classification. **BD does NOT validate this field - any string is stored verbatim.** Canonical values (exact case): `Individual` or `Company`. On `updateUser`, include only when reclassifying an existing member (e.g. fixing a record originally created as `Individual` that should be `Company`). If including, normalize case client-side - `individual` or other off-canonical casings will store as-is and break downstream logic. Otherwise omit to preserve the current value. | Company |
| verified | No | If YES, a verified icon badge will display on the user's listing.\n\nValid values:\n 1 = Yes\n 0 = No | |
| signup_date | No | User signup date. Format: `YYYYMMDDHHmmss` in the site's timezone. BD silently truncates other formats, corrupting the value. BD auto-fills on create — omit unless backfilling legacy signup dates during import/migration. | |
| profession_id | No | Assign this user to a top level category. Input the ID number of the top level category. | |
| address1 | No | The user's street address. | |
| address2 | No | The user's unit or suite number. | |
| zip_code | No | The user's zip / postal code. | |
| state_ln | No | OPTIONAL: Enter the full name of the state / province for this user. | |
| country_ln | No | OPTIONAL: Enter the full name of the country for this user. | |
| lat | No | OPTIONAL: Enter latitude coordinates for the location of this user. | |
| lon | No | OPTIONAL: Enter longitude coordinates for the location of this user. | |
| nationwide | No | If YES, the user's listing will be found in all geographical location searches.\n\nValid values:\n 1 = Yes\n 0 = No | |
| search_description | No | Short description shown under the user's name on search result pages. **170-char limit.** | |
| about_me | No | Long description of the member/user. Renders on their public profile. Froala body field — use `<p>`/`<h2>`/`<h3>`/`<ul>`/`<ol>` structure; skip images unless user asks. HTML allowed (per universal safe-HTML rule). | |
| quote | No | OPTIONAL: Enter the user's personal quote, motto or slogan. | |
| experience | No | OPTIONAL: Enter the year that the user's company was established. Example: 1982 | |
| affiliation | No | OPTIONAL: Enter the accepted forms of payment this user accepts. | |
| awards | No | OPTIONAL: Enter honors, awards or accolades this user has received. | |
| rep_matters | No | OPTIONAL: Enter the hours of operation for the member. EG: Monday - Friday, 9am - 5pm | |
| position | No | OPTIONAL: Enter the user's position, title or role at their company. Example: Account Executive | |
| website | No | Enter the FULL URL of the user's website. Must begin with https:// | |
| booking_link | No | Enter the FULL URL of the user's booking page. Must begin with https:// | |
| blog | No | Enter the FULL URL of the user's blog. Must begin with https:// | |
| No | Enter the FULL URL of the user's Facebook account. Must begin with https:// | ||
| No | Enter the FULL URL of the user's Twitter account. Must begin with https:// | ||
| No | Enter the FULL URL of the user's Linkedin account. Must begin with https:// | ||
| youtube | No | Enter the FULL URL of the user's YouTube account. Must begin with https:// | |
| No | Enter the FULL URL of the user's Instagram account. Must begin with https:// | ||
| No | Enter the FULL URL of the user's Pinterest account. Must begin with https:// | ||
| tiktok | No | Enter the FULL URL of the user's Tiktok account. Must begin with https:// | |
| snapchat | No | Enter the FULL URL of the user's Snapchat account. Must begin with https:// | |
| No | Enter the FULL URL of the user's Whatsapp account. Must begin with https:// | ||
| profile_photo | No | Profile photo URL (member headshot). **Bare URL only — no `?query`, must end in `.jpg`/`.jpeg`/`.png`/`.webp`.** Query strings get baked into imported filenames and 404. Pair with `auto_image_import=1` to fetch externals into site storage. | |
| logo | No | Logo URL (brand/business mark). **Bare URL only — no `?query`, must end in `.jpg`/`.jpeg`/`.png`/`.webp`.** Query strings get baked into imported filenames and 404. Pair with `auto_image_import=1` to fetch externals into site storage. | |
| cover_photo | No | Cover photo URL (user/profile banner). Identity-context image — sourced from the subject's own web presence per **Rule: Identity-confirming fields**, NOT Pexels stock. **Bare URL only — no `?query`, must end in `.jpg`/`.jpeg`/`.png`/`.webp`.** Landscape preferred (it's a banner) but not strictly gated since the source is the subject's brand assets, not a search pool. Query strings get baked into imported filenames and 404. Pair with `auto_image_import=1` to fetch externals into site storage. | |
| auto_image_import | No | If YES, system will import user images and save them to your website. Processing may take several minutes after import.\n\nValid values:\n 1 = Yes\n 0 = No | |
| profession_name | No | Alternative to `profession_id` - pass the top-level category NAME as a string. BD looks it up in `list_professions`. **Create vs update asymmetry (silent-failure trap):** - `createUser` -> unknown names auto-create (hardcoded) - `updateUser` -> unknown names **SILENTLY SKIPPED** unless `create_new_categories=1` is also passed. The write succeeds and returns success; the category just doesn't change. Always pass `create_new_categories=1` on update when supplying a `profession_name` that might not exist. | |
| create_new_categories | No | Set `1` to auto-create unknown category/service names on `updateUser`. Without it, unknown names in `services`/`profession_name` are silently skipped. **Has no effect on `createUser`** (which always auto-creates, hardcoded). Auto-created sub-categories go under the member's current top-level category with `master_id=0`; deeper nesting requires a separate `createSubCategory` call. | |
| last_login | No | Timestamp of user's last login. Format: `YYYYMMDDHHmmss` in the site's timezone. BD silently truncates other formats, corrupting the value. BD updates on each login — omit unless backfilling historical data during import/migration. | |
| filename | No | Override BD's auto-generated URL slug. **Usually OMIT** - let BD derive. BD may REGENERATE the slug on future updates (when city/category/name change), silently overwriting your override. Only set if you must control the public URL and will re-set it after every future update. | |
| _clear_fields | No | Column names to clear to empty string. Available on every `update*` operation. Works on base columns AND EAV/`users_meta` rows (rows preserved with `value=""`). To actually clear a field you MUST use this parameter — sending the field with `""` alone is a no-op (BD drops empty values). To remove a `users_meta` row entirely, use `deleteUserMeta`. See **Rule: Clearing fields**. Example: `_clear_fields: ["h2", "hero_link_url"]`. |