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

# Storage ID (raw file)

> Downloads a raw file by its storage ID and bucket. The file text (first 8 MB) comes back in JSON, or as a `text/plain` attachment with `?format=txt`.



## OpenAPI

````yaml /openapi.json post /api/v1/search/storage-id
openapi: 3.1.0
info:
  title: Find.ly API
  version: 1.0.0
  description: >-
    Search leak and OSINT data from your own code with the same five modules,
    quota and limits as the Find.ly dashboard. API access comes with the
    Professional and Enterprise plans.


    Every search is `POST /api/v1/search/{module}`, where `{module}` is one of
    `intelligence-search`, `phonebook`, `identity-portal`, `system-id`,
    `storage-id`. Each module has its own reference page below because each
    takes a different body.
servers:
  - url: https://findly.icu
    description: Production
security:
  - bearerAuth: []
  - apiKeyHeader: []
tags:
  - name: Account
    description: 'Plan and quota. Free: never billed.'
  - name: Search
    description: One request per served search.
paths:
  /api/v1/search/storage-id:
    post:
      tags:
        - Search
      summary: Storage ID (raw file)
      description: >-
        Downloads a raw file by its storage ID and bucket. The file text (first
        8 MB) comes back in JSON, or as a `text/plain` attachment with
        `?format=txt`.
      operationId: search_storage_id
      parameters:
        - name: format
          in: query
          required: false
          description: >-
            `json` (default) or `txt`. Same search, same price, different
            output.
          schema:
            type: string
            enum:
              - json
              - txt
            default: json
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StorageIdRequest'
            examples:
              request:
                value:
                  storage_id: >-
                    a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1
                  bucket: leaks.private.general
      responses:
        '200':
          description: >-
            Search served (billed). JSON by default; with `?format=txt`, the
            file itself as a `text/plain` attachment, with `X-File-Truncated`
            and `X-File-Total-Bytes`.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
            X-Quota-Limit:
              $ref: '#/components/headers/XQuotaLimit'
            X-Quota-Remaining:
              $ref: '#/components/headers/XQuotaRemaining'
            X-Quota-Reset:
              $ref: '#/components/headers/XQuotaReset'
            Content-Disposition:
              $ref: '#/components/headers/ContentDisposition'
            X-File-Truncated:
              $ref: '#/components/headers/XFileTruncated'
            X-File-Total-Bytes:
              $ref: '#/components/headers/XFileTotalBytes'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StorageIdResponse'
              examples:
                results:
                  value:
                    module: storage-id
                    storage_id: >-
                      a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1
                    bucket: leaks.private.general
                    file:
                      name: >-
                        storage-a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1.txt
                      bytes: 54
                      lines: 2
                      truncated: false
                      total_bytes: 54
                      text: |
                        john.doe@example.com:hunter2
                        jane@example.com:letmein
                    billed: true
                    usage:
                      plan: Professional
                      plan_expires_at: '2026-10-16T12:00:00.000Z'
                      daily_quota: 500
                      used: 13
                      remaining: 487
                      resets_at: '2026-09-17T00:00:00.000Z'
                empty:
                  value:
                    module: storage-id
                    storage_id: >-
                      a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1
                    bucket: leaks.private.general
                    file: null
                    billed: true
                    usage:
                      plan: Professional
                      plan_expires_at: '2026-10-16T12:00:00.000Z'
                      daily_quota: 500
                      used: 13
                      remaining: 487
                      resets_at: '2026-09-17T00:00:00.000Z'
            text/plain:
              schema:
                type: string
              examples:
                text:
                  value: |
                    john.doe@example.com:hunter2
                    jane@example.com:letmein
        '204':
          description: >-
            Only with `?format=txt`: the search succeeded but returned nothing.
            No body; `X-Request-Billed` says whether it was billed.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
            X-Quota-Limit:
              $ref: '#/components/headers/XQuotaLimit'
            X-Quota-Remaining:
              $ref: '#/components/headers/XQuotaRemaining'
            X-Quota-Reset:
              $ref: '#/components/headers/XQuotaReset'
        '400':
          description: Bad request. `api_key_in_url`, `unsupported_format`, `invalid_json`.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                api_key_in_url:
                  value:
                    error:
                      code: api_key_in_url
                      message: >-
                        Send your API key in the Authorization header, never in
                        the URL. If it was logged somewhere, regenerate it from
                        your dashboard.
                    billed: false
                unsupported_format:
                  value:
                    error:
                      code: unsupported_format
                      message: >-
                        format must be json or txt for Storage ID. No request
                        was used.
                    billed: false
                invalid_json:
                  value:
                    error:
                      code: invalid_json
                      message: >-
                        Send a JSON object in the request body, with
                        Content-Type: application/json.
                    billed: false
        '401':
          description: Missing or invalid API key. `missing_api_key`, `invalid_api_key`.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
            WWW-Authenticate:
              $ref: '#/components/headers/WWWAuthenticate'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                missing_api_key:
                  value:
                    error:
                      code: missing_api_key
                      message: >-
                        Send your API key in the Authorization header:
                        "Authorization: Bearer fly_live_…".
                    billed: false
                invalid_api_key:
                  value:
                    error:
                      code: invalid_api_key
                      message: >-
                        This API key is not valid. Copy it again from the API
                        page of your dashboard.
                    billed: false
        '403':
          description: '`account_suspended` or `plan_required`.'
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
            X-Quota-Limit:
              $ref: '#/components/headers/XQuotaLimit'
            X-Quota-Remaining:
              $ref: '#/components/headers/XQuotaRemaining'
            X-Quota-Reset:
              $ref: '#/components/headers/XQuotaReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                account_suspended:
                  value:
                    error:
                      code: account_suspended
                      message: >-
                        This account is suspended. If you think this is a
                        mistake, contact us.
                    billed: false
                plan_required:
                  value:
                    error:
                      code: plan_required
                      message: >-
                        Your Starter plan doesn’t include API access. It comes
                        with the Professional and Enterprise plans.
                      plan: Starter
                    billed: false
                    usage:
                      plan: Starter
                      plan_expires_at: '2026-10-16T12:00:00.000Z'
                      daily_quota: 100
                      used: 0
                      remaining: 100
                      resets_at: '2026-09-17T00:00:00.000Z'
        '413':
          description: Request body over 16 KB. `body_too_large`.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                body_too_large:
                  value:
                    error:
                      code: body_too_large
                      message: The request body must be 16 KB or less.
                    billed: false
        '422':
          description: >-
            Invalid input, not billed. `invalid_input` with one message per
            field in `error.fields`.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                invalid_input:
                  value:
                    error:
                      code: invalid_input
                      message: Some fields are invalid. No request was used.
                      fields:
                        bucket: Choose one of the listed buckets.
                    billed: false
        '429':
          description: >-
            `too_many_requests` (per IP), `quota_exceeded` (daily quota; carries
            `usage`), `rate_limited` (per account; `reason` is `concurrent` or
            `per-minute`). Always sends `Retry-After`.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
            X-Quota-Limit:
              $ref: '#/components/headers/XQuotaLimit'
            X-Quota-Remaining:
              $ref: '#/components/headers/XQuotaRemaining'
            X-Quota-Reset:
              $ref: '#/components/headers/XQuotaReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                too_many_requests:
                  value:
                    error:
                      code: too_many_requests
                      message: >-
                        Too many API calls from this address. Slow down and try
                        again.
                    billed: false
                quota_exceeded:
                  value:
                    error:
                      code: quota_exceeded
                      message: >-
                        You’ve used all of today’s requests. Your quota resets
                        at 02:00 Paris time.
                    billed: false
                    usage:
                      plan: Professional
                      plan_expires_at: '2026-10-16T12:00:00.000Z'
                      daily_quota: 500
                      used: 500
                      remaining: 0
                      resets_at: '2026-09-17T00:00:00.000Z'
                rate_limited_concurrent:
                  value:
                    error:
                      code: rate_limited
                      message: >-
                        Two searches are already running on this account. Try
                        again when one finishes.
                      reason: concurrent
                    billed: false
                rate_limited_per_minute:
                  value:
                    error:
                      code: rate_limited
                      message: Too many searches in the last minute. Try again shortly.
                      reason: per-minute
                    billed: false
        '500':
          description: Unexpected server error. `internal_error`. No request was used.
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                internal_error:
                  value:
                    error:
                      code: internal_error
                      message: Something went wrong on our side. No request was used.
                    billed: false
        '502':
          description: >-
            The search service failed. `upstream_error`. The request is refunded
            (`billed: false`).
          headers:
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            X-Request-Billed:
              $ref: '#/components/headers/XRequestBilled'
            X-Quota-Limit:
              $ref: '#/components/headers/XQuotaLimit'
            X-Quota-Remaining:
              $ref: '#/components/headers/XQuotaRemaining'
            X-Quota-Reset:
              $ref: '#/components/headers/XQuotaReset'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                upstream_error:
                  value:
                    error:
                      code: upstream_error
                      message: >-
                        Search is unavailable on our side right now. It’s not
                        your plan or your quota.
                      upstream_status: null
                    billed: false
                    usage:
                      plan: Professional
                      plan_expires_at: '2026-10-16T12:00:00.000Z'
                      daily_quota: 500
                      used: 13
                      remaining: 487
                      resets_at: '2026-09-17T00:00:00.000Z'
