Skip to content

Account, quota and limits

GET/api/v1/account

Access
API key
Permission
account:read

Your profile, quota and limits

Example request

curl "https://lac.pics/api/v1/account" \
  -H "Authorization: Bearer lac_api_YOUR_KEY"

Responses

  • 200Successobject
    • userUser
      User 16 fields
      • idstring

        The file or note id.

      • usernamestring
      • namestring
      • palettestring
      • biostring

        up to 600 characters

      • copyLinkboolean
      • privateByDefaultboolean
      • unlistedPreviewsboolean

        Link previews (Telegram, Discord…) of unlisted files show the image or video. Public files always do; private, password-protected and one-time files never do.

      • previewAuthorboolean

        Link previews show the author's name and @username. Off: cards carry no author (the share page itself still does after opening).

      • captureHotkeystring
      • avatarUrlstringor null
      • avatarRevisioninteger

        0–2,147,483,647

      • storageUsedinteger · int64
      • quotaBytesinteger · int64

        Bytes; the apps show them in binary units (1 GB = 1024³ bytes).

      • createdAtstring · date-time

        When it was created.

      • planobjector null

        GET /account only: the plan in force by name, for the apps; null — the free plan. Rights are in entitlements.

        4 fields
        • codestringrequired

          The one-time code from the address back into the app.

        • nameobjectrequired
          2 fields
          • rustringrequired
          • enstringrequired
        • trialbooleanrequired

          The plan’s free trial.

        • untilstring · date-timerequired
    • limitsobject
      10 fields
      • requestsPerMinuteinteger
      • maxUploadBytesinteger

        Largest file of any type (older clients use only this).

      • maxImageBytesinteger

        Largest image one upload may be now: the plan’s limit (10 MB on the free plan by default), or serverImageBytes when the plan has none.

      • maxVideoBytesinteger

        Largest video one upload may be now: the plan’s limit (100 MB on the free plan by default), or serverVideoBytes when the plan has none.

      • planImageBytesintegeror null

        The plan’s own limit for one image; null: the plan has none (Pro) — only the storage quota and serverImageBytes bound a file.

      • planVideoBytesintegeror null

        The plan’s own limit for one video; null: the plan has none (Pro) — only the storage quota and serverVideoBytes bound a file.

      • serverImageBytesinteger

        The server’s ceiling for one image of any account (64 MB): pictures are decoded whole in memory. Above it: 413 IMAGE_TOO_LARGE with params.ceiling = server.

      • serverVideoBytesinteger · int64

        The server’s ceiling for one video of any account (4 GB): one stored object is written in a single request, which S3-compatible storage takes up to 5 GB. Above it: 413 VIDEO_TOO_LARGE with params.ceiling = server.

      • uploadsAtOnceinteger

        Simultaneous POST /uploads of this account; more get 429.

      • videoobject

        Videos stored as they are: one version per video, compressed by the client. Anything else gets 415 VIDEO_NOT_SUITABLE (params.problems); the site and the Windows app compress it first.

        7 fields
        • formatsarray of objectrequired
          4 fields
          • containerstringrequired

            values: "mp4" "webm"

          • videostringrequired

            ffprobe codec_name.

          • audiostringrequired

            ffprobe codec_name.

          • pixelFormatsarray of stringrequired
        • maxLongSideintegerrequired
        • maxShortSideintegerrequired
        • maxFpsnumberrequired
        • maxSecondsintegerrequired
        • maxAudioStreamsintegerrequired
        • bitrateobjectrequired

          Average bitrate ceiling, bits/s: bitsPerPixel × width × height × min(fps, fpsCap), within min and max.

          4 fields
          • bitsPerPixelnumberrequired
          • fpsCapnumberrequired
          • minintegerrequired
          • maxintegerrequired
    • entitlementsEntitlements

      The rights of the plan in force. The free plan is no active subscription: planUntil null, the service limits and no features. A plan never grants less than the free plan; when it ends, its rights stop at once and existing files and link settings stay.

      Entitlements 8 fields
      • planUntilstring · date-timerequiredor null

        End of the plan in force; null: the free plan.

      • imageBytesintegerrequired

        Largest image one upload may be now (limits.maxImageBytes).

      • videoBytesintegerrequired

        Largest video one upload may be now (limits.maxVideoBytes).

      • planImageBytesintegeror null

        The plan’s own limit for one image; null: none.

      • planVideoBytesintegeror null

        The plan’s own limit for one video; null: none.

      • quotaBytesinteger · int64requiredor null
      • featuresarray of stringrequired

        link_expiry: PATCH /content/{id} expiresAt; view_limit: viewLimit; view_stats: GET /content/{id}/views; no_branding: unused (embeds carry no lacuna badge on any plan). A missing feature answers 403 PLAN_FEATURE_REQUIRED with params.feature.

        values: "link_expiry" "view_limit" "view_stats" "no_branding"

        unique

      • trialBillingTrialrequiredor null

        The plan’s free trial: the same object as in GET /api/billing/subscription; null when no plan offers a trial and none was taken.

        BillingTrial 10 fields
        • statestringrequired

          available: can start now; active: running; ended: ended as a trial and no plan since; used: taken before (continued by a payment, or another plan since); unavailable: never taken but not possible (reason).

          values: "available" "active" "ended" "used" "unavailable"

        • planCodestringrequired

          The plan offered or taken.

        • planNameBillingNamerequired
          BillingName 2 fields
          • rustringrequired
          • enstringrequired
        • daysintegerrequired

          How many recent days to return.

          1–30

        • planQuotabooleanrequired

          The trial gives the plan’s storage; false: the free quota stays.

        • startsAtstring · date-timerequiredor null
        • endsAtstring · date-timerequiredor null
        • daysLeftintegerrequiredor null

          Active only.

          at least 1

        • reasonstringrequiredor null

          unavailable only: subscribed — the account had a subscription; limit — a trial was recently taken from this address or network.

          values: "subscribed" "limit"

        • noticestringrequiredor null

          ending: 2 days or less are left; ended: ended within the last 14 days. The cabinet shows these as notices.

          values: "ending" "ended"

    • credentialApiCredential

      Present with a Bearer API key only: the key itself — scopes, expiry and, for a key of the browser connection, its client and computer.

      ApiCredential 6 fields
      • idstringrequired

        The file or note id.

      • namestringrequired

        Keys of a connection are named «lacuna для Windows · {deviceName}».

        length 1–100

      • scopesarray of stringrequired

        values: "content:read" "content:write" "content:delete" "account:read"

        1–4 items · unique

      • expiresAtstring · date-timerequired

        After this moment every request answers 401 API_KEY_EXPIRED; connect again. A connection key lives 365 days and renews itself within 30 days of its end (POST /device-auth/renew).

      • clientstringrequiredor null

        App of a key issued by a connection; null for keys made in the key form.

        values: "windows"

      • deviceNamestringrequiredor null

        Null for keys made in the key form.

        length 1–128

  • 400Invalid input
  • 401Authentication required. A Bearer key answers API_KEY_EXPIRED after its expiry and API_KEY_REVOKED once revoked (in the key list, the console or by a new connection of the same device); API_KEY_INVALID for an unknown key; ACCOUNT_BANNED and ACCOUNT_ACCESS_CHANGED for the account.
  • 403Insufficient scope
  • 404Content unavailable
  • 409Media processing, upload idempotency or paste revision conflict
  • 410Previously uploaded content was deleted or expired
  • 413Size or quota limit
  • 429Rate limit, or the account already uses all its upload slots
  • 503Upload or password verification capacity reached

