Write

update_card

Updates content fields on an existing card — heading, subheading, description, button, badge, rating, cover color, or visibility. Only supplied fields are changed; omitted fields are untouched.


Parameters

NameTypeRequiredDescription
outlineIdstring—Outline ID. Defaults to your own outline.
stackIdstringYesID of the stack containing the card.
cardIdstringYesID of the card to update. Get from list_cards.
fieldsobjectYesFields to update. All sub-fields are optional — only supplied ones change.
fields.headingstring—Main heading text.
fields.subheadingstring—Subheading text.
fields.descriptionstring—Body description text.
fields.buttonTextstring—CTA button label.
fields.buttonUrlstring—CTA button URL. Must start with https:// or http://.
fields.badgestring | null—Badge label text, or null to remove.
fields.ratingnumber | null—Star rating (e.g. 5.0), or null to remove.
fields.coverColorstring—Background color hex for the card cover.
fields.kindstring—Changes the template lens. Valid kinds: basic, about, link, portfolio, service, book-me, testimonial, contact, email, embed-booking, buy.
fields.forceHorizontalFitboolean—true = show the whole landscape photo (fit) instead of crop-to-fill.
fields.hiddenboolean—true to hide the card from public view without deleting it.
ifUpdatedAtstring—Optional optimistic-concurrency guard: the outline updatedAt you last read (from get_profile or a previous write's response). If the outline changed since, the call fails with CONFLICT and nothing is written.

Response

FieldTypeWhat it means
outlineIdstringResolved outline ID.
stackIdstringThe stack the card belongs to.
cardIdstringThe card that was updated.
updatedobjectThe full card state after the update — all fields, including those you didn't change.

Example

Request

json
{ "stackId": "stack_abc", "cardId": "card_xyz789", "fields": { "heading": "Brand Photography", "subheading": "Half-day & full-day packages", "description": "In-studio or on-location brand photography for founders and creative teams. Natural light preferred.", "buttonText": "Book a call", "buttonUrl": "https://cal.com/alexrivera" } }

Response

json
{ "outlineId": "42", "stackId": "stack_abc", "cardId": "card_xyz789", "updated": { "id": "card_xyz789", "kind": "service", "heading": "Brand Photography", "subheading": "Half-day & full-day packages", "description": "In-studio or on-location brand photography for founders and creative teams. Natural light preferred.", "buttonText": "Book a call", "buttonUrl": "https://cal.com/alexrivera" } }

When to use

After add_card creates an empty card, use update_card to fill in the content. Also use to refine existing content based on creator feedback or analytics data.


Gotchas

Watch out

  • Only supplied fields change — you cannot accidentally wipe a field by omitting it.
  • buttonUrl must start with https:// or http:// — bare domains like cal.com/xyz will fail validation.
  • Use hidden:true to temporarily pull a card from the public profile without losing content.
  • Get the cardId and stackId from list_cards first.