components:
  schemas:
    StorageIdRequest:
      type: object
      required:
        - storage_id
        - bucket
      additionalProperties: false
      properties:
        storage_id:
          type: string
          maxLength: 1000
          description: >-
            128 or 129 hexadecimal characters. Whitespace and line breaks are
            removed first; 1,000 characters max as sent.
        bucket:
          type: string
          enum:
            - leaks.private.general
            - leaks.private
            - leaks.logs
            - leaks.public
            - documents.public
            - web.public
            - pastes
            - darknet
            - dns
            - whois
            - usenet
            - dumpster
          description: Exact bucket value.
    StorageIdResponse:
      type: object
      required:
        - module
        - storage_id
        - bucket
        - file
        - billed
        - usage
      properties:
        module:
          type: string
          const: storage-id
        storage_id:
          type: string
        bucket:
          type: string
          enum:
            - leaks.private.general
            - leaks.private
            - leaks.logs
            - leaks.public
            - documents.public
            - web.public
            - pastes
            - darknet
            - dns
            - whois
            - usenet
            - dumpster
        file:
          oneOf:
            - $ref: '#/components/schemas/File'
            - type: 'null'
          description: '`null` when the file is empty or was not found.'
        billed:
          type: boolean
        usage:
          $ref: '#/components/schemas/Usage'
    ErrorResponse:
      type: object
      required:
        - error
        - billed
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              $ref: '#/components/schemas/ErrorCode'
            message:
              type: string
              description: >-
                Human-readable. It can change: branch on `code`, not on
                `message`.
            fields:
              type: object
              additionalProperties:
                type: string
              description: '`invalid_input` only. One message per invalid or unknown field.'
            plan:
              type: string
              description: '`plan_required` only. The current plan.'
            required_plan:
              type: string
              description: '`module_locked` only. Cheapest plan that includes the module.'
            reason:
              type: string
              enum:
                - concurrent
                - per-minute
              description: '`rate_limited` only. Which account limit was hit.'
            upstream_status:
              type:
                - integer
                - 'null'
              description: >-
                `upstream_error` only. HTTP status returned by the search
                service when it sent one (400 or above), otherwise `null`.
        billed:
          type: boolean
          description: Errors are never billed.
        usage:
          $ref: '#/components/schemas/Usage'
    File:
      type: object
      required:
        - name
        - bytes
        - lines
        - truncated
        - total_bytes
        - text
      properties:
        name:
          type: string
          description: Suggested file name, `[A-Za-z0-9._-]` only.
        bytes:
          type: integer
          description: UTF-8 size of `text`.
        lines:
          type: integer
          description: Line count of `text`.
        truncated:
          type: boolean
          description: '`true` if `text` is only the beginning of the file (8 MB cap).'
        total_bytes:
          type:
            - integer
            - 'null'
          description: >-
            Size of the whole file, or `null` if it was over 16 MB and could not
            be measured.
        text:
          type: string
          description: File content, decoded as UTF-8.
    Usage:
      type: object
      description: Quota of the account, after the call.
      required:
        - plan
        - plan_expires_at
        - daily_quota
        - used
        - remaining
        - resets_at
      properties:
        plan:
          type: string
          enum:
            - Free
            - Starter
            - Professional
            - Enterprise
        plan_expires_at:
          type:
            - string
            - 'null'
          format: date-time
          description: End of the paid plan. `null` on Free.
        daily_quota:
          type: integer
          description: 'Requests per day: 500 on Professional, 1,500 on Enterprise.'
        used:
          type: integer
          description: Requests used today, dashboard and API combined.
        remaining:
          type: integer
          description: Requests left today.
        resets_at:
          type: string
          format: date-time
          description: Next reset, 02:00 Europe/Paris.
    ErrorCode:
      type: string
      description: >-
        Stable, machine-readable error code:


        - `api_key_in_url`: 400 — an API key was sent in the query string
        (`key`, `api_key`, `apikey`, `token` or `access_token`).

        - `invalid_json`: 400 — the body is missing, is not valid UTF-8 JSON, or
        is not a JSON object.

        - `unsupported_format`: 400 — `format` is not `json`, or `txt` was asked
        for a module that has no text output.

        - `missing_api_key`: 401 — neither `Authorization` nor `X-API-Key` was
        sent.

        - `invalid_api_key`: 401 — the key is malformed, unknown, regenerated,
        or belongs to a deleted account.

        - `account_suspended`: 403 — the account that owns the key is suspended.

        - `plan_required`: 403 — the account plan does not include API access
        (Professional and Enterprise only).

        - `module_locked`: 403 — the account plan does not include this module.

        - `unknown_module`: 404 — `{module}` is not one of the five module
        slugs.

        - `not_found`: 404 — no API endpoint at this path.

        - `body_too_large`: 413 — the request body is over 16 KB.

        - `invalid_input`: 422 — a field is unknown, has the wrong type, or has
        an invalid value. See `error.fields`.

        - `too_many_requests`: 429 — more than 60 API calls in one minute from
        the same IP address.

        - `quota_exceeded`: 429 — the account has used all of today's requests.

        - `rate_limited`: 429 — two searches already running, or 20 searches in
        the last minute, on this account.

        - `internal_error`: 500 — unexpected server error. No request was used.

        - `upstream_error`: 502 — the search service failed, timed out, or sent
        an unreadable or oversized response. The request is refunded.
      enum:
        - api_key_in_url
        - invalid_json
        - unsupported_format
        - missing_api_key
        - invalid_api_key
        - account_suspended
        - plan_required
        - module_locked
        - unknown_module
        - not_found
        - body_too_large
        - invalid_input
        - too_many_requests
        - quota_exceeded
        - rate_limited
        - internal_error
        - upstream_error
  headers:
    CacheControl:
      description: Always `no-store`.
      schema:
        type: string
        const: no-store
    XRequestBilled:
      description: >-
        `true` if this call used one request from the daily quota, otherwise
        `false`.
      schema:
        type: string
        enum:
          - 'true'
          - 'false'
    XQuotaLimit:
      description: >-
        Daily quota of the plan. Sent whenever the account quota is known (not
        on authentication or IP-limit errors).
      schema:
        type: string
        examples:
          - '500'
    XQuotaRemaining:
      description: Requests left today, after this call.
      schema:
        type: string
        examples:
          - '487'
    XQuotaReset:
      description: ISO 8601 time of the next reset (02:00 Europe/Paris).
      schema:
        type: string
        format: date-time
    ContentDisposition:
      description: >-
        `attachment; filename="…"`. The file name only contains `A-Z a-z 0-9 . _
        -`.
      schema:
        type: string
    XFileTruncated:
      description: '`true` if the file is longer than what was delivered (8 MB cap).'
      schema:
        type: string
        enum:
          - 'true'
          - 'false'
    XFileTotalBytes:
      description: >-
        Size of the whole file in bytes, or `unknown` when the file was too
        large to measure (over 16 MB).
      schema:
        type: string
    WWWAuthenticate:
      description: >-
        `Bearer realm="Find.ly API"`, with `error="invalid_token"` for
        `invalid_api_key`.
      schema:
        type: string
    RetryAfter:
      description: Seconds to wait before retrying (at least 1).
      schema:
        type: string
        examples:
          - '3'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        `Authorization: Bearer fly_live_…`. Takes precedence when both headers
        are sent.
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        `X-API-Key: fly_live_…`. Used only when no `Authorization` header is
        sent.

````