UUpward API
v1
PATCH/api/public/v1/brand-kit/offerings/{id}
Requires x-auth-token

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 their external_id.
  • The id in the URL (the id you gave when you created it) picks the record. It is separate from the member's external_id used in x-auth-user.
  • Send only what changed; fields you leave out stay as they are. At least one field is required. offering_type cannot 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 visibility and show_on_bio. Send add_to_my_products_services: true to 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, published and tags do not apply (a 422 says so), and show_on_bio puts 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_services value when you create, update, read, publish, archive or list, so you reach the same list.

Company Brand Kit: where it shows

  • visibility controls which members can use the record: all_members (so one change reaches every affiliate) or specific with member_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_url is 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 own external_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: status shows processing until 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_uploads cannot 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_description accepts rich HTML; scripts and unsafe links are removed.

Body fields

idstring (1–150)required

Your own stable id for this product or service (not a member's external_id), in the URL. Picks the record to change.

offering_typeproduct | serviceoptional

Cannot be changed. Send it only if it matches the record.

namestring (1–150)optional

The new name.

short_descriptionstring (1–300)optional

One-line summary.

full_descriptionstring (HTML, ≤20000)optional

Full description; sanitized HTML is allowed.

price_displaystring (1–100)optional

The price as shown to visitors.

skustring (≤150)optional

Your SKU.

external_urlstring (https link)optional

Purchase link. May contain {affiliate_id}.

media_linksarray of { kind, url, title }optional

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_uploadsarray of { kind, url, title }optional

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.

tagsarray of string (≤20)optional

Company Brand Kit only. Free-form tags.

categorystring (≤80)optional

Category name. Created in the Brand Kit if it does not exist yet.

featuresarray of string (≤40)optional

Feature bullets.

benefitsarray of string (≤40)optional

Benefit bullets.

visibilityall_members | specificoptional

Company Brand Kit only. Who can use the record.

member_slugsarray of string (≤500)optional

Company Brand Kit only. Pagenames of the members who can use it. Required with visibility specific.

show_on_biobooleanoptional

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.

publishedbooleanoptional

Company Brand Kit only. Send false to hide it everywhere, true to show it again.

add_to_my_products_servicesbooleanoptional

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

200OKThe record after the change.
{
  "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"
  }
}
400Bad requestThe request body is not valid JSON.
{ "success": false, "error": "Body must be valid JSON" }
401UnauthorizedMissing or invalid x-auth-token, or missing x-auth-user.
{ "success": false, "error": "Missing x-auth-user header" }
403Not a managerx-auth-user is not the company owner or an admin.
{ "success": false, "error": "x-auth-user must be the company owner or an admin to manage products and services." }
404Not foundNo record has that id (use Create), or no active member matches x-auth-user.
{ "success": false, "error": "No product or service has id "course-101". Use Create to add it." }
409ConflictThe record is archived, several records share this id, or the SKU is taken.
{ "success": false, "error": "The product or service with id "course-101" is archived. Restore it with the status endpoint first." }
422UnprocessableValidation failed; every problem is listed in issues.
{
  "success": false,
  "error": "Validation failed",
  "issues": ["offering_type: required (product or service).", "external_url: must be a link starting with https://."]
}
500Server errorThe record could not be saved; the request is logged for support.
{ "success": false, "error": "The record could not be saved." }
PATCH/api/public/v1/brand-kit/offerings/course-101

Your own stable id for this product or service (not a member's external_id), in the URL. Picks the record to change.

ResponseNot sent yet