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

# Actualizar organizaciones en lote

> Actualiza organizaciones existentes por ID, nunca crea. Reutiliza las reglas del PATCH individual: campos snake_case y atributos por nombre, money como {currency, amount} o "CLP 0", null para borrar atributos. Cada organización es atómica; el lote permite éxito parcial y se procesa secuencialmente. Un 200 requiere revisar todos los status. Hasta 100 elementos. Cada elemento consume una unidad del mismo límite por API key que las solicitudes individuales (600/minuto por defecto), incluidos duplicados, faltantes y fallos de negocio. Un 429 rechaza todo el lote antes de escribir, pero suma su costo completo al contador y puede agotar las unidades restantes; no extiende la ventana. Respeta Retry-After. El límite conserva la política de permitir solicitudes si Redis falla. Cuerpo: 512 KiB; values por elemento: 8 KiB. Las asignaciones idénticas se pueden repetir sin incrementar ni acumular valores, pero pueden cambiar updated_at o repetir notificaciones de cambio; no hay deduplicación ni garantía de efectos exactamente una vez. Tras timeout, 5xx o status unknown, cualquier subconjunto puede estar confirmado: consulta por ID (o bulk lookup por el tax_id nuevo y anterior), compara valores y reenvía sólo asignaciones aún deseadas a los IDs estables. Un GET individual omite atributos null; bulk lookup conserva null. No reenvíes valores viejos sobre ediciones posteriores. El lote no sirve para intercambiar o transferir tax_ids entre organizaciones: se valida contra los propietarios al inicio y la unicidad al escribir. Ver [guía de lotes](/guia#actualización-de-organizaciones-en-lote).



## OpenAPI

````yaml /openapi.json patch /organizations/public/v1/bulk
openapi: 3.1.0
info:
  title: Revem API
  version: 1.0.0
  description: >-
    La API pública de Revem para integraciones de servidor a servidor:
    contactos, organizaciones, tickets, reuniones y el canal de webchat. Se
    autentica con la API key de tu organización.
  contact:
    name: Soporte Revem
    email: soporte@revem.ai
    url: https://revem.ai
servers:
  - url: https://api.revem.ai
    description: Producción
security:
  - apiKey: []
tags:
  - name: WhatsApp
    description: >-
      Envía plantillas aprobadas desde los números conectados de tu
      organización.
  - name: Organizaciones
    description: >-
      Sincroniza empresas por identificador tributario, con atributos
      personalizados por nombre.
  - name: Contactos
    description: >-
      Sincroniza tu base de clientes con Revem. Los contactos se identifican por
      teléfono al crearlos y por id después.
  - name: Tickets
    description: Lee y actualiza los tickets de tu embudo desde tu sistema de gestión.
  - name: Webchat
    description: >-
      Conecta el chat de tu sitio con Revem: registra lo que escribe el
      visitante y lee las respuestas del equipo o del agente.
  - name: Reuniones
    description: >-
      Requiere el módulo meetings. Reuniones independientes de las citas
      médicas, con responsable, capacidad y reservas por contacto y ocurrencia.
paths:
  /organizations/public/v1/bulk:
    patch:
      tags:
        - Organizaciones
      summary: Actualizar organizaciones en lote
      description: >-
        Actualiza organizaciones existentes por ID, nunca crea. Reutiliza las
        reglas del PATCH individual: campos snake_case y atributos por nombre,
        money como {currency, amount} o "CLP 0", null para borrar atributos.
        Cada organización es atómica; el lote permite éxito parcial y se procesa
        secuencialmente. Un 200 requiere revisar todos los status. Hasta 100
        elementos. Cada elemento consume una unidad del mismo límite por API key
        que las solicitudes individuales (600/minuto por defecto), incluidos
        duplicados, faltantes y fallos de negocio. Un 429 rechaza todo el lote
        antes de escribir, pero suma su costo completo al contador y puede
        agotar las unidades restantes; no extiende la ventana. Respeta
        Retry-After. El límite conserva la política de permitir solicitudes si
        Redis falla. Cuerpo: 512 KiB; values por elemento: 8 KiB. Las
        asignaciones idénticas se pueden repetir sin incrementar ni acumular
        valores, pero pueden cambiar updated_at o repetir notificaciones de
        cambio; no hay deduplicación ni garantía de efectos exactamente una vez.
        Tras timeout, 5xx o status unknown, cualquier subconjunto puede estar
        confirmado: consulta por ID (o bulk lookup por el tax_id nuevo y
        anterior), compara valores y reenvía sólo asignaciones aún deseadas a
        los IDs estables. Un GET individual omite atributos null; bulk lookup
        conserva null. No reenvíes valores viejos sobre ediciones posteriores.
        El lote no sirve para intercambiar o transferir tax_ids entre
        organizaciones: se valida contra los propietarios al inicio y la
        unicidad al escribir. Ver [guía de
        lotes](/guia#actualización-de-organizaciones-en-lote).
      operationId: bulkUpdateOrganizations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrganizationBulkUpdateBody'
            example:
              updates:
                - id: 3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90
                  changes:
                    name: ' Empresa actualizada '
                    Saldo:
                      currency: clp
                      amount: 0
                    Deuda: null
                - id: 11111111-1111-4111-8111-111111111111
                  changes:
                    name: No existe
                - id: 22222222-2222-4222-8222-222222222222
                  changes:
                    Desconocido: null
      responses:
        '200':
          description: >-
            Resultados por elemento; puede incluir éxitos, fallos o resultados
            desconocidos.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationBulkUpdateResult'
        '400':
          description: >-
            Cuerpo inválido, IDs duplicados o más de 100 elementos; no se
            escribe nada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationsError'
        '401':
          description: Sin credencial, o la API key no existe o fue revocada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              example:
                error: Unauthorized
                message: Invalid API key
        '403':
          description: >-
            La credencial no puede usar esta ruta. Una API key sólo alcanza los
            endpoints documentados aquí; cualquier otra ruta de la API responde
            este código.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              example:
                ok: false
                error: Forbidden
                message: This endpoint is not available to API keys
        '413':
          description: Cuerpo mayor que 512 KiB; no se escribe nada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationsError'
        '429':
          description: >-
            La key superó su presupuesto de unidades por minuto: una por
            solicitud individual o elemento de lote. El header `retry-after`
            indica cuánto esperar.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
              example:
                ok: false
                error: Too many requests. Retry in 60 seconds.
          headers:
            retry-after:
              description: Segundos que esperar antes de reintentar.
              schema:
                type: integer
            x-ratelimit-limit:
              description: >-
                Unidades permitidas por minuto: cada solicitud individual
                consume 1; cada elemento de un lote de organizaciones consume 1.
              schema:
                type: integer
            x-ratelimit-remaining:
              description: Unidades que quedan en la ventana actual.
              schema:
                type: integer
            x-ratelimit-reset:
              description: Segundos hasta que la ventana se reinicia.
              schema:
                type: integer
components:
  schemas:
    OrganizationBulkUpdateBody:
      type: object
      properties:
        updates:
          minItems: 1
          maxItems: 100
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
              changes:
                type: object
                properties:
                  tax_id:
                    type: string
                    minLength: 1
                    maxLength: 100
                  name:
                    type: string
                    maxLength: 500
                  website:
                    type: string
                    maxLength: 2000
                  address:
                    type: string
                    maxLength: 2000
                  business_activity:
                    type: string
                    maxLength: 500
                additionalProperties: true
            required:
              - id
              - changes
            additionalProperties: false
          description: >-
            Entre 1 y 100 objetos {id, changes}, IDs únicos sin distinguir
            mayúsculas. changes acepta los mismos campos y atributos por nombre
            que PATCH individual, hasta 100 atributos por organización. Nombres
            de atributo sin distinguir mayúsculas; null borra un atributo
            existente, incluidos money; campos nativos no aceptan null. Omitidos
            y campos nativos vacíos conservan su valor.
      required:
        - updates
      additionalProperties: false
      description: >-
        Cuerpo máximo 512 KiB. Máximo 8 KiB de JSON UTF-8 para values de cada
        organización; se valida antes de escribir (422 por elemento). Un cuerpo
        mal formado o IDs duplicados responde 400 y no escribe ningún elemento.
        Un atributo desconocido o inválido es un fallo por elemento.
      example:
        updates:
          - id: 3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90
            changes:
              name: ' Empresa actualizada '
              Saldo:
                currency: clp
                amount: 0
              Deuda: null
          - id: 11111111-1111-4111-8111-111111111111
            changes:
              name: No existe
          - id: 22222222-2222-4222-8222-222222222222
            changes:
              Desconocido: null
    OrganizationBulkUpdateResult:
      type: object
      properties:
        results:
          maxItems: 100
          type: array
          items:
            oneOf:
              - type: object
                properties:
                  index:
                    type: integer
                    minimum: 0
                  id:
                    type: string
                    format: uuid
                  status:
                    type: string
                    const: updated
                  values:
                    type: object
                    additionalProperties: true
                required:
                  - index
                  - id
                  - status
                  - values
                additionalProperties: false
              - type: object
                properties:
                  index:
                    type: integer
                    minimum: 0
                  id:
                    type: string
                    format: uuid
                  status:
                    type: string
                    const: failed
                  code:
                    anyOf:
                      - type: number
                        const: 400
                      - type: number
                        const: 403
                      - type: number
                        const: 404
                      - type: number
                        const: 409
                      - type: number
                        const: 422
                  message:
                    type: string
                required:
                  - index
                  - id
                  - status
                  - code
                  - message
                additionalProperties: false
              - type: object
                properties:
                  index:
                    type: integer
                    minimum: 0
                  id:
                    type: string
                    format: uuid
                  status:
                    type: string
                    const: unknown
                  code:
                    type: number
                    const: 500
                  message:
                    type: string
                required:
                  - index
                  - id
                  - status
                  - code
                  - message
                additionalProperties: false
          description: >-
            Orden de entrada, index desde 0. updated: values contiene
            exactamente las claves solicitadas con valores persistidos, incluso
            null; no es un eco de entrada. failed: code 400/403/404/409/422 y
            message, sin cambios en esa organización. unknown: code 500, no se
            pudo confirmar el commit; consulta antes de reintentar. Los errores
            de infraestructura no exponen detalles de la base de datos.
      required:
        - results
      additionalProperties: false
      description: >-
        200 significa que hay resultados por elemento, incluso si todos
        fallaron. No hay transacción global: cada organización es atómica e
        independiente. Los valores y mensajes acotados mantienen la respuesta
        bajo 1 MiB.
      example:
        results:
          - index: 0
            id: 3f2b6c1e-8d4a-4f0b-9c2e-7a1d5e6f8b90
            status: updated
            values:
              name: Empresa actualizada
              Saldo:
                currency: CLP
                amount: 0
              Deuda: null
          - index: 1
            id: 11111111-1111-4111-8111-111111111111
            status: failed
            code: 404
            message: No existe una organización con ese id
          - index: 2
            id: 22222222-2222-4222-8222-222222222222
            status: failed
            code: 422
            message: 'Atributos de organización sin definición: Desconocido'
    OrganizationsError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: string
          description: Etiqueta del código HTTP; message explica el problema.
        message:
          type: string
          description: Explicación legible del problema.
        unknownAttributes:
          type: array
          items:
            type: string
          description: >-
            Nombres desconocidos o de sólo lectura rechazados con 422; corrige
            la solicitud antes de reintentar.
      required:
        - error
      additionalProperties: false
    AuthError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
          description: Presente sólo en el `403`.
        error:
          type: string
        message:
          type: string
      required:
        - error
        - message
    RateLimitError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: string
          description: Incluye cuánto esperar antes de reintentar.
      required:
        - ok
        - error
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        La API key de tu organización, con la forma `rvm_<prefijo>.<secreto>`,
        enviada como `Authorization: Bearer rvm_…`. Revem la emite y sólo se
        muestra una vez; si la pierdes se reemplaza, no se recupera.

````

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