Skip to content
Pinner.xyz

Error Reference

Every API error response includes a reason field for programmatic handling. This page lists every code the API can return, when it happens, what to do about it, and whether it's safe to retry.

CLI users see friendly messages instead of raw codes; the CLI error table maps them.

Error response format

{
  "error": {
    "reason": "UNAUTHORIZED",
    "details": "Access denied. Please check your credentials and try again."
  }
}
FieldTypeDescription
reasonstringError code for programmatic handling
detailsstringHuman-readable description

Authentication (401 / 403)

CodeHTTPWhen it happensWhat to doRetry?
UNAUTHORIZED401API key is invalid, expired, or revokedRun pinner auth to re-authenticate. Check PINNER_AUTH_TOKEN env var.No
PERMISSION_DENIED403You don't have access to this resourceCheck your plan limits. Contact support if you think this is wrong.No

Upload

CodeHTTPWhen it happensWhat to doRetry?
UnsupportedFormat422File format isn't supportedUse a supported format (ZIP or CAR).No
CorruptedFile500File is corruptedRe-export or re-download the file and retry.No
EmptyZIP500ZIP archive has no filesAdd content to the ZIP and retry.No
PasswordProtected500File is password-protectedRemove password protection and retry.No
FileUploadFailed500Upload failed mid-transferCheck network and retry with backoff.Yes
FILE_UPLOAD_API_FAILED500Upload failed due to an internal errorRetry with backoff. If it persists, check status.pinner.xyz.Yes
FILE_PROCESSING_FAILED500Server couldn't process the fileCheck file integrity. Retry with backoff.Yes
UPLOAD_NOT_FOUND404Upload ID doesn't existCheck the upload ID. It may have expired or been deleted.No
BLOCK_NOT_FOUND404Requested block doesn't existThe content may not be fully pinned yet. Wait and retry.Yes
CID_PARSE_FAILED400CID format is invalidCheck the CID string for typos or encoding issues.No

Pin

CodeHTTPWhen it happensWhat to doRetry?
PIN_FETCH_FAILED500Couldn't retrieve pin infoRetry with backoff. If it persists, the pin may not exist.Yes
INVALID_CID422CID format is invalid or unsupportedVerify the CID. See CIDs.No
INVALID_TARGET422Target hash or peer ID is invalidCheck the target value.No

Quota (429)

CodeHTTPWhen it happensWhat to doRetry?
UPLOAD_QUOTA_EXCEEDED429Too many uploads in a periodWait and retry. Reduce upload frequency or upgrade your plan.Yes (after cooldown)
STORAGE_QUOTA_EXCEEDED429Storage limit reachedDelete unused pins or upgrade your plan.No
DOWNLOAD_QUOTA_EXCEEDED429Too many downloads in a periodWait and retry. Reduce download frequency or upgrade your plan.Yes (after cooldown)

Website

CodeHTTPWhen it happensWhat to doRetry?
WEBSITE_NOT_FOUND404Website doesn't existCheck the website ID. See Websites.No
INVALID_WEBSITE_STATUS500Website status value isn't validCheck the status you're setting.No
INVALID_TARGET_TYPE500Target type isn't validMust be ipfs or ipns.No
INVALID_TIMESTAMP500Timestamp format is invalidUse ISO 8601 / RFC 3339 format.No

SSL

CodeHTTPWhen it happensWhat to doRetry?
INVALID_SSL_STATUS500SSL status value isn't validCheck the status you're setting.No
SSL_STATUS_UPDATE_FAILED500Couldn't update SSL statusCheck domain ownership. Retry with backoff.Yes

DNS

CodeHTTPWhen it happensWhat to doRetry?
INVALID_DOMAIN400Domain name is invalidCheck domain format. Must be a valid FQDN.No
INVALID_DOMAIN_FORMAT400Domain format isn't supportedUse a standard domain format.No
INVALID_ZONE_STATUS500DNS zone status is invalidCheck the status value.No
ZONE_NOT_FOUND404DNS zone doesn't existCreate the zone first. See DNS and Domains.No
RECORD_NOT_FOUND404DNS record doesn't existCheck the record ID.No
INVALID_RECORD_TYPE500DNS record type isn't supportedUse a supported record type (A, AAAA, CNAME, TXT, MX, NS).No
DUPLICATE_RECORD409DNS record already existsUse the existing record or delete it first.No
DELETE_FAILED500Couldn't delete DNS zoneRetry with backoff.Yes
UPDATE_FAILED500Couldn't update DNS zoneRetry with backoff.Yes
VALIDATION_FAILED500DNS validation failedCheck nameserver configuration. Retry after fixing.Yes

Validation

CodeHTTPWhen it happensWhat to doRetry?
INVALID_REQUEST422Request parameter is invalidCheck the API docs for required parameters.No
INVALID_IDENTIFIER422ID format is invalidCheck the identifier format.No
INVALID_UUID_FORMAT400UUID format is invalidUse standard UUID format (e.g. 550e8400-e29b-41d4-a716-446655440000).No
METADATA_FETCH_FAILED500Couldn't fetch metadataRetry with backoff.Yes

CLI error messages

The CLI translates API and SDK errors into friendly messages. If you see one of these, here's what it means:

CLI messageCauseWhat to do
not authenticatedNo API key configuredRun pinner auth
path is requiredNo file path givenProvide a file path argument
CID is requiredNo CID argument givenProvide a CID argument
invalid CIDCID format is wrongCheck the CID string
no CIDs providedEmpty CID listProvide at least one CID
file not foundFile doesn't exist locallyCheck the file path
directory not foundDirectory doesn't exist locallyCheck the directory path
permission deniedCan't read the fileCheck file permissions
pin not foundPin doesn't exist on PinnerCheck the CID; it may not be pinned
pinning failedPin operation failed on the serverRetry. If it persists, check status.pinner.xyz
upload failedUpload didn't completeCheck the error details. Retry with backoff.
upload interruptedYou pressed Ctrl+C or the network droppedThe CLI supports resuming; just retry the same command
network timeoutServer didn't respond in timeCheck your connection. Retry with backoff.
connection failedCan't reach Pinner serversCheck your internet connection and firewall
configuration not foundNo config fileRun pinner setup
configuration invalidConfig file is malformedRun pinner setup --reset
service unavailableServer is temporarily downRetry after a few minutes. Check status.pinner.xyz

Retry strategy

Some errors are safe to retry. Use exponential backoff: start at 1 second, double each attempt:

  • Always retry: 429 (quota exceeded: wait for cooldown), 500 (server error: temporary)
  • Never retry: 400, 401, 403, 404, 409, 410, 422 (client error: you must fix the request)
import { isRetryable } from "@lumeweb/pinner";
 
async function uploadWithRetry(file, maxRetries = 3) {
  let lastError;
 
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await pinner.upload(file);
    } catch (error) {
      lastError = error;
 
      if (!isRetryable(error)) {
        throw error;
      }
 
      await new Promise(r => setTimeout(r, 1000 * attempt));
    }
  }
 
  throw lastError;
}