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

# Queda com o log do momento

> Uma queda com as últimas 200 linhas do log de quando o projeto caiu, com os segredos mascarados.

Uma queda da [Linha do tempo de quedas](/api-reference/projects/crashes) com o **log daquele momento**: as últimas 200 linhas que o projeto escreveu (`stdout` e `stderr`) antes de cair. O que a vida seguinte escreveu, depois do reinício automático, fica de fora.

## O que aparece mascarado

O log guardado desta queda é mascarado antes de ser guardado e não tem o texto original. O console ao vivo e a [rota de logs](/api-reference/projects/logs) continuam mostrando o que o projeto escreveu.

* O **valor de cada variável de ambiente** do projeto vira `[valor de NOME]`, com o nome da variável: o valor de agora e o de antes de uma troca que ainda não valeu (variável trocada ou tirada só vale depois de reiniciar), também quando o projeto imprime o valor escapado, como o `JSON.stringify` ou o `console.log` de um objeto. **Valores com menos de 6 caracteres não são mascarados**, como `true` ou `8080`.
* Tokens do Discord, chaves `sk-`, JWT, o que vem depois de `Bearer`, senhas em URL de banco, linhas como `TOKEN=…` ou `"password": "…"` e chaves privadas viram `[token removido]`, `[chave removida]`, `[senha removida]` ou `[valor removido]`.

Cada linha vai até 1.000 caracteres e a queda inteira até 64 mil: com algo cortado, `log.isTruncated` vem `true`. Também vem `true` quando o projeto escreveu tanto logo depois de voltar que as linhas mais antigas daquele momento não puderam mais ser lidas.

## Quando `log` vem `null`

| `logStatus` | O que quer dizer |
| - | - |
| `pending` | O log está sendo guardado. Leva alguns segundos depois da queda: tente de novo. |
| `unavailable` | Não deu para ler o log logo depois da queda (o servidor dos projetos não respondeu a tempo, ou o projeto já tinha voltado e o log daquele momento não estava mais lá). A hora e o motivo ficaram guardados. |

Funciona com a chave de leitura.

## Erros comuns

