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

# Get a file

> Retrieve a specific file by ID from the media library

**Access:** an API key with `content:files:read` (or a master above it: `content:files:all`, `content:all`, `admin:all`) reads the published documents; drafts (`aposMode=draft`, or a draft `_id`) need `content:files:write` (or a master above it). A signed-in person may call it as far as their own permissions allow; anyone else gets 404.

**Rate limit:** the key’s own reads-per-minute limit, set when the key is created (default 600); over it, 429 with `Retry-After`.



## OpenAPI

````yaml /api-reference/openapi.yaml get /@apostrophecms/file/{_id}
openapi: 3.1.0
info:
  title: Fetchski Attract CMS API
  description: >-
    Auto-generated OpenAPI spec for this Fetchski site instance. Authenticate
    machine-to-machine requests with an API key by sending the header
    `Authorization: ApiKey <token>`. Keys are issued in the CMS (API Keys) and
    carry scopes that limit them to specific actions. Each key also has its own
    security policy, chosen when it is created: a signing mode (token only,
    signed writes, or every request signed with the key’s signing secret via
    `X-Fetchski-Timestamp` + `X-Fetchski-Signature`), an optional network
    allowlist, and reads/writes-per-minute limits (429 with `Retry-After` over
    them). Some routes require a signature from every key — see each route.
  version: 1.0.0
servers:
  - url: https://{host}/api/v1
    description: 'Your site: set `host` to its host name.'
    variables:
      host:
        default: acme.example
security: []
tags:
  - name: Authentication
    description: >-
      Sign in as a person to get a bearer token or a session cookie.
      Integrations use an API key instead: send `Authorization: ApiKey <token>`.
  - name: SDK Packages
    description: >-
      The site’s own npm registry and Composer repository for the Attract SDKs,
      so an app installs them with one of the site’s API keys. Point npm, pnpm,
      Bun or Composer at them; the SDKs never call them.
  - name: Pages
    description: 'The page tree: each page’s content, place and URL.'
  - name: Global Content
    description: Site-wide content and settings every page shares.
  - name: Redirects
    description: Old URLs and where they now send visitors.
  - name: Internationalization
    description: The site’s locales.
  - name: Languages
    description: >-
      The site’s languages: the main language’s name and every further
      language’s name, code and Public switch. A save applies at once: a new
      language gets its home page and its own addresses (/fr/…), and its pages
      are then translated with each type’s localize routes.
  - name: Page Templates
    description: >-
      The site’s whole-page starting arrangements. They are not pages of the
      site (the Pages list leaves them out for API keys): read one, then make a
      page from it with Pages → create and `_copyingId` (`copyingId` in the
      SDKs).
  - name: Blog Posts
    description: The blog’s posts, and importing them from Markdown or MDX.
  - name: Blog Categories
    description: The categories posts are filed under.
  - name: Authors
    description: The people posts are credited to.
  - name: Team Members
    description: The people the Team section shows.
  - name: Testimonials
    description: Quotes from customers.
  - name: FAQ Items
    description: Questions and their answers.
  - name: FAQ Categories
    description: The groups questions are sorted into.
  - name: Google Reviews
    description: Reviews from the business’s Google profile, synced on a schedule.
  - name: Instagram Posts
    description: Posts from the connected Instagram account, synced on a schedule.
  - name: Service Areas
    description: The places the business serves, for the service map.
  - name: Cookies
    description: The cookies the consent banner declares.
  - name: Media
    description: The Images and Files libraries, and their tags.
  - name: Videos
    description: The Videos library.
  - name: Image Folders
    description: The folders that organize the Images library.
  - name: File Folders
    description: The folders that organize the Files library.
  - name: Video Folders
    description: The folders that organize the Videos library.
  - name: Photo Albums
    description: Hand-picked, ordered sets of photos for galleries.
  - name: Photo Feeds
    description: >-
      Feeds that collect photos from a connected photo source into the Images
      library on a schedule.
  - name: Attachments
    description: Uploading files and cropping images.
  - name: Fetchski Media
    description: >-
      Read-only discovery over the Images and Videos libraries: find what to
      reference in an MDX blog import, or which file to use, with its URLs.
  - name: Forms
    description: The site’s forms and their fields.
  - name: Form Submissions
    description: >-
      What visitors sent through the site’s forms. Submissions hold personal
      details: give a key `forms:read` only where it is needed.
  - name: Conversion Events
    description: >-
      The conversion event log — one record per conversion, with its attribution
      and consent snapshot and its delivery to each ad platform. Read it
      incrementally, post facts from other systems (a reservation purchase, a
      lead outcome), and adjust them (refunds, cancellations). One event ID
      travels everywhere as the platforms’ de-duplication key.
  - name: Visitor Attribution
    description: >-
      Per-visitor attribution on this site: first touch, last ad or campaign
      touch, and the ad platforms’ browser IDs. The join other systems use to
      attach a purchase to the marketing-site journey that led to it.
  - name: Ads Metrics
    description: >-
      Aggregates for dashboards: ad-click landings and conversions, by day,
      platform, campaign and more.
  - name: Conversions
    description: >-
      Conversion definitions — the visitor actions (a lead, a call click, a
      booking, a purchase) this site reports to the ad platforms, each with a
      row per platform. Managed by administrators in the CMS.
  - name: Webhooks
    description: >-
      Push notifications of form submissions and conversion-event changes to the
      site’s Webhook Destinations — signed with each destination’s own secret,
      retried for a day, at-least-once. Set destinations up in the CMS (Webhook
      Destinations, for people granted “Manage webhook destinations”): URL,
      events, optional filters and custom headers, and the signing secret shown
      once.
  - name: Request Log
    description: >-
      The page views the site captured (Connections → Tracking → Request log),
      and the query parameters on them: campaign tags and ad click IDs.