Example response

200 · application/json
{
  "user": {
    "id": "cmf8a1x2k0000q7lh3v9w2e4d",
    "username": "alex",
    "name": "Alex",
    "palette": "original",
    "bio": "",
    "copyLink": true,
    "privateByDefault": false,
    "unlistedPreviews": true,
    "previewAuthor": true,
    "captureHotkey": "PrintScreen",
    "avatarUrl": null,
    "avatarRevision": 0,
    "storageUsed": 734003200,
    "quotaBytes": 2684354560,
    "createdAt": "2026-09-27T09:30:00.000Z",
    "plan": null
  },
  "limits": {
    "requestsPerMinute": 60,
    "maxUploadBytes": 104857600,
    "maxImageBytes": 10485760,
    "maxVideoBytes": 104857600,
    "planImageBytes": 10485760,
    "planVideoBytes": 104857600,
    "serverImageBytes": 67108864,
    "serverVideoBytes": 4294967296,
    "uploadsAtOnce": 2,
    "video": {
      "formats": [
        {
          "container": "mp4",
          "video": "string",
          "audio": "string",
          "pixelFormats": [
            "string"
          ]
        }
      ],
      "maxLongSide": 1,
      "maxShortSide": 1,
      "maxFps": 1,
      "maxSeconds": 1,
      "maxAudioStreams": 1,
      "bitrate": {
        "bitsPerPixel": 1,
        "fpsCap": 1,
        "min": 1,
        "max": 1
      }
    }
  },
  "entitlements": {
    "planUntil": null,
    "imageBytes": 10485760,
    "videoBytes": 104857600,
    "planImageBytes": 10485760,
    "planVideoBytes": 104857600,
    "quotaBytes": 2684354560,
    "features": [],
    "trial": null
  },
  "credential": {
    "id": "cmf8a1x2k0001q7lh5b2n8r6t",
    "name": "Upload script",
    "scopes": [
      "content:write"
    ],
    "expiresAt": "2026-12-26T09:30:00.000Z",
    "client": null,
    "deviceName": null
  }
}

Error codes

Answers of any method with a key (an invalid or expired key, a missing permission, too many requests) are in Errors.

Account, quota and limits: GET /api/v1/account · lacuna API