UUpward API
v1
POST/api/public/v1/brand-kit/offerings
Requires x-auth-token

Create a product or service

Add a new product or service. It fails with 409 if the id is already used; use Update to change an existing one.

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.
  • Send your own stable id for the new record in the body (for example your product id). You use it later in the URL of Update, Get and Status. It is separate from the member's external_id used in x-auth-user. If the id is already used the call returns 409; use Update to change an existing record.
  • id, offering_type, name, short_description and price_display are required.

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 add it to 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 (the default, so one push 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.
  • Products and services together count against the company plan's Brand Kit limit (a 403 explains it).
  • 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). Used to find it again in Update, Get and Status.

offering_typeproduct | servicerequired

Cannot be changed afterwards.

namestring (1–150)required

The name shown to members and visitors.

short_descriptionstring (1–300)required

One-line summary.

full_descriptionstring (HTML, ≤20000)optional

Full description; sanitized HTML is allowed.

price_displaystring (1–100)required

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. Defaults to all_members on create.

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. Defaults to false.

publishedbooleanoptional

Company Brand Kit only. Defaults to true on create. Send false to hide it everywhere.

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

201CreatedThe record was created.
{
  "success": true,
  "created": true,
  "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 active member in your company matches x-auth-user.
{ "success": false, "error": "No active member matches "jane-doe" in this company." }
403Plan limitAdding this record would go over the company plan's Brand Kit limit.
{ "success": false, "error": "Brand Kit limit: your Free Company plan includes up to 10 products and services and you have 10. …" }
409ConflictA record with this id already exists (or is archived), or the SKU is taken.
{ "success": false, "error": "A product or service with id "course-101" already exists. Use Update to change it." }
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." }
POST/api/public/v1/brand-kit/offerings

Your own stable id for this product or service (not a member's external_id). Used to find it again in Update, Get and Status.

Cannot be changed afterwards.

The name shown to members and visitors.

One-line summary.

Full description; sanitized HTML is allowed.

The price as shown to visitors.

Your SKU.

Purchase link. May contain {affiliate_id}.

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.

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.

Company Brand Kit only. Free-form tags.

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

Feature bullets.

Benefit bullets.

Company Brand Kit only. Who can use the record. Defaults to all_members on create.

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

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. Defaults to false.

Company Brand Kit only. Defaults to true on create. Send false to hide it everywhere.

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.

ResponseNot sent yet