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

# Cria a empresa do usuário final, com os domínios que você confirma

> A empresa do seu cliente (o "Organization" de um SSO corporativo). Quem tem e-mail de um domínio verificado dela entra pelo provedor de identidade da empresa assim que a conexão ficar ativa. Exige uma chave secreta criada COM o escopo auth:organizations:write (chaves sem restrição não o têm).



## OpenAPI

````yaml /api-reference/openapi.json post /auth/organizations
openapi: 3.1.0
info:
  title: UNIFOKAL API
  version: v1
  summary: >-
    Verificação de identidade: sessão criada no servidor, jornada no widget,
    resultado no webhook.
  description: >-
    A versão vive no caminho (/v1); não existe header de versão. Adição
    compatível (campo, módulo ou chave nova) NÃO sobe a versão: ignore o que não
    conhecer. Todo erro tem a forma { error, message }: o código é estável, a
    mensagem não. Ids são prefixo + ULID. Webhooks são assinados (HMAC SHA-256
    no header X-IDSAAS-Signature, janela de 300s; o segredo é SEU, mínimo 32
    caracteres) e o header x-idsaas-event carrega o tipo do evento.
  termsOfService: https://unifokal.com/termos
  contact:
    name: UNIFOKAL
    url: https://docs.unifokal.com/
servers:
  - url: https://api.unifokal.com/v1
security: []
externalDocs:
  description: >-
    Documentação completa em https://docs.unifokal.com/. Briefing para agentes
    de IA em https://unifokal.com/llms.txt.
  url: https://docs.unifokal.com/
paths:
  /auth/organizations:
    post:
      summary: Cria a empresa do usuário final, com os domínios que você confirma
      description: >-
        A empresa do seu cliente (o "Organization" de um SSO corporativo). Quem
        tem e-mail de um domínio verificado dela entra pelo provedor de
        identidade da empresa assim que a conexão ficar ativa. Exige uma chave
        secreta criada COM o escopo auth:organizations:write (chaves sem
        restrição não o têm).
      operationId: createAuthOrganization
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AuthOrganizationCreateRequest'
      responses:
        '201':
          description: A empresa criada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthOrganization'
        '400':
          description: >-
            Códigos estáveis: invalid_json, validation_error. Ramifique pelo
            campo error, nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - invalid_json
                          - validation_error
        '401':
          description: >-
            Códigos estáveis: invalid_api_key. Ramifique pelo campo error, nunca
            pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - invalid_api_key
        '403':
          description: >-
            Códigos estáveis: credential_type_not_allowed,
            organization_suspended, test_key_used_in_production,
            insufficient_scope, ip_not_allowed. Ramifique pelo campo error,
            nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - credential_type_not_allowed
                          - organization_suspended
                          - test_key_used_in_production
                          - insufficient_scope
                          - ip_not_allowed
        '409':
          description: >-
            Códigos estáveis: domain_taken, external_id_taken. Ramifique pelo
            campo error, nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - domain_taken
                          - external_id_taken
        '413':
          description: >-
            Códigos estáveis: payload_too_large. Ramifique pelo campo error,
            nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - payload_too_large
        '422':
          description: >-
            Códigos estáveis: invalid_domain, consumer_domain. Ramifique pelo
            campo error, nunca pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - invalid_domain
                          - consumer_domain
        '429':
          description: >-
            Códigos estáveis: rate_limited. Ramifique pelo campo error, nunca
            pela mensagem.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ErrorEnvelope'
                  - properties:
                      error:
                        enum:
                          - rate_limited
      security:
        - secretKey: []
components:
  schemas:
    AuthOrganizationCreateRequest:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 100
          description: Espaços nas pontas são removidos antes da validação.
        external_id:
          type: string
          minLength: 1
          maxLength: 255
          description: Espaços nas pontas são removidos antes da validação.
        domains:
          type: array
          items:
            type: string
            minLength: 3
            maxLength: 253
            description: Espaços nas pontas são removidos antes da validação.
          maxItems: 20
      required:
        - name
      description: >-
        domains: os domínios de e-mail que VOCÊ confirma que são da empresa
        (ficam verificados na hora). E-mail gratuito (gmail.com e afins) é
        recusado. O TI da empresa também pode provar um domínio pelo DNS no
        portal.
    AuthOrganization:
      type: object
      required:
        - id
        - name
        - external_id
        - domains
        - connections
        - created_at
      properties:
        id:
          type: string
          pattern: ^aorg_[0-9A-HJKMNP-TV-Z]{26}$
        name:
          type: string
        external_id:
          type:
            - string
            - 'null'
        domains:
          type: array
          items:
            $ref: '#/components/schemas/AuthOrganizationDomain'
        connections:
          type: array
          items:
            $ref: '#/components/schemas/AuthSsoConnection'
        created_at:
          type: string
          format: date-time
    ErrorEnvelope:
      type: object
      description: >-
        Todo erro da API tem exatamente esta forma. O campo error é um código
        estável (contrato); message é texto livre e pode mudar sem aviso.
      required:
        - error
        - message
      properties:
        error:
          type: string
          description: Código estável do erro. Ramifique por ele.
        message:
          type: string
          description: Texto explicativo. NÃO é contrato.
      additionalProperties: false
    AuthOrganizationDomain:
      type: object
      required:
        - id
        - domain
        - state
        - method
        - verified_at
      properties:
        id:
          type: string
          pattern: ^aod_[0-9A-HJKMNP-TV-Z]{26}$
        domain:
          type: string
        state:
          type: string
          enum:
            - pending
            - verified
        method:
          type: string
          enum:
            - developer
            - dns
        verified_at:
          type:
            - string
            - 'null'
          format: date-time
    AuthSsoConnection:
      type: object
      required:
        - id
        - protocol
        - status
        - name
        - saml_idp_entity_id
        - saml_idp_sso_url
        - saml_certificates
        - oidc_issuer
        - oidc_client_id
        - default_role
        - sp
        - created_at
      properties:
        id:
          type: string
          pattern: ^asc_[0-9A-HJKMNP-TV-Z]{26}$
        protocol:
          type: string
          enum:
            - saml
            - oidc
        status:
          type: string
          enum:
            - draft
            - active
            - inactive
        name:
          type: string
        saml_idp_entity_id:
          type:
            - string
            - 'null'
        saml_idp_sso_url:
          type:
            - string
            - 'null'
        saml_certificates:
          type: array
          items:
            type: object
            required:
              - subject
              - not_after
            properties:
              subject:
                type: string
              not_after:
                type: string
        oidc_issuer:
          type:
            - string
            - 'null'
        oidc_client_id:
          type:
            - string
            - 'null'
        default_role:
          type: string
        sp:
          type: object
          description: >-
            Os dados deste serviço que o TI da empresa cadastra no provedor de
            identidade.
          required:
            - entity_id
            - acs_url
            - metadata_url
            - oidc_redirect_uri
          properties:
            entity_id:
              type: string
            acs_url:
              type: string
            metadata_url:
              type: string
            oidc_redirect_uri:
              type: string
        created_at:
          type: string
          format: date-time
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      description: >-
        Chave secreta (unifokal_live_ em produção, unifokal_test_ no sandbox: 64
        hex mais CRC-32) no Authorization: Bearer. Só no seu servidor: nunca no
        browser ou app (o widget monta apenas com o id vs_ da sessão). Não
        existe chave publishable.

````

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