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

# Update tenant settings

> Update support contact details, business hours, website, portal name, client/staff AI configuration, company visibility defaults and custom-domain sign-in methods. Nested customizations replace the stored value, so read GET /tenant first. Requires `tenant.write` and write_settings_tenant or manage_settings_tenant. MSP staff only.



## OpenAPI

````yaml /openapi.json patch /api/public/v1/tenant/settings
openapi: 3.0.3
info:
  title: MSPortal Public API
  version: 1.0.0
  description: >-
    Public API for MSPortal - provides programmatic access to tenant data.


    ## Authentication


    All endpoints require authentication via API key passed as a Bearer token:


    ```

    Authorization: Bearer <your-api-key>

    ```


    API keys can be created in the MSPortal dashboard under Settings →
    Integrations → API Access.


    **Important:** Do not include cookies in API requests. The public API uses
    stateless authentication only.


    ## Scopes


    API keys are granted specific scopes that determine what operations they can
    perform. Each endpoint documents its required scope(s).


    ## Rate Limiting


    API calls are rate limited per API key. Rate limit information is returned
    in response headers:


    - `X-RateLimit-Limit`: Maximum requests per minute

    - `X-RateLimit-Remaining`: Remaining requests in current window

    - `X-RateLimit-Reset`: When the rate limit resets (ISO 8601)


    ## Request ID


    All responses include an `X-Request-Id` header for debugging and support.
    You can also pass your own `X-Request-Id` header to correlate requests.
  contact:
    name: MSPortal Support
    email: support@msportal.ai
  license:
    name: Proprietary
servers:
  - url: https://app.msportal.ai
    description: Production (US)
  - url: https://eu.msportal.ai
    description: Production (EU)
security:
  - BearerAuth: []
tags:
  - name: Budgets
    description: >-
      Budget management - create, track, and forecast budgets with line items,
      categories, and products
  - name: Calendar
    description: Calendar and meeting management - events, participants, and meeting types
  - name: Companies
    description: Company management endpoints
  - name: Company Users
    description: Company user management - client portal contacts (read-only, paginated)
  - name: Compliance
    description: Compliance check management - runs, assigned checks, and status updates
  - name: Dashboards
    description: Dashboard management - external iframe resources and internal dashboards
  - name: Devices
    description: Device management - inventory, types, and locations
  - name: Goals
    description: Goal management - create, track, and manage goals with tasks and updates
  - name: NPS Surveys
    description: >-
      NPS survey management - Net Promoter Score surveys, responses, and
      analytics
  - name: Reports
    description: >-
      Report management - create, manage, and schedule reports with templates
      and types
  - name: Planner
    description: >-
      Planner item management - tasks, roadmap items, and project planning with
      linked goals, compliance, and projects
  - name: Surveys
    description: >-
      General survey management - multi-question surveys, responses, and
      statistics
  - name: Tickets
    description: Ticket management - view and filter tickets from PSA integrations
  - name: Training
    description: >-
      Training management - courses, enrollments, certificates, and progress
      tracking
  - name: Users
    description: Tenant user management - internal staff and team members (read-only)
  - name: Automation Rules
    description: >-
      Automation rule management - create, configure, and monitor automation
      rules with triggers, conditions, and actions
  - name: Analytics
    description: >-
      Analytics and reporting - company audit data, training analytics, user
      activity, and portfolio metrics
  - name: Client Onboarding
    description: >-
      Client onboarding - portals (phases, tasks, contacts, activation),
      templates, checklist templates, forms and documentation pages
  - name: Backup
    description: >-
      Backup - summaries, protected devices, alerts and SaaS protection (Datto,
      Axcient, Slide, Kaseya)
  - name: Microsoft 365
    description: Microsoft 365 - licenses, users, domains and Secure Score
  - name: Security
    description: >-
      Security - posture summary, EDR incidents, vulnerabilities, email threats,
      firewalls, DNS filtering and security awareness
  - name: Financial
    description: Financial - quotes, invoices and revenue summaries
  - name: Integrations
    description: Integrations - status, sync health, pause and resume (never credentials)
  - name: Documentation
    description: >-
      Documentation - pages, folders and articles synced from Hudu or IT Glue,
      plus built-in pages
  - name: Broadcasts
    description: Broadcasts - emergency broadcasts, recipients and groups
  - name: Notifications
    description: Notifications - the linked user's in-app notifications
  - name: Standards
    description: >-
      Standards - technology standards catalog, service plans, applicability,
      deployment statuses, compliance rollups, white space and costs
  - name: Customer Success
    description: >-
      Customer success - client health scores, trends, benchmarks and Traffic
      Light Reviews
  - name: Tasks
    description: Tasks - the linked user's personal task list
  - name: Tenant Setup
    description: Tenant setup - profile, branding and portal settings (never secrets)
  - name: Roles
    description: Roles - staff and client roles and their permission grants
  - name: Ticket Templates
    description: Ticket templates - reusable ticket definitions
  - name: Readiness
    description: Client readiness - account readiness assessments
  - name: Projects
    description: >-
      Projects - PSA projects with health overlays (deliverables, milestones,
      client actions, weekly updates), phases, tickets, time entries, PSA
      status/owner/priority write-through, ticket notes, task controls, display
      settings and the document library
