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

# Create a tenant

> Creates a customer business with its own workspace. Answers 201. A repeat with the same `external_ref` answers 200 with the tenant that exists, and switches an offboarded tenant back on. Each tenant needs its own `owner_email`. Needs the `tenants:write` scope.



## OpenAPI

````yaml /openapi/partner.yaml post /api/v1/partner/tenants/
openapi: 3.1.0
info:
  title: ImpelLabs Partner API
  version: '1'
  description: >-
    The Partner API provisions customer businesses (tenants) and runs their
    channels, conversations and templates from your own product. Call it from
    your server with a partner key. Every path ends with a slash.
servers:
  - url: https://api.impellabs.tech
security:
  - bearer: []
tags:
  - name: Keys
    description: Your partner API keys.
  - name: Tenants
    description: Customer businesses, their channels, conversations and templates.
  - name: Webhooks
    description: Where your tenants' events go.
  - name: WhatsApp sign-up
    description: The settings of the hosted WhatsApp sign-up.
paths:
  /api/v1/partner/tenants/:
    post:
      tags:
        - Tenants
      summary: Create a tenant
      description: >-
        Creates a customer business with its own workspace. Answers 201. A
        repeat with the same `external_ref` answers 200 with the tenant that
        exists, and switches an offboarded tenant back on. Each tenant needs its
        own `owner_email`. Needs the `tenants:write` scope.
      operationId: post_api_v1_partner_tenants
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                external_ref:
                  type: string
                  description: >-
                    Your own id for the business. Plain text with no slash. 120
                    characters at most.
                name:
                  type: string
                  description: The business name.
                owner_email:
                  type: string
                  description: The owner email. It must not belong to another user.
                  format: email
                owner_name:
                  type: string
                  description: The owner name.
                country:
                  type: string
                  description: A two-letter country code.
                phone:
                  type: string
                  description: The business phone number.
                monthly_credit_cap:
                  type: integer
                  minimum: 0
                  description: >-
                    The most credits the business can use in a month. 0 means no
                    cap.
                plan:
                  type: string
                  description: >-
                    The slug of one of your active plans. Empty means the free
                    plan.
              required:
                - external_ref
                - name
                - owner_email
                - monthly_credit_cap
            example:
              external_ref: acme-001
              name: Acme Dental
              owner_email: owner@example.org
              owner_name: Sam Rivera
              monthly_credit_cap: 5000
        required: true
      responses:
        '201':
          description: Success
          content:
            application/json:
              example:
                external_ref: acme-001
                id: 2f1c0b9e-0000-4000-8000-000000000000
                name: Acme Dental
                plan: free
                status: active
                billed_to: partner
                billing_mode: payg
                monthly_credit_cap: 5000
                is_active: true
                created_at: '2026-01-15T09:30:00+00:00'
        '400':
          $ref: '#/components/responses/Invalid'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        4XX:
          description: The request is not valid or not allowed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  responses:
    Invalid:
      description: >-
        A field is missing or wrong. The body names each field: {"field": "what
        to fix"}.
    Unauthorized:
      description: The credentials are missing, wrong, expired or revoked.
    Forbidden:
      description: These credentials may not do this.
  schemas:
    Error:
      type: object
      description: >-
        An error. Most errors carry `detail`. Some carry `error` with `code` and
        `message`.
      properties:
        detail:
          type: string
        code:
          type: string
        field:
          type: string
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
  securitySchemes:
    bearer:
      type: http
      scheme: bearer

````

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