> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tied.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update a portal

> Updates the portal. Every field is optional, and `portal` itself may be omitted entirely when you are only attaching a logo with `blob_id`.

**Archiving is done here**, by sending `archived: true` — it is what takes a portal off the public Help Center without deleting it.

`custom_domain` is accepted by the parameter filter but not applied — the assignment is commented out in the controller, so a custom domain cannot currently be changed through the API after the portal is created.



## OpenAPI

````yaml /api-reference/openapi.json patch /api/v1/accounts/{account_id}/portals/{id}
openapi: 3.0.4
info:
  title: Tied API
  description: >-
    The Tied REST API. Three families of endpoint, each with its own credential:
    **Application** for everything inside an account, **Platform** for
    provisioning accounts and users, and **Client** for acting as a contact from
    your own surface.
  version: 1.1.0
  termsOfService: https://tied.com/legal
  contact:
    email: hello@tied.com
  license:
    name: MIT License
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://app.tied.com
    description: Tied cloud
security: []
tags:
  - name: Account AgentBots
    description: Account-specific Agent Bots
  - name: Agents
    description: Agent management APIs
  - name: Canned Responses
    description: Pre-defined responses for common queries
  - name: Contacts
    description: Contact management APIs
  - name: Contact Labels
    description: Manage contact labels
  - name: Conversation Assignments
    description: Manage conversation assignments
  - name: Conversation Labels
    description: Manage conversation labels
  - name: Conversations
    description: Conversation management APIs
  - name: Custom Attributes
    description: Custom fields for contacts and conversations
  - name: Custom Filters
    description: Saved filters for conversations
  - name: Inboxes
    description: Communication channels setup
  - name: Integrations
    description: Third-party integrations
  - name: Messages
    description: Message management APIs
  - name: Profile
    description: User profile APIs
  - name: Reports
    description: Analytics and reporting APIs
  - name: Teams
    description: Team management APIs
  - name: Webhooks
    description: Event notification webhooks
  - name: Automation Rule
    description: Workflow automation rules
  - name: Help Center
    description: Knowledge base management
  - name: Contacts API
    description: Public contact APIs
  - name: Conversations API
    description: Public conversation APIs
  - name: Messages API
    description: Public message APIs
  - name: CSAT Survey Page
    description: Customer satisfaction survey
  - name: Account
    description: >-
      The authenticated user's own account — read and update account settings.
      Distinct from the Platform family's **Accounts**, which provisions
      accounts across an installation.
  - name: Audit Logs
    description: Read the account's audit trail
  - name: Inbox API
    description: Public inbox lookup by channel identifier
  - name: Labels
    description: >-
      Create and manage the account's labels. Applying one to a conversation or
      contact is a separate endpoint under those resources.
  - name: Macros
    description: >-
      Saved multi-step actions an agent — or an integration — can run against
      one or more conversations.
  - name: Campaigns
    description: Ongoing website campaigns and one-off SMS and WhatsApp sends.
  - name: Contact Notes
    description: Internal notes on a contact. Never visible to the contact.
  - name: Help Center Categories
    description: Categories group a portal's articles, one tree per allowed locale.
  - name: Help Center Articles
    description: The articles a portal publishes, and their draft and archived states.
  - name: Summary Reports
    description: Per-agent, per-team, per-inbox and per-label totals for a period, as JSON.
  - name: Live Reports
    description: Right-now queue counts. No date range — these describe the present.
  - name: CSAT
    description: >-
      The satisfaction ratings contacts have submitted, and the metrics computed
      from them.
  - name: Notifications
    description: >-
      The per-user notification feed, its read and snooze state, and the
      settings that decide what lands in it.
  - name: Conversation Participants
    description: >-
      The agents watching a conversation. Participants get notified about it
      without being assigned to it.
  - name: Draft Messages
    description: >-
      The unsent reply held for a conversation. Stored in Redis, one per
      conversation.
  - name: Search
    description: >-
      One search service across conversations, contacts, messages and Help
      Center articles.
  - name: Dashboard Apps
    description: Embedded pages that appear as a tab beside a conversation.
  - name: Assignment Policies
    description: How conversations are handed out, and which inbox uses which policy.
  - name: Files
    description: Storing a file so another endpoint can attach it.
  - name: Bot Flows
    description: >-
      Scripted conversation flows, their versions, and the publish and rollback
      that move between them.
  - name: Billing
    description: >-
      Credit balance, usage, invoices, spend controls and the provider-hosted
      payment flows.
  - name: AMB Templates
    description: >-
      Saved Apple Messages primitive payloads an agent can reuse from the
      composer.
  - name: AMB Onboarding
    description: The in-flight Apple Messages for Business registration for an account.
  - name: Widget Session
    description: Starting a widget session and reading the visitor it belongs to.
  - name: Widget Conversation
    description: The visitor's conversation and its messages.
  - name: Widget Context
    description: Campaigns, agents, labels, events and uploads for a widget session.
  - name: CSAT Survey
    description: The public, unauthenticated survey a contact answers from a link.
  - name: Workspace
    description: Scheduling and cancelling deletion of the whole workspace.
