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

# Get an app

> Returns the full record for one hostname: the last snapshot's status,
title, text, artifact URLs, email addresses, and credential findings.

Hosts marked dead answer 404 even though they were once indexed. The
`credentials` array is present whenever there are findings.




## OpenAPI

````yaml /openapi.yaml get /v1/apps/{hostname}
openapi: 3.1.0
info:
  title: Periphery API
  version: 1.0.0
  summary: Search Periphery's index of publicly reachable web apps as JSON.
  description: |
    The API returns the same search results and app records as the console.
    Every request needs an API key issued on the console's account page,
    sent as `Authorization: Bearer <key>` or `X-API-Key: <key>`. API access
    is part of the Plus and Pro plans. Searches are unlimited; requests are
    limited to one per second per account.
  contact:
    name: Periphery
    email: contact@gglabs.fr
    url: https://docs.periphery.exposed
servers:
  - url: https://api.periphery.exposed
    description: Production
security:
  - bearerAuth: []
  - apiKeyHeader: []
tags:
  - name: Search
    description: Run a query and page through the hits.
  - name: Apps
    description: Read one app's full record.
paths:
  /v1/apps/{hostname}:
    get:
      tags:
        - Apps
      summary: Get an app
      description: |
        Returns the full record for one hostname: the last snapshot's status,
        title, text, artifact URLs, email addresses, and credential findings.

        Hosts marked dead answer 404 even though they were once indexed. The
        `credentials` array is present whenever there are findings.
      operationId: getApp
      parameters:
        - name: hostname
          in: path
          required: true
          description: The app's hostname, exactly as returned by search.
          schema:
            type: string
          example: acme-dashboard.vercel.app
      responses:
        '200':
          description: The app record.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/App'
              examples:
                withFindings:
                  summary: With credential findings
                  value:
                    hostname: acme-dashboard.vercel.app
                    title: Acme dashboard
                    status: 200
                    provider: vercel
                    lastSeen: '2026-09-20T14:03:11Z'
                    faviconHash: -247388890
                    faviconUrl: >-
                      https://periphery-enrich.s3.gra.io.cloud.ovh.net/acme-dashboard.vercel.app/favicon.ico
                    screenshotUrl: >-
                      https://periphery-enrich.s3.gra.io.cloud.ovh.net/acme-dashboard.vercel.app/screenshot.png
                    htmlUrl: >-
                      https://periphery-enrich.s3.gra.io.cloud.ovh.net/acme-dashboard.vercel.app/index.html
                    text: >-
                      Acme dashboard Sign in Forgot your password? Contact
                      ops@acme.com
                    hasVerifiedCreds: true
                    emailCount: 1
                    verifiedDetectors:
                      - Stripe
                    emails:
                      - ops@acme.com
                    credentials:
                      - detector: Stripe
                        verified: true
                        raw: sk_live_EXAMPLE00000000000000000
                noFindings:
                  summary: No credential findings
                  value:
                    hostname: acme-com-staging.vercel.app
                    title: Acme (staging)
                    status: 401
                    provider: vercel
                    lastSeen: '2026-09-19T08:41:02Z'
                    faviconHash: -247388890
                    faviconUrl: >-
                      https://periphery-enrich.s3.gra.io.cloud.ovh.net/acme-com-staging.vercel.app/favicon.ico
                    screenshotUrl: >-
                      https://periphery-enrich.s3.gra.io.cloud.ovh.net/acme-com-staging.vercel.app/screenshot.png
                    htmlUrl: >-
                      https://periphery-enrich.s3.gra.io.cloud.ovh.net/acme-com-staging.vercel.app/index.html
                    text: Acme staging Sign in
                    hasVerifiedCreds: false
                    emailCount: 0
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '502':
          $ref: '#/components/responses/BackendError'
components:
  schemas:
    App:
      type: object
      required:
        - hostname
        - hasVerifiedCreds
        - emailCount
      properties:
        hostname:
          type: string
          description: The app's hostname, its stable identifier.
        title:
          type: string
          description: Page title at the last snapshot. Omitted when the page had none.
        status:
          type: integer
          description: HTTP status at the last snapshot. Omitted when unknown.
        provider:
          type: string
          description: Provider slug, as listed on the providers page.
        lastSeen:
          type: string
          format: date-time
          description: >-
            Time of the last visit that found the host alive, RFC 3339 in UTC.
            Usually the last snapshot; a fallback probe refreshes it without
            replacing the snapshot's artifacts. Omitted when the app has never
            been visited.
        faviconHash:
          type: integer
          format: int32
          description: Shodan-compatible favicon hash. Omitted when no favicon was fetched.
        faviconUrl:
          type: string
          format: uri
          description: URL of the stored favicon. Omitted when none was fetched.
        screenshotUrl:
          type: string
          format: uri
          description: URL of the stored screenshot. Omitted when the render failed.
        htmlUrl:
          type: string
          format: uri
          description: URL of the stored page source. Omitted when the render failed.
        text:
          type: string
          description: >-
            Visible text extracted at the last snapshot, truncated for long
            pages. Omitted when empty.
        hasVerifiedCreds:
          type: boolean
          description: True when at least one credential finding was verified.
        emailCount:
          type: integer
          description: Number of addresses in `emails`.
        verifiedDetectors:
          type: array
          items:
            type: string
          description: Names of the detectors with a verified finding. Omitted when none.
        emails:
          type: array
          items:
            type: string
          description: Email addresses found on the page. Omitted when none.
        credentials:
          type: array
          items:
            $ref: '#/components/schemas/Credential'
          description: >-
            Every credential finding, verified or not. Omitted when there are no
            findings.
    Credential:
      type: object
      required:
        - detector
        - verified
        - raw
      properties:
        detector:
          type: string
          description: Name of the detector that matched.
        verified:
          type: boolean
          description: >-
            True when the scanner confirmed the credential with its issuer at
            snapshot time.
        raw:
          type: string
          description: The credential string as found in the page source.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Human-readable reason.
  responses:
    Unauthorized:
      description: Missing or unknown API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missing:
              summary: No key header
              value:
                error: missing API key
            invalid:
              summary: Unknown or rotated key
              value:
                error: invalid API key
    Forbidden:
      description: The account is on the Free plan, which has no API access.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: API access requires the Plus or Pro plan
    NotFound:
      description: No live app has that hostname. Hosts marked dead answer this too.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: app not found
    RateLimited:
      description: More than one request per second from this key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: 'rate limit: 1 request per second'
    BackendError:
      description: The search backend did not answer in time. Retry after a moment.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: search backend error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer <key>`. Used when both headers are present.'
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: The same key in an `X-API-Key` header.

````