| Código | HTTP | O que fazer |
| - | - | - |
| [`not_found`](/errors#param-not-found) | 404 | Confira o ID do projeto e o `id` da queda na lista. Quedas com mais de 30 dias saem. |

Todos os códigos, com o formato do erro, em [Códigos de erro](/errors).


## OpenAPI

````yaml GET /projects/{id}/crashes/{crashId}
openapi: 3.1.0
info:
  title: API da Cube Hosting
  version: 1.0.0
  description: >-
    Hospede bots de Discord, sites e APIs em Node.js e Python: envie o .zip,
    inicie, pare, reinicie, leia logs e métricas, veja a análise das visitas dos
    sites, cuide das variáveis de ambiente, faça e baixe backups, volte para uma
    versão anterior, crie bancos de dados (PostgreSQL, MySQL, MongoDB e Redis),
    guarde arquivos privados no Blob, use um domínio seu nos sites e veja o uso
    do plano. Para agentes de IA, o servidor MCP da conta (`POST
    https://app.cubehosting.com.br/api/mcp`, JSON-RPC, com a mesma chave) está
    em https://docs.cubehosting.com.br/account-mcp.
  contact:
    name: Cube Hosting
    url: https://discord.gg/pv6D9tUsDV
servers:
  - url: https://app.cubehosting.com.br/api
security:
  - bearerAuth: []
tags:
  - name: Projetos
  - name: Controle
  - name: Logs e métricas
  - name: Análise
  - name: Variáveis de ambiente
  - name: Backups
  - name: Versões dos envios
  - name: Bancos de dados
  - name: Blob
  - name: Domínios
  - name: Templates
  - name: Avisos
  - name: Conta
paths:
  /projects/{id}/crashes/{crashId}:
    get:
      tags:
        - Logs e métricas
      summary: Queda com o log do momento
      description: >-
        Uma queda com as últimas 200 linhas do log daquele momento (`stdout` e
        `stderr`, só as de antes da queda). O log desta queda é mascarado antes
        de ser guardado (o console ao vivo e a rota de logs seguem com o texto
        original): o valor de cada variável de ambiente do projeto vira `[valor
        de NOME]`, o de agora e o de antes de uma troca que ainda não valeu,
        também escapado (valores com menos de 6 caracteres não são mascarados),
        e tokens do Discord, chaves `sk-`, JWT, `Bearer`, senhas em URL, linhas
        `TOKEN=…` e chaves privadas viram `[token removido]`, `[chave
        removida]`, `[senha removida]` ou `[valor removido]`. Cada linha vai até
        1.000 caracteres e a queda inteira até 64 mil (`isTruncated`). `log` vem
        `null` enquanto está sendo guardado (`logStatus: "pending"`, alguns
        segundos) ou quando não deu para ler o log daquele momento
        (`unavailable`).
      operationId: getProjectCrash
      parameters:
        - $ref: '#/components/parameters/ProjectId'
        - name: crashId
          in: path
          required: true
          description: O `id` da queda, da lista.
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: A queda com o log.
          content:
            application/json:
              schema:
                type: object
                required:
                  - crash
                properties:
                  crash:
                    $ref: '#/components/schemas/CrashDetail'
              example:
                crash:
                  id: 5b0f7c9e-3d7a-4c1e-9a55-2f1c8e7d6b40
                  exitedAt: '2026-09-29T14:02:11.000Z'
                  startedAt: '2026-09-29T13:59:58.000Z'
                  uptimeSeconds: 133
                  exitCode: 137
                  signal: SIGKILL
                  isOutOfMemory: true
                  memoryLimitMb: 256
                  reason: 'Sem memória: passou de 256 MB'
                  outcome: restarting
                  consecutiveCrashes: 1
                  restartedAt: '2026-09-29T14:02:13.000Z'
                  logStatus: available
                  log:
                    lines:
                      - time: '2026-09-29T14:02:10.412Z'
                        stream: stdout
                        text: Conectando com DISCORD_TOKEN=[valor de DISCORD_TOKEN]
                      - time: '2026-09-29T14:02:11.020Z'
                        stream: stderr
                        text: >-
                          FATAL ERROR: Reached heap limit Allocation failed -
                          JavaScript heap out of memory
                    isTruncated: false
        '401':
          description: Chave ausente, inválida ou revogada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalid_api_key:
                  summary: invalid_api_key
                  value:
                    status: error
                    code: invalid_api_key
                    message: >-
                      Chave de API inválida ou revogada. Confira o cabeçalho
                      "Authorization: Bearer <chave>" ou crie outra em Chaves de
                      API no painel.
        '404':
          description: O projeto ou a queda não existem, ou não são da sua conta.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                not_found:
                  summary: not_found
                  value:
                    status: error
                    code: not_found
                    message: Queda não encontrada.
        '429':
          description: Limite de pedidos. Traz o cabeçalho `Retry-After`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                rate_limit_exceeded:
                  summary: rate_limit_exceeded
                  value:
                    status: error
                    code: rate_limit_exceeded
                    message: >-
                      A sua conta passou do limite da API do plano Free: 10
                      pedidos por minuto. Espere 42 s e tente de novo.
                too_many_attempts:
                  summary: too_many_attempts
                  value:
                    status: error
                    code: too_many_attempts
                    message: Muitas tentativas. Tente de novo em 15 minutos.
      x-codeSamples:
        - lang: bash
          label: curl
          source: >-
            curl
            "https://app.cubehosting.com.br/api/projects/$PROJECT_ID/crashes/$CRASH_ID"
            \
              -H "Authorization: Bearer $CUBE_API_KEY"
        - lang: javascript
          label: Node.js
          source: >-
            const API = 'https://app.cubehosting.com.br/api';

            const headers = { Authorization: `Bearer
            ${process.env.CUBE_API_KEY}` };


            const res = await fetch(
              `${API}/projects/${process.env.PROJECT_ID}/crashes/${process.env.CRASH_ID}`,
              { headers },
            );

            const { crash } = await res.json();

            console.log(crash.reason);

            for (const line of crash.log?.lines ?? []) console.log(line.time,
            line.text);
        - lang: python
          label: Python
          source: |-
            import os
            import requests

            API = "https://app.cubehosting.com.br/api"
            headers = {"Authorization": f"Bearer {os.environ['CUBE_API_KEY']}"}

            r = requests.get(
                f"{API}/projects/{os.environ['PROJECT_ID']}/crashes/{os.environ['CRASH_ID']}",
                headers=headers,
                timeout=30,
            )
            r.raise_for_status()
            crash = r.json()["crash"]
            print(crash["reason"])
            for line in (crash["log"] or {}).get("lines", []):
                print(line["time"], line["text"])
components:
  parameters:
    ProjectId:
      name: id
      in: path
      required: true
      description: >-
        O ID do projeto (26 caracteres). Aparece no painel, no topo do projeto,
        e em `GET /projects`.
      schema:
        type: string
        pattern: ^[0-9A-HJKMNP-TV-Z]{26}$
        example: 01J8Z3W6N0Q4Y7V2K5T9D1H3XA
  schemas:
    CrashDetail:
      allOf:
        - $ref: '#/components/schemas/Crash'
        - type: object
          required:
            - log
          properties:
            log:
              type:
                - object
                - 'null'
              required:
                - lines
                - isTruncated
              properties:
                lines:
                  type: array
                  items:
                    type: object
                    required:
                      - time
                      - stream
                      - text
                    properties:
                      time:
                        type: string
                        format: date-time
                      stream:
                        type: string
                        enum:
                          - stdout
                          - stderr
                      text:
                        type: string
                isTruncated:
                  type: boolean
                  description: Alguma linha ou as mais antigas foram cortadas pelo tamanho.
    Error:
      type: object
      required:
        - status
        - code
        - message
      properties:
        status:
          type: string
          const: error
        code:
          type: string
          description: Código fixo em inglês. Veja [Códigos de erro](/errors).
        message:
          type: string
          description: Texto em português para mostrar a uma pessoa.
      additionalProperties: true
    Crash:
      type: object
      required:
        - id
        - exitedAt
        - startedAt
        - uptimeSeconds
        - exitCode
        - signal
        - isOutOfMemory
        - memoryLimitMb
        - reason
        - outcome
        - consecutiveCrashes
        - restartedAt
        - logStatus
      properties:
        id:
          type: string
          format: uuid
        exitedAt:
          type: string
          format: date-time
          description: Quando o processo saiu.
        startedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: Quando aquela vida do processo tinha subido.
        uptimeSeconds:
          type:
            - integer
            - 'null'
          description: Tempo no ar antes de cair.
        exitCode:
          type: integer
          description: O código de saída (diferente de 0).
        signal:
          type:
            - string
            - 'null'
          description: >-
            Acima de 128, o sinal que encerrou o processo: `SIGKILL` no 137,
            `SIGSEGV` no 139, `SIGTERM` no 143.
        isOutOfMemory:
          type: boolean
          description: Passou da memória reservada do projeto.
        memoryLimitMb:
          type: integer
          description: >-
            A memória que o projeto tinha quando caiu (memória nova só vale
            depois de reiniciar).
        reason:
          type: string
          description: >-
            O motivo em pt-BR: `Sem memória: passou de 512 MB`, `Encerrado pelo
            sinal SIGSEGV (código 139)` ou `Saiu com erro (código 1)`.
        outcome:
          type: string
          enum:
            - restarting
            - crash_loop
            - stopped
          description: >-
            `restarting`: o reinício automático. `crash_loop`: a 5ª queda
            seguida, o projeto parou. `stopped`: sem reinício automático (Free).
        consecutiveCrashes:
          type: integer
          description: Quedas seguidas, contando esta.
        restartedAt:
          type:
            - string
            - 'null'
          format: date-time
          description: Quando o reinício automático pôs o projeto de volta no ar.
        logStatus:
          type: string
          enum:
            - available
            - pending
            - unavailable
          description: >-
            Se o log daquele momento está guardado, sendo guardado ou não deu
            para ler.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Chave de API da Cube (`cube_…`), criada no painel em **Chaves de API**.
        Mande como `Authorization: Bearer cube_…`.

````