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
200Success
objectuserUserUser16 fieldsidstringThe file or note id.
usernamestringnamestringpalettestringbiostringup to 600 characters
copyLinkbooleanprivateByDefaultbooleanunlistedPreviewsbooleanLink previews (Telegram, Discord…) of unlisted files show the image or video. Public files always do; private, password-protected and one-time files never do.
previewAuthorbooleanLink previews show the author's name and @username. Off: cards carry no author (the share page itself still does after opening).
captureHotkeystringavatarUrlstringor nullavatarRevisioninteger0–2,147,483,647
storageUsedinteger · int64quotaBytesinteger · int64Bytes; the apps show them in binary units (1 GB = 1024³ bytes).
createdAtstring · date-timeWhen it was created.
planobjector nullGET /account only: the plan in force by name, for the apps; null — the free plan. Rights are in entitlements.
4 fields
codestringrequiredThe one-time code from the address back into the app.
nameobjectrequired2 fields
rustringrequiredenstringrequired
trialbooleanrequiredThe plan’s free trial.
untilstring · date-timerequired
limitsobject10 fields
requestsPerMinuteintegermaxUploadBytesintegerLargest file of any type (older clients use only this).
maxImageBytesintegerLargest 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.
maxVideoBytesintegerLargest 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 nullThe plan’s own limit for one image; null: the plan has none (Pro) — only the storage quota and serverImageBytes bound a file.
planVideoBytesintegeror nullThe plan’s own limit for one video; null: the plan has none (Pro) — only the storage quota and serverVideoBytes bound a file.
serverImageBytesintegerThe 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 · int64The 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.
uploadsAtOnceintegerSimultaneous POST /uploads of this account; more get 429.
videoobjectVideos 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 objectrequired4 fields
containerstringrequiredvalues:
"mp4""webm"videostringrequiredffprobe codec_name.
audiostringrequiredffprobe codec_name.
pixelFormatsarray of stringrequired
maxLongSideintegerrequiredmaxShortSideintegerrequiredmaxFpsnumberrequiredmaxSecondsintegerrequiredmaxAudioStreamsintegerrequiredbitrateobjectrequiredAverage bitrate ceiling, bits/s: bitsPerPixel × width × height × min(fps, fpsCap), within min and max.
4 fields
bitsPerPixelnumberrequiredfpsCapnumberrequiredminintegerrequiredmaxintegerrequired
entitlementsEntitlementsThe 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.
Entitlements8 fieldsplanUntilstring · date-timerequiredor nullEnd of the plan in force; null: the free plan.
imageBytesintegerrequiredLargest image one upload may be now (limits.maxImageBytes).
videoBytesintegerrequiredLargest video one upload may be now (limits.maxVideoBytes).
planImageBytesintegeror nullThe plan’s own limit for one image; null: none.
planVideoBytesintegeror nullThe plan’s own limit for one video; null: none.
quotaBytesinteger · int64requiredor nullfeaturesarray of stringrequiredlink_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 nullThe plan’s free trial: the same object as in GET /api/billing/subscription; null when no plan offers a trial and none was taken.
BillingTrial10 fieldsstatestringrequiredavailable: 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"planCodestringrequiredThe plan offered or taken.
planNameBillingNamerequiredBillingName2 fieldsrustringrequiredenstringrequired
daysintegerrequiredHow many recent days to return.
1–30
planQuotabooleanrequiredThe trial gives the plan’s storage; false: the free quota stays.
startsAtstring · date-timerequiredor nullendsAtstring · date-timerequiredor nulldaysLeftintegerrequiredor nullActive only.
at least 1
reasonstringrequiredor nullunavailable only: subscribed — the account had a subscription; limit — a trial was recently taken from this address or network.
values:
"subscribed""limit"noticestringrequiredor nullending: 2 days or less are left; ended: ended within the last 14 days. The cabinet shows these as notices.
values:
"ending""ended"
credentialApiCredentialPresent with a Bearer API key only: the key itself — scopes, expiry and, for a key of the browser connection, its client and computer.
ApiCredential6 fieldsidstringrequiredThe file or note id.
namestringrequiredKeys of a connection are named «lacuna для Windows · {deviceName}».
length 1–100
scopesarray of stringrequiredvalues:
"content:read""content:write""content:delete""account:read"1–4 items · unique
expiresAtstring · date-timerequiredAfter 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 nullApp of a key issued by a connection; null for keys made in the key form.
values:
"windows"deviceNamestringrequiredor nullNull 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
{
"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.