/api/public/v1/brand-kit/offerings/{id}Update a product or service
Change an existing product or service. Send only the fields that change.
How it works
- Authenticate with your company API key in
x-auth-token. - Identify the acting member with
x-auth-user: their pagename or theirexternal_id. - The
idin the URL (the id you gave when you created it) picks the record. It is separate from the member'sexternal_idused inx-auth-user. - Send only what changed; fields you leave out stay as they are. At least one field is required.
offering_typecannot be changed. - No record with that id returns 404 (use Create). An archived record returns 409 (restore it first with the status endpoint).
Where the record goes
- Company owner or admin: the company Brand Kit (the default), shared with members through
visibilityandshow_on_bio. Sendadd_to_my_products_services: trueto change a record in your own Products and Services instead. - Any other member: always their own Products and Services list. It is private to them, so
visibility,member_slugs,publishedandtagsdo not apply (a 422 says so), andshow_on_bioputs it on their own Bio / Profile page. - Your own list follows the member's plan limits, and the same numbers cap what the Bio / Profile page can show. The company Brand Kit follows the company plan. Call Plan limits for the numbers and for the plan names your company set.
- Send the same
add_to_my_products_servicesvalue when you create, update, read, publish, archive or list, so you reach the same list.
Company Brand Kit: where it shows
visibilitycontrols which members can use the record:all_members(so one change reaches every affiliate) orspecificwithmember_slugs.show_on_bio(default false) lists the record on the Bio page of every member who can see it, without the member choosing it. Members can still hide it from their own Bio. When false, members may still add it themselves from the Brand Kit.published(default true) is the master switch: an unpublished record is hidden from every member and Bio page, and keeps its settings for when it is published again.
Purchase link
external_urlis the Buy now link and must start with https://.- Put
{affiliate_id}in the link and each member's page fills in that member's ownexternal_id, falling back to their pagename.
Limits
Pictures and videos
media_links: pictures or videos you host. They are shown straight from your address, so Upward does not copy them (if the file is removed on your side, it disappears here too).media_uploads: pictures or videos Upward fetches once from the address you give, and stores. Pictures (JPEG, PNG, GIF, WebP or AVIF, up to 10 MB) are saved in the company's storage, or in the member's own storage for their own list. Videos (up to 250 MB) are sent to Mux and play with the Mux player on the Bio / Profile page once Mux has prepared them:statusshowsprocessinguntil then, and Get shows it as soon as it is ready.- Both together allow at most 12 pictures and videos per product or service. A request may fetch up to 6 new pictures and 3 new videos.
- Each list replaces its own part when you send it and leaves it alone when you leave it out. Sending the same address again keeps the stored copy without fetching it again, and leaving an address out removes its stored file.
- If any file in
media_uploadscannot be fetched, nothing is saved and the 422 lists each problem. - On a member's own list on the Free plan, each video upload uses one of the member's free video uploads.
- Updating a record never counts against a plan limit.
full_descriptionaccepts rich HTML; scripts and unsafe links are removed.
Body fields
idstring (1–150)requiredYour own stable id for this product or service (not a member's external_id), in the URL. Picks the record to change.
offering_typeproduct | serviceoptionalCannot be changed. Send it only if it matches the record.
namestring (1–150)optionalThe new name.
short_descriptionstring (1–300)optionalOne-line summary.
full_descriptionstring (HTML, ≤20000)optionalFull description; sanitized HTML is allowed.
price_displaystring (1–100)optionalThe price as shown to visitors.
skustring (≤150)optionalYour SKU.
external_urlstring (https link)optionalPurchase link. May contain {affiliate_id}.
media_linksarray of { kind, url, title }optionalPictures or videos you host, as https links. Shown from your address; not copied. Replaces the existing links when sent. Counts toward the limit of 12 together with media_uploads.
media_uploadsarray of { kind, url, title }optionalPictures or videos Upward fetches from the https address and stores (pictures in storage, videos on Mux). Replaces the existing uploads when sent; an address already stored is kept, not fetched again. Counts toward the limit of 12 together with media_links.
tagsarray of string (≤20)optionalCompany Brand Kit only. Free-form tags.
categorystring (≤80)optionalCategory name. Created in the Brand Kit if it does not exist yet.
featuresarray of string (≤40)optionalFeature bullets.
benefitsarray of string (≤40)optionalBenefit bullets.
visibilityall_members | specificoptionalCompany Brand Kit only. Who can use the record.
member_slugsarray of string (≤500)optionalCompany Brand Kit only. Pagenames of the members who can use it. Required with visibility specific.
show_on_biobooleanoptionalCompany Brand Kit: list it on the Bio page of every member who can see it. Your own list: show it on your own Bio / Profile page.
publishedbooleanoptionalCompany Brand Kit only. Send false to hide it everywhere, true to show it again.
add_to_my_products_servicesbooleanoptionalOwners and admins only: true works on your own Products and Services list instead of the company Brand Kit. Other members always use their own list, so for them it can be left out or true.
| Field | Type | Description |
|---|---|---|
| idreq | string (1–150) | Your own stable id for this product or service (not a member's external_id), in the URL. Picks the record to change. |
| offering_typeopt | product | service | Cannot be changed. Send it only if it matches the record. |
| nameopt | string (1–150) | The new name. |
| short_descriptionopt | string (1–300) | One-line summary. |
| full_descriptionopt | string (HTML, ≤20000) | Full description; sanitized HTML is allowed. |
| price_displayopt | string (1–100) | The price as shown to visitors. |
| skuopt | string (≤150) | Your SKU. |
| external_urlopt | string (https link) | Purchase link. May contain {affiliate_id}. |
| media_linksopt | array of { kind, url, title } | Pictures or videos you host, as https links. Shown from your address; not copied. Replaces the existing links when sent. Counts toward the limit of 12 together with media_uploads. |
| media_uploadsopt | array of { kind, url, title } | Pictures or videos Upward fetches from the https address and stores (pictures in storage, videos on Mux). Replaces the existing uploads when sent; an address already stored is kept, not fetched again. Counts toward the limit of 12 together with media_links. |
| tagsopt | array of string (≤20) | Company Brand Kit only. Free-form tags. |
| categoryopt | string (≤80) | Category name. Created in the Brand Kit if it does not exist yet. |
| featuresopt | array of string (≤40) | Feature bullets. |
| benefitsopt | array of string (≤40) | Benefit bullets. |
| visibilityopt | all_members | specific | Company Brand Kit only. Who can use the record. |
| member_slugsopt | array of string (≤500) | Company Brand Kit only. Pagenames of the members who can use it. Required with visibility specific. |
| show_on_bioopt | boolean | Company Brand Kit: list it on the Bio page of every member who can see it. Your own list: show it on your own Bio / Profile page. |
| publishedopt | boolean | Company Brand Kit only. Send false to hide it everywhere, true to show it again. |
| add_to_my_products_servicesopt | boolean | Owners and admins only: true works on your own Products and Services list instead of the company Brand Kit. Other members always use their own list, so for them it can be left out or true. |
Responses
{
"success": true,
"created": false,
"offering": {
"id": "course-101",
"uuid": "0b1f0a2c-8f3e-4a51-9c0d-1c2b3a4d5e6f",
"offering_type": "product",
"name": "Intro to Wealth Building",
"price_display": "$97",
"external_url": "https://shop.example.com/buy/101?ref={affiliate_id}",
"visibility": "all_members",
"member_count": null,
"show_on_bio": true,
"published": true,
"status": "published"
}
}{ "success": false, "error": "Body must be valid JSON" }{ "success": false, "error": "Missing x-auth-user header" }{ "success": false, "error": "x-auth-user must be the company owner or an admin to manage products and services." }{ "success": false, "error": "No product or service has id "course-101". Use Create to add it." }{ "success": false, "error": "The product or service with id "course-101" is archived. Restore it with the status endpoint first." }{
"success": false,
"error": "Validation failed",
"issues": ["offering_type: required (product or service).", "external_url: must be a link starting with https://."]
}{ "success": false, "error": "The record could not be saved." }/api/public/v1/brand-kit/offerings/course-101Your own stable id for this product or service (not a member's external_id), in the URL. Picks the record to change.