paths:
  /api/public/v1/tenant/settings:
    patch:
      tags:
        - Tenant Setup
      summary: Update tenant settings
      description: >-
        Update support contact details, business hours, website, portal name,
        client/staff AI configuration, company visibility defaults and
        custom-domain sign-in methods. Nested customizations replace the stored
        value, so read GET /tenant first. Requires `tenant.write` and
        write_settings_tenant or manage_settings_tenant. MSP staff only.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateTenantSettingsRequest'
      responses:
        '200':
          description: Tenant setup after the update
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/TenantSetup'
                required:
                  - data
        '400':
          description: Validation error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            Forbidden - missing scope (tenant.write) or the linked user lacks
            the tenant settings permission (MSP staff only)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: >-
            expectedUpdatedAt does not match the tenant's updated_at; read GET
            /tenant again
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - BearerAuth: []
components:
  schemas:
    UpdateTenantSettingsRequest:
      type: object
      properties:
        values:
          type: object
          properties:
            values:
              type: object
              properties:
                restrictToAssignedCompanies:
                  type: boolean
                complianceCompanyFilterAssignedOnly:
                  type: boolean
                customDomainLoginMethods:
                  type: array
                  items:
                    type: string
                    enum:
                      - microsoft
                      - google
                      - magic_link
                  minItems: 1
                  maxItems: 3
                aiEnabled:
                  type: boolean
                clientAiEnabled:
                  type: boolean
                aiHomeEnabled:
                  type: boolean
                aiHomeCustomization:
                  type: object
                  properties:
                    backgroundImagePath:
                      type: string
                      maxLength: 500
                    greetingLabel:
                      type: string
                      maxLength: 80
                    headline:
                      type: string
                      maxLength: 120
                    subheadline:
                      type: string
                      maxLength: 160
                    placeholder:
                      type: string
                      maxLength: 160
                    blocks:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: string
                            minLength: 1
                            maxLength: 80
                          label:
                            type: string
                            minLength: 1
                            maxLength: 60
                          description:
                            anyOf:
                              - type: string
                                maxLength: 120
                              - type: string
                                enum:
                                  - ''
                          prompt:
                            type: string
                            minLength: 1
                            maxLength: 280
                          icon:
                            type: string
                            enum:
                              - users
                              - ticket
                              - graduation
                              - file
                              - shield
                              - calendar
                              - book
                              - message
                        required:
                          - id
                          - label
                          - prompt
                          - icon
                      maxItems: 4
                  required:
                    - backgroundImagePath
                    - greetingLabel
                    - headline
                    - subheadline
                    - placeholder
                    - blocks
                aiAssistantCustomization:
                  type: object
                  properties:
                    starters:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: string
                            minLength: 1
                            maxLength: 80
                          label:
                            type: string
                            minLength: 1
                            maxLength: 80
                          prompt:
                            type: string
                            minLength: 1
                            maxLength: 280
                          icon:
                            type: string
                            enum:
                              - users
                              - ticket
                              - graduation
                              - file
                              - shield
                              - calendar
                              - book
                              - message
                        required:
                          - id
                          - label
                          - prompt
                          - icon
                      maxItems: 6
                  required:
                    - starters
                aiVoice:
                  type: string
                  enum:
                    - marin
                    - cedar
                    - alloy
                    - ash
                    - ballad
                    - coral
                    - echo
                    - sage
                    - shimmer
                    - verse
                supportEmail:
                  type: string
                  format: email
                supportPhone:
                  type: string
                  maxLength: 100
                salesPhone:
                  type: string
                  maxLength: 100
                businessHours:
                  type: string
                  maxLength: 500
                websiteUrl:
                  type: string
                  format: uri
                emergencyPhone:
                  type: string
                  maxLength: 100
                aiContextNotes:
                  type: string
                  maxLength: 3500
                portalName:
                  type: string
                  maxLength: 100
                aiAdvisorName:
                  type: string
                  maxLength: 50
              default: {}
              additionalProperties: false
            removeKeys:
              type: array
              items:
                type: string
                enum:
                  - restrictToAssignedCompanies
                  - complianceCompanyFilterAssignedOnly
                  - customDomainLoginMethods
                  - aiEnabled
                  - clientAiEnabled
                  - aiHomeEnabled
                  - aiHomeCustomization
                  - aiAssistantCustomization
                  - aiVoice
                  - supportEmail
                  - supportPhone
                  - salesPhone
                  - businessHours
                  - websiteUrl
                  - emergencyPhone
                  - aiContextNotes
                  - portalName
                  - aiAdvisorName
              maxItems: 30
              default: []
          additionalProperties: false
        expectedUpdatedAt:
          type: string
          nullable: true
          format: date-time
          description: >-
            updated_at from GET /tenant. A value that no longer matches is
            rejected with 409; null only matches a tenant that was never
            updated.
      required:
        - values
        - expectedUpdatedAt
      additionalProperties: false
      description: >-
        values.values is the settings patch (allowlisted keys);
        values.removeKeys resets named settings. Provide at least one of them.
    TenantSetup:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        billing_email:
          type: string
          nullable: true
        address_id:
          type: string
          nullable: true
          format: uuid
        address_line1:
          type: string
          nullable: true
        address_line2:
          type: string
          nullable: true
        city:
          type: string
          nullable: true
        province_state:
          type: string
          nullable: true
        postal_code:
          type: string
          nullable: true
        country:
          type: string
          nullable: true
        country_code:
          type: string
          nullable: true
        timezone:
          type: string
          nullable: true
        locale:
          type: string
          nullable: true
        currency:
          type: string
          nullable: true
        custom_domain:
          type: string
          nullable: true
        owner_user_id:
          type: string
          nullable: true
          format: uuid
          description: Primary admin's auth user id
        logo_url:
          type: string
          nullable: true
        logo_small_url:
          type: string
          nullable: true
        logo_light_url:
          type: string
          nullable: true
        logo_dark_url:
          type: string
          nullable: true
        logo_small_light_url:
          type: string
          nullable: true
        logo_small_dark_url:
          type: string
          nullable: true
        favicon_url:
          type: string
          nullable: true
        reporting_logo_url:
          type: string
          nullable: true
        updated_at:
          type: string
          nullable: true
          description: Pass as expectedUpdatedAt to the PATCH endpoints
        addressData:
          $ref: '#/components/schemas/TenantAddress'
        primaryColor:
          type: string
          nullable: true
          description: Primary brand color (hex)
        signinBranding:
          type: object
          properties:
            logoHeight:
              type: integer
              minimum: 24
              maximum: 120
            backgroundType:
              type: string
              enum:
                - default
                - color
                - gradient
                - image
            backgroundColor:
              type: string
            gradientFrom:
              type: string
            gradientTo:
              type: string
            backgroundImagePath:
              type: string
              maxLength: 500
            overlayOpacity:
              type: integer
              minimum: 0
              maximum: 80
            cardStyle:
              type: string
              enum:
                - solid
                - glass
            welcomeTitle:
              type: string
              maxLength: 80
            welcomeSubtitle:
              type: string
              maxLength: 160
            helpInstructions:
              type: string
              maxLength: 500
          required:
            - logoHeight
            - backgroundType
            - backgroundColor
            - gradientFrom
            - gradientTo
            - backgroundImagePath
            - overlayOpacity
            - cardStyle
            - welcomeTitle
            - welcomeSubtitle
            - helpInstructions
        settings:
          type: object
          additionalProperties:
            nullable: true
          description: >-
            Supported portal, support and AI settings (the PATCH
            /tenant/settings allowlist). API credentials and subscription
            entitlements are never included.
      required:
        - id
        - name
        - billing_email
        - address_id
        - address_line1
        - address_line2
        - city
        - province_state
        - postal_code
        - country
        - country_code
        - timezone
        - locale
        - currency
        - custom_domain
        - owner_user_id
        - logo_url
        - logo_small_url
        - logo_light_url
        - logo_dark_url
        - logo_small_light_url
        - logo_small_dark_url
        - favicon_url
        - reporting_logo_url
        - updated_at
        - addressData
        - primaryColor
        - signinBranding
        - settings
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
          description: Error message
        requestId:
          type: string
          description: Request correlation ID
        details:
          nullable: true
          description: Additional error details
        code:
          type: string
          description: Error code
      required:
        - error
    TenantAddress:
      type: object
      nullable: true
      properties:
        street_address:
          type: string
          nullable: true
        street_address_2:
          type: string
          nullable: true
        city:
          type: string
          nullable: true
        state_province:
          type: string
          nullable: true
        postal_code:
          type: string
          nullable: true
        country:
          type: string
          nullable: true
        country_code:
          type: string
          nullable: true
        formatted_address:
          type: string
          nullable: true
        latitude:
          type: number
          nullable: true
        longitude:
          type: number
          nullable: true
        google_place_id:
          type: string
          nullable: true
        osm_place_id:
          type: string
          nullable: true
      required:
        - street_address
        - street_address_2
        - city
        - state_province
        - postal_code
        - country
        - country_code
        - formatted_address
        - latitude
        - longitude
        - google_place_id
        - osm_place_id
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Use your API key as a Bearer token. API keys can be generated in
        Settings → Integrations → API Access.

````

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