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

# Update platform settings

> Update the settings of your white label platform

This endpoint changes the settings of your white label platform. Send only the sections, and the keys inside them, that you want to change: everything you leave out stays as it is. The response returns all your settings after the change, in the same format as [Get platform settings](/api-reference/white-label/get-settings).

<Note>
  This endpoint is available to the **account owner** (with an active plan) and to team members with **Settings Access**. Changing the `checkout` section also requires **Billing Access**, which the owner always has. Without the required access the request returns a 403 Forbidden error and nothing is saved.
</Note>

### Request Body

<ParamField body="welcome_email" type="object">
  The welcome email sent to new users. Every key takes a string, or `null` to use the default text. You can use these placeholders in every key except `contact_email`: `{user_name}` (the new user's name), `{tenant_name}` (your platform name) and `{tenant_domain}` (your platform domain).

  <Expandable title="welcome_email properties">
    <ParamField body="subject" type="string">
      Email subject, up to 255 characters
    </ParamField>

    <ParamField body="preheader" type="string">
      Preview text shown in the inbox before the email is opened, up to 255 characters
    </ParamField>

    <ParamField body="greeting_text" type="string">
      Heading at the top of the email, for example `Welcome {user_name}!`. Up to 255 characters
    </ParamField>

    <ParamField body="content" type="string">
      Main body of the email, in HTML, up to 65,535 characters. A value that is valid JSON, such as an editor document or a plain number, returns 422. The HTML is normalised when it is saved: plain text is wrapped in a paragraph and markup the email editor does not support, such as `<script>`, is removed. The value you read back can therefore differ slightly from the value you sent.
    </ParamField>

    <ParamField body="journey_text" type="string">
      Message shown after the main content, before the contact details. Up to 255 characters
    </ParamField>

    <ParamField body="questions_text" type="string">
      Text shown before the contact email, up to 255 characters
    </ParamField>

    <ParamField body="contact_email" type="string">
      Support email address shown in the email. Must be a valid email address
    </ParamField>

    <ParamField body="signature_text" type="string">
      Signature at the end of the email, up to 255 characters. Use `<br>` for a line break
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="email_notifications" type="object">
  Which emails your users receive. Each email takes `true` (sent) or `false` (not sent). Password reset emails are always sent.

  <Expandable title="email_notifications properties">
    <ParamField body="welcome_email" type="boolean">
      Sent to new users after they sign up
    </ParamField>

    <ParamField body="low_balance_alert" type="boolean">
      Sent when a user's balance drops below the alert threshold
    </ParamField>

    <ParamField body="auto_topup_notification" type="boolean">
      Sent after each automatic top-up
    </ParamField>

    <ParamField body="low_chat_credits_alert" type="boolean">
      Sent when a user's chat credits drop below the alert threshold
    </ParamField>

    <ParamField body="chat_credits_auto_topup_notification" type="boolean">
      Sent after each automatic chat credits top-up
    </ParamField>

    <ParamField body="trial_ending_reminder" type="boolean">
      Sent before a user's free trial ends. Only available when free trials are enabled for your platform; otherwise sending this key returns a 422 error
    </ParamField>

    <ParamField body="voice_cloning_completed" type="boolean">
      Sent when voice cloning finishes
    </ParamField>

    <ParamField body="phone_number_deleted" type="boolean">
      Sent when a phone number is removed
    </ParamField>

    <ParamField body="import_completed" type="boolean">
      Sent when a lead import finishes
    </ParamField>

    <ParamField body="export_completed" type="boolean">
      Sent when a data export finishes
    </ParamField>

    <ParamField body="automation_usage_alert" type="boolean">
      Sent when a user reaches 90% and 100% of their monthly automation usage
    </ParamField>

    <ParamField body="automation_usage_alert_email" type="string">
      Where automation usage alerts go. `null` sends each alert to the user it concerns. An email address, for example your support inbox, receives the alerts instead of your users, and each alert names the user
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="scripts" type="object">
  Code added to your platform's pages, for example a live chat or analytics snippet. Each key takes a string of up to 65,535 characters, or `null` to remove the script.

  <Expandable title="scripts properties">
    <ParamField body="scripts" type="string">
      Added to every page your users see once logged in
    </ParamField>

    <ParamField body="scripts_auth" type="string">
      Added to the login and sign-up pages
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="appearance" type="object">
  What your users see on your platform. A list you send replaces the current list; send `[]` to clear it. A value sent twice is saved once, and a list cannot have more items than it has possible values.

  <Expandable title="appearance properties">
    <ParamField body="hide_pages" type="string[]">
      Pages to hide from your users' navigation. Values from [Pages you can hide](#pages-you-can-hide)
    </ParamField>

    <ParamField body="hide_features" type="string[]">
      Features and buttons to hide from your users. Values from [Features you can hide](#features-you-can-hide)
    </ParamField>

    <ParamField body="hide_countries" type="string[]">
      Countries to hide when your users buy a phone number. Values from [Countries you can hide](#countries-you-can-hide)
    </ParamField>

    <ParamField body="plan_billing_display" type="string">
      Billing cycles shown on the plans page: `both` (monthly and yearly), `monthly` (monthly only) or `yearly` (yearly only)
    </ParamField>

    <ParamField body="relabel_minutes_as_credits" type="boolean">
      When `true`, "Minutes" is shown as "Calling credits" in the sidebar balance, the plans page and the credits page. Only the labels change, not billing
    </ParamField>

    <ParamField body="allow_sign_ups" type="boolean">
      Whether visitors can create an account on your platform. `true` by default. When `false`, the register page redirects to the login page, the sign-up link is hidden, and new accounts cannot be created with Google or LinkedIn or through the registration API. Users you create yourself, in the administration panel or with [Register user](/api-reference/white-label/register), are not affected
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="webhooks" type="object">
  Your webhooks

  <Expandable title="webhooks properties">
    <ParamField body="user_signup_webhook_url" type="string">
      An `http` or `https` URL, up to 255 characters, that receives a POST request each time a new user signs up on your platform. `null` turns the webhook off. See [Signup webhook](#signup-webhook) for the payload
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="checkout" type="object">
  Your checkout settings. Changing them requires **Billing Access**.

  <Expandable title="checkout properties">
    <ParamField body="require_tax_id" type="boolean">
      When `true`, customers from supported countries must enter their VAT or tax ID at checkout
    </ParamField>
  </Expandable>
</ParamField>

### Response

<ResponseField name="message" type="string">
  Success message
</ResponseField>

<ResponseField name="data" type="object">
  All your settings after the change, in the same format as [Get platform settings](/api-reference/white-label/get-settings). The `checkout` section is only included if you have **Billing Access**.
</ResponseField>

<ResponseExample>
  ```json 200 Settings Updated theme={null}
  {
    "message": "Settings updated.",
    "data": {
      "welcome_email": {
        "subject": "Welcome to {tenant_name}, {user_name}!",
        "preheader": null,
        "greeting_text": "Welcome {user_name}!",
        "content": "<p>Thanks for joining {tenant_name}. Your account is ready.</p>",
        "journey_text": null,
        "questions_text": "If you have any questions, reach out to:",
        "contact_email": "support@example.com",
        "signature_text": "Best,<br>{tenant_name} team"
      },
      "email_notifications": {
        "welcome_email": true,
        "low_balance_alert": true,
        "auto_topup_notification": true,
        "low_chat_credits_alert": true,
        "chat_credits_auto_topup_notification": true,
        "trial_ending_reminder": true,
        "voice_cloning_completed": true,
        "phone_number_deleted": true,
        "import_completed": true,
        "export_completed": false,
        "automation_usage_alert": true,
        "automation_usage_alert_email": null
      },
      "scripts": {
        "scripts": "<script src=\"https://chat.example.com/widget.js\" async></script>",
        "scripts_auth": null
      },
      "appearance": {
        "hide_pages": ["hide_api_page", "hide_blacklist_page"],
        "hide_features": ["hide_carrier_costs", "hide_platform_tour"],
        "hide_countries": [],
        "plan_billing_display": "both",
        "relabel_minutes_as_credits": false,
        "allow_sign_ups": true
      },
      "webhooks": {
        "user_signup_webhook_url": "https://example.com/hooks/signup"
      },
      "checkout": {
        "require_tax_id": false
      }
    }
  }
  ```

  ```json 401 Unauthenticated theme={null}
  {
    "message": "Unauthenticated."
  }
  ```

  ```json 403 Not Administrator theme={null}
  {
    "message": "You are not an administrator."
  }
  ```

  ```json 403 Missing Access theme={null}
  {
    "message": "You do not have access to these settings."
  }
  ```

  ```json 422 Unsupported Field theme={null}
  {
    "message": "The domain field is not supported.",
    "errors": {
      "domain": ["The domain field is not supported."]
    }
  }
  ```

  ```json 422 Unsupported Key In Section theme={null}
  {
    "message": "The welcome_email field must be an object with only the supported keys.",
    "errors": {
      "welcome_email": ["The welcome_email field must be an object with only the supported keys."]
    }
  }
  ```

  ```json 422 Invalid Value theme={null}
  {
    "message": "The appearance.hide_countries field accepts only: US, CA, AU, GB, ZA, RO, IT, PR, DK, IL, PL, FI, NL, ES.",
    "errors": {
      "appearance.hide_countries": ["The appearance.hide_countries field accepts only: US, CA, AU, GB, ZA, RO, IT, PR, DK, IL, PL, FI, NL, ES."]
    }
  }
  ```

  ```json 422 Content Not HTML theme={null}
  {
    "message": "The welcome_email.content field must be HTML, not JSON.",
    "errors": {
      "welcome_email.content": ["The welcome_email.content field must be HTML, not JSON."]
    }
  }
  ```

  ```json 429 Too Many Requests theme={null}
  {
    "message": "Too Many Attempts."
  }
  ```
</ResponseExample>

### Partial updates

* Sections you do not send stay unchanged, and so do the keys you leave out of a section you send.
* A list you send, such as `hide_pages`, replaces the whole list. Send `[]` to clear it.
* An unknown top-level field returns 422 with "The X field is not supported.", and an unknown key inside a section returns 422 with "The X field must be an object with only the supported keys.". In both cases nothing is saved, not even the valid parts of the request.
* Leading and trailing spaces and line breaks are removed from text values, `scripts` included. An empty string is saved as `null`.
* Send only the keys you want to change. A value you read earlier and send back unchanged is saved again, trimmed.

### Pages you can hide

| Value | Page |
| - | - |
| `hide_automation_page` | Automation |
| `hide_assistant_page` | Assistants |
| `hide_campaigns_page` | Campaigns |
| `hide_leads_page` | Leads |
| `hide_tools_page` | Tools & MCP |
| `hide_phone_numbers_page` | Get Phone Number |
| `hide_sms_history_page` | SMS History |
| `hide_api_page` | API Keys |
| `hide_knowledgebase_page` | Knowledgebase |
| `hide_conversations_page` | Conversations |
| `hide_calls_page` | Calls History |
| `hide_blacklist_page` | Blacklist |
| `hide_your_phone_numbers_page` | Your Phone Numbers |
| `hide_create_custom_dashboard` | Create Custom Dashboard |
| `hide_whatsapp_senders_page` | WhatsApp Senders |
| `hide_whatsapp_templates_page` | WhatsApp Templates |
| `hide_channels_page` | Channels |
| `hide_meta_connections_page` | Messenger & Instagram |

### Features you can hide

| Value | Feature |
| - | - |
| `hide_caller_id_button` | Caller ID Button |
| `hide_sip_integration_button` | SIP Integration |
| `hide_calendar_integration` | Calendar Integration |
| `hide_carrier_costs` | Carrier Costs Display |
| `hide_web_widget` | Web Widget Feature |
| `hide_secondary_languages` | Secondary Languages |
| `hide_dashboard_heading` | Dashboard Title & Subheading |
| `hide_auto_generated_plan_features` | Auto-Generated Plan Features |
| `hide_add_credits` | Add Credits Button |
| `hide_plans` | Plans Page & Button |
| `hide_vat_text` | VAT Text on Plans Page |
| `hide_ai_prompt_editor` | AI Prompt Editor |
| `hide_flow_builder` | Flow Builder |
| `hide_docs_button` | Docs Button |
| `hide_updates_button` | Updates Button & Modal |
| `hide_platform_tour` | Platform Tour |
| `hide_ai_connect_button` | Connect AI Button (ChatGPT/Claude) |

All pages, and all features except `hide_auto_generated_plan_features` and `hide_platform_tour`, can also be set for a single user with [Update user settings](/api-reference/white-label/update-user-settings).

### Countries you can hide

| Value | Country |
| - | - |
| `US` | United States |
| `CA` | Canada |
| `AU` | Australia |
| `GB` | United Kingdom |
| `ZA` | South Africa |
| `RO` | Romania |
| `IT` | Italy |
| `PR` | Puerto Rico |
| `DK` | Denmark |
| `IL` | Israel |
| `PL` | Poland |
| `FI` | Finland |
| `NL` | Netherlands |
| `ES` | Spain |

### Signup webhook

Each time a new user account is created on your platform, for example when someone signs up, the platform sends a POST request with this JSON body to `user_signup_webhook_url`:

```json theme={null}
{
  "id": 123,
  "name": "Jane Doe",
  "email": "jane@example.com",
  "created_at": "2026-09-29T10:15:00+00:00"
}
```

| Field | Type | Description |
| - | - | - |
| `id` | integer | The new user's ID, the same ID the other white label endpoints use, such as [Get user settings](/api-reference/white-label/get-user-settings) |
| `name` | string | The user's name |
| `email` | string | The user's email address |
| `created_at` | string | When the account was created, in ISO 8601 format with a UTC offset |

### Rate limit

The platform settings, default limits, user settings and plan endpoints share a limit of 60 requests per minute for each account. Above it they return `429`, and the `Retry-After` response header tells you how many seconds to wait.

### Example

```bash theme={null}
curl -X PATCH https://app.autocalls.ai/api/white-label/settings \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "welcome_email": {
      "subject": "Welcome to {tenant_name}, {user_name}!"
    },
    "email_notifications": {
      "export_completed": false
    },
    "appearance": {
      "hide_pages": ["hide_api_page", "hide_blacklist_page"]
    },
    "webhooks": {
      "user_signup_webhook_url": "https://example.com/hooks/signup"
    }
  }'
```


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