paths:
  /@apostrophecms/file/{_id}:
    get:
      tags:
        - Media
      summary: Get a file
      description: >-
        Retrieve a specific file by ID from the media library


        **Access:** an API key with `content:files:read` (or a master above it:
        `content:files:all`, `content:all`, `admin:all`) reads the published
        documents; drafts (`aposMode=draft`, or a draft `_id`) need
        `content:files:write` (or a master above it). A signed-in person may
        call it as far as their own permissions allow; anyone else gets 404.


        **Rate limit:** the key’s own reads-per-minute limit, set when the key
        is created (default 600); over it, 429 with `Retry-After`.
      operationId: getFile
      parameters:
        - $ref: '#/components/parameters/DocumentId'
        - $ref: '#/components/parameters/AposMode'
        - $ref: '#/components/parameters/AposLocale'
        - $ref: '#/components/parameters/RenderAreas'
      responses:
        '200':
          description: File retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FileObject'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - ApiKeyAuth:
            - content:files:read
        - BearerAuth: []
      x-codeSamples:
        - lang: typescript
          label: TypeScript
          source: >-
            import { createSiteClient } from '@fetchski/attract-cms-sdk';


            const site = createSiteClient();

            const fileObject = await site.media().getFile({ id:
            'ckitdo5oq004pu69kr6oxo6fr:en:published' });
        - lang: php
          label: Laravel
          source: >-
            use Fetchski\AttractCmsLaravel\Facades\Attract;


            $fileObject = Attract::media()->getFile(id:
            'ckitdo5oq004pu69kr6oxo6fr:en:published');