paths:
  /api/v1/accounts/{account_id}/portals/{id}:
    parameters:
      - $ref: '#/components/parameters/account_id'
      - $ref: '#/components/parameters/portal_id'
    patch:
      tags:
        - Help Center
      summary: Update a portal
      description: >-
        Updates the portal. Every field is optional, and `portal` itself may be
        omitted entirely when you are only attaching a logo with `blob_id`.


        **Archiving is done here**, by sending `archived: true` — it is what
        takes a portal off the public Help Center without deleting it.


        `custom_domain` is accepted by the parameter filter but not applied —
        the assignment is commented out in the controller, so a custom domain
        cannot currently be changed through the API after the portal is created.
      operationId: update-portal-to-account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/portal_create_update_payload'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/portal_item'
              example:
                id: 1
                color: null
                custom_domain: null
                header_text: Answers, guides and troubleshooting for the Tied platform.
                homepage_link: null
                name: Tied Help Center
                page_title: Tied Help Center
                slug: tied-help
                archived: false
                account_id: 1
                config:
                  allowed_locales:
                    - code: en
                      articles_count: 7
                      categories_count: 3
                meta:
                  all_articles_count: 0
                  archived_articles_count: null
                  published_count: null
                  draft_articles_count: null
                  categories_count: 3
                  default_locale: en
        '403':
          description: Access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error_message'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error_message'
        '422':
          description: Validation failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/error_validation'
      security:
        - userApiKey: []
