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.
Upload a small file (≤ ~4MB, base64)
Section titled “Upload a small file (≤ ~4MB, base64)”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, download URL, delete, rename, move
Section titled “List, download URL, delete, rename, move”// 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.