components:
  parameters:
    DocumentId:
      name: _id
      in: path
      required: true
      description: >-
        Computed document ID (can optionally include mode and locale, e.g.,
        id:en:published)
      schema:
        type: string
        pattern: ^\S+$
        example: ckitdo5oq004pu69kr6oxo6fr:en:published
    AposMode:
      name: aposMode
      in: query
      description: >-
        `published` (the default) or `draft`. Drafts need a credential that may
        see them: an API key with the type’s write scope
        (`content:<type>:write`), or a signed-in editor. The public and a key
        with only the read scope get 403.
      required: false
      schema:
        type: string
        enum:
          - draft
          - published
        default: published
      example: published
    AposLocale:
      name: aposLocale
      in: query
      description: >-
        The locale to read or write, e.g. `en` (default: the site’s default
        locale).
      required: false
      schema:
        type: string
        example: fr
    RenderAreas:
      name: render-areas
      in: query
      description: >-
        true: each area’s widgets come back rendered as HTML (`_rendered`),
        beside their data.
      required: false
      schema:
        type: boolean
        default: false
      example: true
  schemas:
    FileObject:
      type: object
      description: >-
        Built-in file piece type for general file uploads (PDFs, documents,
        etc.)
      properties:
        _id:
          type: string
          description: Unique identifier
          example: clx1234567890abcdef
          readOnly: true
        title:
          type:
            - string
            - 'null'
          description: File title/description
          example: Company Brochure
        slug:
          type: string
          example: company-brochure
          description: 'Its URL name: lowercase words joined by hyphens.'
          x-fetchski-write-optional: Left out, it’s made from the title.
        type:
          type: string
          example: '@apostrophecms/file'
          readOnly: true
        archived:
          type:
            - boolean
            - 'null'
          default: false
          description: >-
            In the archive: kept, but out of every list and off the site until
            it is restored. `false` (or null) for a live document.
        visibility:
          type: string
          enum:
            - public
            - loginRequired
          default: public
          description: >-
            Who may see it on the site: `public` (everyone) or `loginRequired`
            (signed-in people only).
        attachment:
          $ref: '#/components/schemas/Attachment'
          description: >-
            The file itself: its URLs (`_urls` by size for an image, `_url` for
            another file), size and dimensions.
        description:
          type:
            - string
            - 'null'
          description: File description
        createdAt:
          type: string
          format: date-time
          readOnly: true
        updatedAt:
          type: string
          format: date-time
          readOnly: true
        copyOfId:
          type:
            - string
            - 'null'
          description: >-
            The `_id` of the piece/page that was copied to create this document
            (only present if created via `_copyingId`)
          example: ckhdscx5900054z9k88uqs16w:en:published
        _folder:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          description: >-
            The media folder holding it (one at most; empty at the library’s
            root).
        _tags:
          type:
            - array
            - 'null'
          items:
            type: object
            additionalProperties: true
          description: Its tags, as documents.
        _url:
          type:
            - string
            - 'null'
          format: uri
          description: The file’s URL (the attachment’s `_url`).
        aposShareKey:
          type:
            - string
            - 'null'
          description: >-
            The draft’s preview share key, while its share link is on: the link
            is the draft’s `_url` with `aposShareKey` and `aposShareId` (the
            draft’s `_id`) in its query. Absent otherwise, and on published
            documents.
          example: k3v9x2m7q1z8w4p6
          readOnly: true
      title: File
      required:
        - _id
        - type
        - createdAt
        - updatedAt
      x-fetchski-always-sent:
        - slug
        - visibility
    Attachment:
      type: object
      description: File attachment information from upload endpoint
      properties:
        _id:
          type: string
          description: Unique attachment identifier
          example: ckj0akbxa003vp39kfbxgb8zg
        _url:
          type: string
          description: >-
            The file’s URL: set for a file that is not an image. An image’s URLs
            are in `_urls`, by size (`original` is the file as uploaded).
          example: >-
            https://example.net/uploads/attachments/ckj0akbxa003vp39kfbxgb8zg-blue-box.png
        _urls:
          type: object
          description: >-
            An image’s URLs by size (`original`, `max`, `full`, `two-thirds`,
            `one-half`, `one-third`, `one-sixth`); unset for other files.
          additionalProperties:
            type: string
        name:
          type: string
          description: Slugified filename
          example: blue-box
        title:
          type: string
          description: Sortified filename
          example: blue box
        extension:
          type: string
          description: File extension
          example: png
        type:
          type: string
          example: attachment
          description: Always `attachment`.
        group:
          type: string
          description: File group type
          example: images
        length:
          type: integer
          description: File size in bytes
          example: 10497
        md5:
          type: string
          description: MD5 checksum
          example: 630eeaaecd0bdc07c4a82eeca4c07588
        width:
          type: integer
          description: Image width in pixels (images only)
          example: 600
        height:
          type: integer
          description: Image height in pixels (images only)
          example: 106
        landscape:
          type: boolean
          description: Whether image is landscape orientation (images only)
        portrait:
          type: boolean
          description: Whether image is portrait orientation (images only)
        docIds:
          type: array
          items:
            type: string
          description: IDs of documents using this attachment
        archivedDocIds:
          type: array
          items:
            type: string
          description: IDs of archived documents using this attachment
        createdAt:
          type: string
          format: date-time
          description: When it was uploaded (ISO 8601).
        updatedAt:
          type: string
          format: date-time
          description: When it last changed (ISO 8601).
        _isCroppable:
          type: boolean
          description: Whether the image can be cropped.
        crop:
          type:
            - object
            - 'null'
          additionalProperties: true
          description: The crop applied, if any (`top`, `left`, `width`, `height`).
        used:
          type: boolean
          description: Whether any document uses the file.
        folderId:
          type:
            - string
            - 'null'
          description: The media folder holding the file, by its `aposDocId`.
        folderPath:
          type: string
          description: That folder’s path, e.g. `events/summer`.
      title: Attachment
      x-fetchski-always-sent:
        - _id
        - name
        - title
        - extension
        - type
        - group
        - length
        - md5
        - docIds
        - archivedDocIds
        - createdAt
    ApiError:
      type: object
      description: >-
        An error answer: the error’s name, a message saying what is wrong, and
        details by error.
      required:
        - name
      properties:
        name:
          type: string
          description: >-
            The error’s name: `invalid`, `required`, `unauthorized`,
            `forbidden`, `notfound`, `conflict`, `locked`, `tooManyRequests`,
            `error` (a server failure)…
        message:
          type: string
          description: What is wrong, and how to fix it.
        data:
          type: object
          additionalProperties: true
          description: >-
            Details, by error: `errors` (one entry per field problem, each with
            its `path`), `retryAfter` (seconds, on 429), `permission`…
  responses:
    BadRequest:
      description: 'The request is not valid: `message` says what to change.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Unauthorized:
      description: The credential is missing or not accepted.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    Forbidden:
      description: The caller may not do this.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    NotFound:
      description: Nothing matches, or the caller may not see it.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
    InternalServerError:
      description: 'The site failed: `message` is the generic “An error occurred.”'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiError'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Paste your API key as the CMS showed it: `fsk_<site>_<key id>_<secret>`
        (issued under API Keys). `ApiKey ` in front of it works too. Leave it
        empty to read as the public.
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        A person’s bearer token, from **Signing in (people)** → `POST
        /@apostrophecms/login/login`. Apps use an API key instead.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.