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

# Resumo do dia

> As rondas de um dia somadas: quantas foram, quantas câmeras trouxeram imagem e o
que foi identificado, com o link do relatório de cada uma.

É a resposta de "como foi o dia" numa chamada, no lugar de uma por ronda. O dia é
**local**: `time_zone` diz em que fuso ele foi recortado e `window_start` /
`window_end` dão a janela em UTC — a ronda das 21h pertence ao dia local dela, não
ao dia UTC seguinte.

`totals.measured` é `false` quando nenhuma câmera chegou a ser avaliada no dia.
Nesse caso os zeros do bloco **não são medida**, e um resumo que diga "0
detecções" ali estaria afirmando o que ninguém apurou.

`report_url` sai `null` para chave com escopo recortado: o link abre o relatório
inteiro daquela ronda, e ele não tem como ser recortado por câmera.



## OpenAPI

````yaml /api-reference/openapi.json get /api/patrols/reports/digest
openapi: 3.1.0
info:
  description: >

    API de leitura do Pictor Cloud para integração de parceiro.


    ## Autenticação


    Toda chamada leva a chave no cabeçalho `Authorization`:


    ```

    Authorization: Bearer pct_1a2b3c4d_<segredo>

    ```


    A chave é emitida por um **administrador da conta** no console, em

    **Configurações › Chaves de API**, e **aparece uma única vez**, no momento
    da criação. O servidor

    guarda apenas o resumo criptográfico dela: não existe "mostrar de novo". Se

    perder, emita outra e revogue a antiga.


    ## O que a chave enxerga


    A chave carrega o mesmo par permissão/alcance de um usuário:


    | Campo | Valores | Efeito |

    |---|---|---|

    | `role` | `viewer`, `operator`, `admin` | `viewer` basta para tudo que está
    documentado aqui |

    | `scope` | `tenant`, `client`, `video_wall` | recorta o que a chave vê
    dentro da conta |


    Uma chave com `scope=client` só devolve as câmeras (e os eventos, e o

    diagnóstico) daquele cliente. Uma chave nunca atravessa a fronteira da conta
    que

    a emitiu: não existe chave que enxergue duas contas.


    ## Validade


    Toda chave tem prazo — "nunca expira" não é um estado que exista. Quando ela

    vence, as chamadas passam a responder `401`; a cura é emitir outra no
    console.


    ## Cabeçalhos que não se aplicam


    - `X-Tenant-ID`: opcional. Se vier, precisa ser a conta da própria chave;
      divergente responde `403`. A chave decide a conta, o cabeçalho nunca a troca.
    - `X-Membership-ID`: responde `403`. Uma chave não troca de workspace.


    ## Limites


    Cada chave tem 600 requisições por minuto. Ao estourar, a resposta é `429`
    com

    `Retry-After`. A emissão de URL de mídia tem teto próprio de 12 por minuto:
    ela

    não é uma leitura, prepara a transmissão da câmera.


    Os cabeçalhos `RateLimit-*` da resposta vêm da borda e contam um orçamento

    compartilhado por endereço de origem, não o teto desta chave. O
    `Retry-After` do

    `429` é o único que fala dela.


    ## Erros


    | Código | Significado |

    |---|---|

    | `401` | chave ausente, malformada, revogada ou expirada (o motivo não é
    detalhado, de propósito) |

    | `403` | chave válida, sem permissão para o recurso — ou cabeçalho que
    contradiz a chave |

    | `404` | o recurso não existe **ou** não é desta chave (não distinguimos:
    dizer qual seria contar o que existe) |

    | `429` | teto de requisições estourado |
  title: Pictor Cloud — API de parceiro
  version: 1.0.0
servers:
  - description: Pictor Cloud
    url: https://api.pictor.cloud
security: []
tags:
  - name: Câmeras
  - name: Vídeo ao vivo
  - name: Vídeo gravado
  - name: Eventos de IA
  - name: Ronda
  - name: Murais