components:
  parameters:
    account_id:
      in: path
      name: id
      schema:
        type: integer
      required: true
      description: The numeric ID of the account
    portal_id:
      in: path
      name: id
      schema:
        type: string
      required: true
      description: The slug identifier of the portal
  schemas:
    portal_create_update_payload:
      type: object
      properties:
        color:
          type: string
          description: Header color for help-center in hex format
          example: '#FFFFFF'
        custom_domain:
          type: string
          description: Custom domain to display help center.
          example: tied.help
        header_text:
          type: string
          description: Help center header
          example: Handbook
        homepage_link:
          type: string
          description: link to main dashboard
          example: https://tied.com/
        name:
          type: string
          description: Name for the portal
          example: Handbook
        page_title:
          type: string
          description: Page title for the portal
          example: Handbook
        slug:
          type: string
          description: Slug for the portal to display in link
          example: handbook
        archived:
          type: boolean
          description: Status to check if portal is live
          example: false
        config:
          type: object
          description: Configuration about supporting locales
          example:
            allowed_locales:
              - en
              - es
            default_locale: en
    portal_item:
      type: object
      properties:
        id:
          type: integer
          description: The ID of the portal
        archived:
          type: boolean
          description: Whether the portal is archived
        color:
          type: string
          description: The color code for the portal
          nullable: true
        config:
          $ref: '#/components/schemas/portal_config'
        custom_domain:
          type: string
          description: Custom domain for the portal
          nullable: true
        header_text:
          type: string
          description: The header text for the portal
          nullable: true
        homepage_link:
          type: string
          description: Homepage link for the portal
          nullable: true
        name:
          type: string
          description: Name of the portal
        slug:
          type: string
          description: URL slug for the portal
        page_title:
          type: string
          description: Page title for the portal
          nullable: true
        account_id:
          type: integer
          description: ID of the account the portal belongs to
        inbox:
          $ref: '#/components/schemas/inbox'
        logo:
          $ref: '#/components/schemas/portal_logo'
        meta:
          $ref: '#/components/schemas/portal_meta'
    error_message:
      type: object
      description: >-
        The shape returned by `render_unauthorized`, `render_not_found_error`
        and `render_could_not_create_error`.
      properties:
        error:
          type: string
          description: A single human-readable message.
          example: Resource could not be found
      required:
        - error
    error_validation:
      type: object
      description: >-
        The shape returned by `render_record_invalid` when a model validation
        fails.
      properties:
        message:
          type: string
          description: The record's full error messages, comma-joined.
          example: Url has already been taken
        attributes:
          type: array
          description: The attributes that failed validation.
          items:
            type: string
          example:
            - url
      required:
        - message
    portal_config:
      type: object
      description: Configuration settings for the portal
      properties:
        allowed_locales:
          type: array
          description: List of allowed locales for the portal
          items:
            type: object
            properties:
              code:
                type: string
                description: The language code
              articles_count:
                type: integer
                description: Number of articles in this locale
              categories_count:
                type: integer
                description: Number of categories in this locale
    inbox:
      type: object
      properties:
        id:
          type: number
          description: ID of the inbox
        name:
          type: string
          description: The name of the inbox
        website_url:
          type: string
          description: Website URL
          nullable: true
        channel_type:
          type: string
          description: The type of the inbox
        avatar_url:
          type: string
          description: The avatar image of the inbox
        widget_color:
          type: string
          description: Widget Color used for customization of the widget
          nullable: true
        website_token:
          type: string
          description: Website Token
          nullable: true
        enable_auto_assignment:
          type: boolean
          description: The flag which shows whether Auto Assignment is enabled or not
        web_widget_script:
          type: string
          description: Script used to load the website widget
          nullable: true
        welcome_title:
          type: string
          description: Welcome title to be displayed on the widget
          nullable: true
        welcome_tagline:
          type: string
          description: Welcome tagline to be displayed on the widget
          nullable: true
        greeting_enabled:
          type: boolean
          description: The flag which shows whether greeting is enabled
        greeting_message:
          type: string
          description: A greeting message when the user starts the conversation
          nullable: true
        channel_id:
          type: number
          description: ID of the channel this inbox belongs to
        working_hours_enabled:
          type: boolean
          description: The flag which shows whether working hours feature is enabled
        enable_email_collect:
          type: boolean
          description: The flag to enable collecting email from contacts
        csat_survey_enabled:
          type: boolean
          description: The flag to enable CSAT survey
        auto_assignment_config:
          type: object
          description: >-
            Auto-assignment configuration, including the per-agent conversation
            limit.
        out_of_office_message:
          type: string
          description: Message to show when agents are out of office
          nullable: true
        working_hours:
          type: array
          description: Configuration for working hours of the inbox
          items:
            type: object
            properties:
              day_of_week:
                type: number
                description: Day of the week (0-6, where 0 is Sunday)
              closed_all_day:
                type: boolean
                description: Whether the inbox is closed for the entire day
              open_hour:
                type: number
                description: Hour when inbox opens (0-23)
                nullable: true
              open_minutes:
                type: number
                description: Minutes of the hour when inbox opens (0-59)
                nullable: true
              close_hour:
                type: number
                description: Hour when inbox closes (0-23)
                nullable: true
              close_minutes:
                type: number
                description: Minutes of the hour when inbox closes (0-59)
                nullable: true
              open_all_day:
                type: boolean
                description: Whether the inbox is open for the entire day
        timezone:
          type: string
          description: Timezone configuration for the inbox
        callback_webhook_url:
          type: string
          description: Webhook URL for callbacks
          nullable: true
        allow_messages_after_resolved:
          type: boolean
          description: Whether to allow messages after a conversation is resolved
        lock_to_single_conversation:
          type: boolean
          description: Whether to lock a contact to a single conversation
        sender_name_type:
          type: string
          description: Type of sender name to display (e.g., friendly)
        business_name:
          type: string
          description: Business name associated with the inbox
          nullable: true
        hmac_mandatory:
          type: boolean
          description: Whether HMAC verification is mandatory
          nullable: true
        selected_feature_flags:
          type: object
          description: Selected feature flags for the inbox
          nullable: true
        reply_time:
          type: string
          description: Expected reply time
          nullable: true
        messaging_service_sid:
          type: string
          description: Messaging service SID for SMS providers
          nullable: true
        phone_number:
          type: string
          description: Phone number associated with the inbox
          nullable: true
        medium:
          type: string
          description: Medium of communication (e.g., sms, email)
        provider:
          type: string
          description: Provider of the channel
          nullable: true
        csat_config:
          type: object
          description: >-
            CSAT survey configuration for the inbox. Empty when the survey is
            off.
        allowed_domains:
          type: string
          description: >-
            Comma-separated domains the web widget may be embedded on. Empty
            means no restriction.
        hmac_token:
          type: string
          description: >-
            Secret used to compute the contact `identifier_hash` for identity
            verification. Treat it as a credential.
        pre_chat_form_enabled:
          type: boolean
          description: Whether the widget asks for details before starting a conversation.
        pre_chat_form_options:
          type: object
          description: The fields and message shown on the pre-chat form.
        continuity_via_email:
          type: boolean
          description: Whether replies continue by email once the visitor leaves the site.
    portal_logo:
      type: object
      properties:
        id:
          type: integer
          description: ID of the logo file
        portal_id:
          type: integer
          description: ID of the portal this logo belongs to
        file_type:
          type: string
          description: MIME type of the file
        account_id:
          type: integer
          description: ID of the account
        file_url:
          type: string
          description: URL to access the logo file
        blob_id:
          type: integer
          description: ID of the blob
        filename:
          type: string
          description: Name of the file
    portal_meta:
      type: object
      properties:
        all_articles_count:
          type: integer
          description: Total number of articles
        archived_articles_count:
          type: integer
          nullable: true
          description: Number of archived articles
        published_count:
          type: integer
          nullable: true
          description: Number of published articles
        draft_articles_count:
          type: integer
          nullable: true
          description: Number of draft articles
        categories_count:
          type: integer
          description: Number of categories
        default_locale:
          type: string
          description: Default locale for the portal
  securitySchemes:
    userApiKey:
      type: apiKey
      in: header
      name: api_access_token
      description: >-
        This token can be obtained by visiting the profile page or via rails
        console. Provides access to  endpoints based on the user permissions
        levels. This token can be saved by an external system when user is
        created via API, to perform activities on behalf of the user.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.