---
search:
  tags:
    - Multitenancy Recipe
    - PUT
seo:
  description: >-
    Creates or updates ThirdParty… Reference for the PUT
    /appid-{appId}/{tenantId}/recipe/multitenancy/config/thirdparty endpoint in
    the Core Driver Interface API.
sidebar:
  badge: PUT
  label: Upsert ThirdParty Provider configuration
title: Upsert ThirdParty Provider configuration
type: openapi-operation
---
Creates or updates ThirdParty Provider Config for a tenant.

If `skipValidation` is set to true, the config will be saved without any validation.

If the config already exists for the given `tenantId` and `thirdPartyId`, the config in the core will be completely replaced with the config provided in the request body.

**Validations done by the core:**

`thirdPartyId` and `name` are required

Common to all providers:
  - `clients` list:
    - can be undefined or empty
    - if contains 1 element, clientType can be empty or undefined
    - if contains more than 1 element, clientType must be defined and unique
  - for each element in `clients`:
    - `clientId` must not be empty

Built-in provider's specific validation is invoked if the `thirdPartyId` starts with the provider's id

Apple (id: apple):
  - `clients`
    - if it contains elements, each of them are validated as follows:
      - `clientSecret` must be empty or undefined
      - `additionalConfig` should contain the following keys:
        - `keyId` must be a non empty string
        - `teamId` must be a non empty string
        - `privateKey` must be a non empty string

Google Workspaces (id: google-workspaces):
  - `clients`
    - if it contains elements, each of them are validated as follows:
      - `additionalConfig` may contain the key `hd`
        - `hd` is optional
        - if specified, it must be either `"*"`, or a valid domain

Boxy SAML (id: boxy-saml):
  - `clients`
    - `additionalConfig` in the each element must contain `boxyURL` and must be non-empty string

<Operation source="references-cdi" id="createorupdatetenantconfigput" />
