---
title: "Read the log of an app"
method: GET
path: "/apps/{id}/logs"
tags: ["Apps"]
---

# Read the log of an app

`GET /apps/{id}/logs`

## Request

- Base URL: `https://api.hypamoon.com/api/v1`
- URL: `https://api.hypamoon.com/api/v1/apps/{id}/logs`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://app.hypamoon.com/oauth/authorize`, token URL `https://api.hypamoon.com/oauth/token`, scopes: `sites:read`)

The newest requests, errors, scheduled runs, outbound calls and sign-in attempts of the last 7 days, newest first. Headers, cookies, query strings and bodies are never logged; in paths, parts that look like an email address, a long number or a token are replaced by :x. A sign-in attempt (kind sign_in) says why it failed as a fixed reason, with the address masked; never the code or a token. New lines can take up to a minute to appear.

## Path parameters

- `id` string, uuid, required

## Query parameters

- `limit` integer
- `errors_only` boolean
- `kind` 'request' | 'error' | 'scheduled' | 'outbound' | 'webhook' | 'retry' | 'dead_letter' | 'sign_in'

## Response `200`

The log.

- object
  - `data` object[], required
    - `at` string, required
    - `kind` 'request' | 'error' | 'scheduled' | 'outbound' | 'webhook' | 'retry' | 'dead_letter' | 'sign_in', required: webhook: a queued request delivered to the app. retry: an attempt failed and another is planned. dead_letter: given up after 6 attempts. sign_in: a sign-in attempt by a user of the app (see sign_in).
    - `method` string, required
    - `path` string, required: The path without query, with parts that look like an email address, a long number or a token replaced by :x. For outbound: the host.
    - `status` integer, required
    - `duration_ms` integer, required
    - `message` string, required: For an error: a short message without personal data or keys. For sign_in: why the attempt failed or what happened, in a sentence.
    - `sign_in` object: Only for kind sign_in. The code and the token are never logged.
      - `outcome` 'signed_in' | 'email_sent' | 'pending' | 'rejected', required
      - `reason` string, required: A fixed code: signed_in, email_sent, wrong_code, code_expired, link_expired, already_used, duplicate_request, approved_elsewhere, newer_code_requested, other_browser, too_many_attempts, no_code, rate_limited, rate_limited_address, rate_limited_app, bot_check_failed, not_invited, blocked, pending_approval, request_rejected, invite_link_invalid, invalid_email, invalid_link, wrong_app, cross_site, passkey_invalid, passkey_expired, passkey_unknown, oauth_failed, email_not_sent or unavailable.
      - `method` string, required: link (asking for or opening a sign-in email), code, passkey, or oauth (Google or Apple).
      - `email` string, required: The address, masked: "s***@example.com". Empty when unknown.
      - `region` string, required: The two-letter country of the visitor, or empty.
      - `ip_hash` string, required: A short hash of the IP address that only matches within the same app on the same day. Never the address itself.

## Other responses

- `400`: Bad Request: invalid_parameter.
- `401`: Unauthorized: unauthorized, missing_api_key, invalid_api_key, api_key_revoked, project_deleted.
- `403`: Forbidden: project_not_enabled, key_mode_mismatch, missing_scope, verification_required.
- `404`: Not Found: not_found.
- `429`: Too Many Requests: rate_limited.
- `500`: Internal Server Error: internal_error.
- `503`: Service Unavailable: service_unavailable.

---

[API](https://skmtc.dev/hypamoon/apis/hypamoon-api.md) · [All operations](https://skmtc.dev/hypamoon/apis/hypamoon-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hypamoon/apis/hypamoon-api/revisions/9f0b90004c06?raw)