paths:
  /api/patrols/reports/digest:
    get:
      tags:
        - Ronda
      summary: Resumo do dia
      description: >-
        As rondas de um dia somadas: quantas foram, quantas câmeras trouxeram
        imagem e o

        que foi identificado, com o link do relatório de cada uma.


        É a resposta de "como foi o dia" numa chamada, no lugar de uma por
        ronda. O dia é

        **local**: `time_zone` diz em que fuso ele foi recortado e
        `window_start` /

        `window_end` dão a janela em UTC — a ronda das 21h pertence ao dia local
        dela, não

        ao dia UTC seguinte.


        `totals.measured` é `false` quando nenhuma câmera chegou a ser avaliada
        no dia.

        Nesse caso os zeros do bloco **não são medida**, e um resumo que diga "0

        detecções" ali estaria afirmando o que ninguém apurou.


        `report_url` sai `null` para chave com escopo recortado: o link abre o
        relatório

        inteiro daquela ronda, e ele não tem como ser recortado por câmera.
      operationId: get_patrol_report_digest_api_patrols_reports_digest_get
      parameters:
        - description: >-
            Dia a resumir, no formato AAAA-MM-DD. É um dia LOCAL, no fuso
            configurado para a conta — a resposta devolve o fuso usado e a
            janela em UTC. Sem `date`, é hoje nesse mesmo fuso.
          in: query
          name: date
          required: false
          schema:
            anyOf:
              - format: date
                type: string
              - type: 'null'
            description: 'Dia local (default: hoje no fuso da conta).'
            title: Date
      responses:
        '200':
          content:
            application/json:
              example:
                date: '2026-09-03'
                site_name: Cond. Alvorada - Portaria
                sweeps:
                  - account: '4021'
                    cameras_pending: 0
                    cameras_person: 1
                    cameras_total: 11
                    cameras_vehicle: 0
                    cameras_with_frame: 10
                    finished_at: '2026-09-03T03:13:41Z'
                    ref: 9f52a3b1-0c4d-4e6f-8a90-1b2c3d4e5f60
                    report_url: >-
                      https://app.pictor.cloud/share/patrol/9f52a3b1-0c4d-4e6f-8a90-1b2c3d4e5f60?exp=1757462400&t=8f2c1d9a4b6e0357
                    started_at: '2026-09-03T03:12:04Z'
                    trigger_code: '1130'
                    trigger_description: Alarme de intrusão
                time_zone: America/Sao_Paulo
                totals:
                  cameras_pending: 0
                  cameras_person: 1
                  cameras_total: 22
                  cameras_vehicle: 0
                  cameras_with_frame: 21
                  measured: true
                  sweeps: 2
                truncated: false
                window_end: '2026-09-04T03:00:00Z'
                window_start: '2026-09-03T03:00:00Z'
              schema:
                $ref: '#/components/schemas/PatrolDigestOut'
          description: Successful Response
        '401':
          description: Chave ausente, invalida, revogada ou expirada.
        '403':
          description: Chave valida, sem permissao para o recurso.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          description: >-
            Parametro invalido: fora da faixa aceita, data sem fuso ou
            identificador malformado.
        '429':
          description: Teto de requisicoes desta chave excedido.
      security:
        - HTTPBearer: []
components:
  schemas:
    PatrolDigestOut:
      properties:
        date:
          format: date
          title: Date
          type: string
        site_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Site Name
        sweeps:
          items:
            $ref: '#/components/schemas/DigestSweepOut'
          title: Sweeps
          type: array
        time_zone:
          title: Time Zone
          type: string
        totals:
          $ref: '#/components/schemas/DigestTotalsOut'
        truncated:
          default: false
          title: Truncated
          type: boolean
        window_end:
          format: date-time
          title: Window End
          type: string
        window_start:
          format: date-time
          title: Window Start
          type: string
      required:
        - date
        - time_zone
        - window_start
        - window_end
        - totals
      title: PatrolDigestOut
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    DigestSweepOut:
      description: Uma ronda do dia, como o resumo a mostra.
      properties:
        account:
          anyOf:
            - type: string
            - type: 'null'
          title: Account
        cameras_pending:
          default: 0
          title: Cameras Pending
          type: integer
        cameras_person:
          default: 0
          title: Cameras Person
          type: integer
        cameras_total:
          default: 0
          title: Cameras Total
          type: integer
        cameras_vehicle:
          default: 0
          title: Cameras Vehicle
          type: integer
        cameras_with_frame:
          default: 0
          title: Cameras With Frame
          type: integer
        finished_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Finished At
        ref:
          format: uuid
          title: Ref
          type: string
        report_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Report Url
        started_at:
          anyOf:
            - format: date-time
              type: string
            - type: 'null'
          title: Started At
        trigger_code:
          anyOf:
            - type: string
            - type: 'null'
          title: Trigger Code
        trigger_description:
          anyOf:
            - type: string
            - type: 'null'
          title: Trigger Description
      required:
        - ref
      title: DigestSweepOut
      type: object
    DigestTotalsOut:
      description: O dia somado. ``measured`` é o que separa "nada aconteceu" de "zero".
      properties:
        cameras_pending:
          default: 0
          title: Cameras Pending
          type: integer
        cameras_person:
          default: 0
          title: Cameras Person
          type: integer
        cameras_total:
          default: 0
          title: Cameras Total
          type: integer
        cameras_vehicle:
          default: 0
          title: Cameras Vehicle
          type: integer
        cameras_with_frame:
          default: 0
          title: Cameras With Frame
          type: integer
        measured:
          default: false
          title: Measured
          type: boolean
        sweeps:
          default: 0
          title: Sweeps
          type: integer
      title: DigestTotalsOut
      type: object
    ValidationError:
      properties:
        ctx:
          title: Context
          type: object
        input:
          title: Input
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          title: Location
          type: array
        msg:
          title: Message
          type: string
        type:
          title: Error Type
          type: string
      required:
        - loc
        - msg
        - type
      title: ValidationError
      type: object
  securitySchemes:
    HTTPBearer:
      description: Chave de API da conta, no formato `pct_<prefixo>_<segredo>`.
      scheme: bearer
      type: http

````