Skip to content

Apex quick reference

Working snippets for every Apex entry point, in the order you are most likely to need them. Per-method behaviour is in Method notes.

Sliick.FilesApi.UploadFileRequest req = new Sliick.FilesApi.UploadFileRequest();
req.recordId    = accountId;
req.fileName    = 'invoice-2026-06.pdf';
req.contentType = 'application/pdf';
req.bodyBase64  = EncodingUtil.base64Encode(pdfBlob);   // raw base64, no data: prefix

List<Sliick.FilesApi.UploadFileResult> results =
  Sliick.FilesApi.uploadFiles(new List<Sliick.FilesApi.UploadFileRequest>{ req });

if (results[0].success) {
  String fileId = results[0].file.fileId;
} else if (results[0].errorCode == Sliick.FilesApi.ERROR_FILE_TOO_LARGE) {
  // use the presigned pair or relocateFiles instead
}

Upload a large file (presigned, external storage)

Section titled “Upload a large file (presigned, external storage)”
// 1) Mint a presigned PUT URL
Sliick.FilesApi.UploadUrlRequest u = new Sliick.FilesApi.UploadUrlRequest();
u.recordId    = accountId;
u.fileName    = 'site-survey-4k.mp4';
u.contentType = 'video/mp4';

Sliick.FilesApi.UploadUrlResult url =
  Sliick.FilesApi.requestUploadUrls(new List<Sliick.FilesApi.UploadUrlRequest>{ u })[0];
// url.uploadUrl + url.requiredHeaders -> client PUTs the bytes directly to storage
// url.uploadKey -> pass to confirm

// 2) Confirm after the client PUT completes (creates the file record)
Sliick.FilesApi.ConfirmUploadRequest c = new Sliick.FilesApi.ConfirmUploadRequest();
c.uploadKey = url.uploadKey;

Sliick.FilesApi.UploadFileResult confirmed =
  Sliick.FilesApi.confirmUploads(new List<Sliick.FilesApi.ConfirmUploadRequest>{ c })[0];
// confirmed.file.processingStatus == 'Pending' for images until thumbnails finish

Relocate an existing Salesforce file to external storage (async, no size cap)

Section titled “Relocate an existing Salesforce file to external storage (async, no size cap)”
Sliick.FilesApi.RelocateFileRequest req = new Sliick.FilesApi.RelocateFileRequest();
req.fileId   = contentDocumentId;   // 069... existing Salesforce file
req.recordId = accountId;
// req.deleteSourceAfterRelocate = true;  // optional; default keeps the SF source

Sliick.FilesApi.RelocateFileResult res =
  Sliick.FilesApi.relocateFiles(new List<Sliick.FilesApi.RelocateFileRequest>{ req })[0];

if (res.success) {
  String handle = res.fileId;   // durable, permanent fileId; status == 'Uploading'
} else if (res.errorCode == Sliick.FilesApi.ERROR_STREAMING_NOT_ENABLED) {
  // org not entitled for streaming
}

// Poll for completion (callout-free)
Sliick.FilesApi.RelocationStatusRequest s = new Sliick.FilesApi.RelocationStatusRequest();
s.handle = handle;
Sliick.FilesApi.RelocationStatusResult st =
  Sliick.FilesApi.getRelocationStatus(new List<Sliick.FilesApi.RelocationStatusRequest>{ s })[0];
// st.status: 'Uploading' | 'Complete' | 'Failed'
// LIST - active provider only by default, createdDate DESC, max 200 per record
Sliick.FilesApi.ListFilesRequest lr = new Sliick.FilesApi.ListFilesRequest();
lr.recordId = accountId;
List<Sliick.FilesApi.FileInfo> files =
  Sliick.FilesApi.listFiles(new List<Sliick.FilesApi.ListFilesRequest>{ lr })[0].files;

// DOWNLOAD URL - short-lived; fetch just before use, do not store
Sliick.FilesApi.DownloadUrlRequest dr = new Sliick.FilesApi.DownloadUrlRequest();
dr.fileId = fileId;
String downloadUrl =
  Sliick.FilesApi.getDownloadUrls(new List<Sliick.FilesApi.DownloadUrlRequest>{ dr })[0].downloadUrl;

// DELETE - detach from this record; on the last link the external bytes are deleted
// first, and a failure there returns ERROR_EXTERNAL_DELETE_FAILED with nothing changed
Sliick.FilesApi.DeleteFileRequest del = new Sliick.FilesApi.DeleteFileRequest();
del.fileId   = fileId;
del.recordId = accountId;      // both required
Sliick.FilesApi.deleteFiles(new List<Sliick.FilesApi.DeleteFileRequest>{ del });

// RENAME - display name only; extension stripped; storage paths unchanged
Sliick.FilesApi.RenameFileRequest rn = new Sliick.FilesApi.RenameFileRequest();
rn.fileId  = fileId;
rn.newName = 'Signed Contract - Acme';
Sliick.FilesApi.renameFiles(new List<Sliick.FilesApi.RenameFileRequest>{ rn });

// MOVE - repoint attachment to another record. On SharePoint the file physically
// moves too, which makes this a callout - move before DML, or go async.
Sliick.FilesApi.MoveFileRequest mv = new Sliick.FilesApi.MoveFileRequest();
mv.fileId         = fileId;
mv.sourceRecordId = caseId;
mv.targetRecordId = accountId;
Sliick.FilesApi.moveFiles(new List<Sliick.FilesApi.MoveFileRequest>{ mv });

Soft dependency (System.Callable - no compile-time dependency)

Section titled “Soft dependency (System.Callable - no compile-time dependency)”
Type apiType = Type.forName('Sliick', 'FilesApi');
if (apiType == null) { return; }   // Sliick Files not installed
Callable filesApi = (Callable) apiType.newInstance();

// Feature-detect (no custom permission required for this call)
Map<String, Object> caps = (Map<String, Object>) filesApi.call('getCapabilities', null);
// caps => { 'actions' => List<String>, 'revision' => Integer }

List<Object> results = (List<Object>) filesApi.call('uploadFiles',
  new Map<String, Object>{
    'requests' => new List<Object>{
      new Map<String, Object>{
        'recordId'    => accountId,
        'fileName'    => 'contract.pdf',
        'contentType' => 'application/pdf',
        'bodyBase64'  => body
      }
    }
  });
Map<String, Object> first = (Map<String, Object>) results[0];
if ((Boolean) first.get('success')) {
  String fileId = (String) ((Map<String, Object>) first.get('file')).get('fileId');
}

call() returns loosely-typed Map/List only - no package DTO types. Datetimes render as ISO-8601 strings.

Check relocation readiness (Callable only)

Section titled “Check relocation readiness (Callable only)”

A sibling package that depends on relocateFiles - for example a settings toggle that only makes sense once large-file relocation will actually work - can check readiness up front instead of discovering a decline at runtime:

// No custom permission required for this call, same as getCapabilities
List<Object> readiness =
  (List<Object>) filesApi.call('getStorageReadiness', null);
Map<String, Object> r = (Map<String, Object>) readiness[0];
// r => { success, providerConnected, multipartCapable,
//        serverStreamingEnabled, relocateReady }

if (!(Boolean) r.get('relocateReady')) {
  // surface a clear setup message instead of enabling a feature
  // that will silently decline the first time it relocates a file
}

getStorageReadiness is Callable-only - there is no typed Apex method or Flow action for it, since it exists specifically for callers that cannot reference the package’s internal types.