Guides
List, view, and delete your files
Learn how to list, view, and delete files in your datasets.
EasyRAG provides endpoints to:
/v1/filesGet all files in a dataset.
bashcurl https://api.easyrag.com/v1/files?datasetId=my-dataset \ -H "Authorization: Bearer YOUR_API_KEY"
javascriptconst response = await fetch( 'https://api.easyrag.com/v1/files?datasetId=my-dataset', { headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { files } = await response.json(); console.log(`Found ${files.length} files`);
json{ "success": true, "files": [ { "fileId": "f7a3b2c1-4d5e-6f7g", "originalName": "manual.pdf", "datasetId": "my-dataset", "customerId": "user_abc123", "size": 245678, "mimeType": "application/pdf", "created": "2024-12-12T10:30:00.000Z", "extension": ".pdf", "extraMeta": { "department": "support", "version": "2.0" } } ] }
javascriptimport { useState, useEffect } from 'react'; function FileList({ datasetId, apiKey }) { const [files, setFiles] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function loadFiles() { try { const response = await fetch( `https://api.easyrag.com/v1/files?datasetId=${datasetId}`, { headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { files } = await response.json(); setFiles(files); } catch (error) { console.error('Failed to load files:', error); } finally { setLoading(false); } } loadFiles(); }, [datasetId, apiKey]); if (loading) return <div>Loading...</div>; return ( <div> <h2>Files ({files.length})</h2> <ul> {files.map(file => ( <li key={file.fileId}> {file.originalName} <small> ({(file.size / 1024).toFixed(1)} KB)</small> </li> ))} </ul> </div> ); }
/v1/files/:fileIdGet details about a specific file, including a signed download URL.
bashcurl https://api.easyrag.com/v1/files/f7a3b2c1-4d5e?datasetId=my-dataset \ -H "Authorization: Bearer YOUR_API_KEY"
javascriptconst response = await fetch( `https://api.easyrag.com/v1/files/${fileId}?datasetId=my-dataset`, { headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { file } = await response.json(); console.log('File:', file.originalName); console.log('Download:', file.permanentUrl);
json{ "success": true, "file": { "fileId": "f7a3b2c1-4d5e-6f7g", "originalName": "manual.pdf", "datasetId": "my-dataset", "size": 245678, "mimeType": "application/pdf", "created": "2024-12-12T10:30:00.000Z", "permanentUrl": "https://storage.googleapis.com/bucket/path?Expires=2491..." } }
The permanentUrl is a signed URL valid until 2491:
javascript// Download file window.open(file.permanentUrl, '_blank'); // Or fetch it const blob = await fetch(file.permanentUrl).then(r => r.blob());
javascriptfunction FilePreview({ fileId, datasetId, apiKey }) { const [file, setFile] = useState(null); useEffect(() => { async function loadFile() { const response = await fetch( `https://api.easyrag.com/v1/files/${fileId}?datasetId=${datasetId}`, { headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { file } = await response.json(); setFile(file); } loadFile(); }, [fileId]); if (!file) return <div>Loading...</div>; return ( <div> <h3>{file.originalName}</h3> <p>Size: {(file.size / 1024).toFixed(1)} KB</p> <p>Uploaded: {new Date(file.created).toLocaleDateString()}</p> <a href={file.permanentUrl} target="_blank" rel="noopener noreferrer" > Download File </a> {/* Preview PDF in iframe */} {file.mimeType === 'application/pdf' && ( <iframe src={file.permanentUrl} style={{ width: '100%', height: '600px' }} title={file.originalName} /> )} </div> ); }
/v1/files/:fileIdDelete a specific file. This removes:
bashcurl -X DELETE \ "https://api.easyrag.com/v1/files/f7a3b2c1-4d5e?datasetId=my-dataset" \ -H "Authorization: Bearer YOUR_API_KEY"
javascriptconst response = await fetch( `https://api.easyrag.com/v1/files/${fileId}?datasetId=my-dataset`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${apiKey}` } } ); if (response.ok) { console.log('File deleted successfully'); }
json{ "success": true }
javascriptfunction DeleteButton({ fileId, datasetId, apiKey, onDelete }) { const [deleting, setDeleting] = useState(false); const handleDelete = async () => { if (!confirm('Delete this file permanently?')) return; setDeleting(true); try { const response = await fetch( `https://api.easyrag.com/v1/files/${fileId}?datasetId=${datasetId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${apiKey}` } } ); if (response.ok) { onDelete?.(fileId); } else { alert('Failed to delete file'); } } catch (error) { console.error('Delete failed:', error); alert('Network error'); } finally { setDeleting(false); } }; return ( <button onClick={handleDelete} disabled={deleting} style={{ background: '#ef4444', color: 'white', padding: '8px 16px', border: 'none', borderRadius: '4px', cursor: deleting ? 'wait' : 'pointer' }} > {deleting ? 'Deleting...' : 'Delete'} </button> ); }
/v1/datasets/:datasetId/filesDelete all files in a specific dataset.
⚠️ Warning: This is irreversible!
bashcurl -X DELETE \ https://api.easyrag.com/v1/datasets/my-dataset/files \ -H "Authorization: Bearer YOUR_API_KEY"
javascriptconst response = await fetch( `https://api.easyrag.com/v1/datasets/${datasetId}/files`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { deleted } = await response.json(); console.log(`Deleted ${deleted} files`);
json{ "success": true, "deleted": 15 }
javascriptfunction ClearDatasetButton({ datasetId, apiKey, onClear }) { const [clearing, setClearing] = useState(false); const handleClear = async () => { const confirmed = confirm( 'Delete ALL files in this dataset? This cannot be undone!' ); if (!confirmed) return; setClearing(true); try { const response = await fetch( `https://api.easyrag.com/v1/datasets/${datasetId}/files`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { deleted } = await response.json(); alert(`Deleted ${deleted} files`); onClear?.(); } catch (error) { console.error('Clear failed:', error); alert('Failed to clear dataset'); } finally { setClearing(false); } }; return ( <button onClick={handleClear} disabled={clearing} style={{ background: '#dc2626', color: 'white', padding: '10px 20px', border: 'none', borderRadius: '4px', fontWeight: 'bold' }} > {clearing ? 'Clearing...' : 'Clear Entire Dataset'} </button> ); }
/v1/filesDelete all files across all datasets for the authenticated customer.
⚠️ Warning: This is a complete wipe and cannot be undone!
Note: Only API keys can use this endpoint (not frontend tokens).
bashcurl -X DELETE https://api.easyrag.com/v1/files \ -H "Authorization: Bearer YOUR_API_KEY"
javascriptconst response = await fetch('https://api.easyrag.com/v1/files', { method: 'DELETE', headers: { 'Authorization': `Bearer ${apiKey}` } }); const { deleted } = await response.json(); console.log(`Deleted ${deleted} files total`);
json{ "success": true, "deleted": 127 }
Here's a full file management interface:
javascriptimport { useState, useEffect } from 'react'; function FileManager({ datasetId, apiKey }) { const [files, setFiles] = useState([]); const [loading, setLoading] = useState(true); const [selectedFile, setSelectedFile] = useState(null); useEffect(() => { loadFiles(); }, [datasetId]); const loadFiles = async () => { setLoading(true); try { const response = await fetch( `https://api.easyrag.com/v1/files?datasetId=${datasetId}`, { headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { files } = await response.json(); setFiles(files); } catch (error) { console.error('Failed to load files:', error); } finally { setLoading(false); } }; const deleteFile = async (fileId) => { if (!confirm('Delete this file?')) return; try { const response = await fetch( `https://api.easyrag.com/v1/files/${fileId}?datasetId=${datasetId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${apiKey}` } } ); if (response.ok) { setFiles(files.filter(f => f.fileId !== fileId)); if (selectedFile?.fileId === fileId) { setSelectedFile(null); } } } catch (error) { alert('Failed to delete file'); } }; const viewFile = async (fileId) => { try { const response = await fetch( `https://api.easyrag.com/v1/files/${fileId}?datasetId=${datasetId}`, { headers: { 'Authorization': `Bearer ${apiKey}` } } ); const { file } = await response.json(); setSelectedFile(file); } catch (error) { console.error('Failed to load file:', error); } }; if (loading) { return <div>Loading files...</div>; } return ( <div style={{ display: 'flex', gap: '20px' }}> {/* File List */} <div style={{ flex: 1 }}> <h2>Files ({files.length})</h2> {files.length === 0 ? ( <p>No files uploaded yet</p> ) : ( <ul style={{ listStyle: 'none', padding: 0 }}> {files.map(file => ( <li key={file.fileId} style={{ padding: '12px', border: '1px solid #ddd', marginBottom: '8px', borderRadius: '4px', cursor: 'pointer', background: selectedFile?.fileId === file.fileId ? '#e3f2fd' : 'white' }} onClick={() => viewFile(file.fileId)} > <div style={{ fontWeight: 'bold' }}> {file.originalName} </div> <div style={{ fontSize: '12px', color: '#666' }}> {(file.size / 1024).toFixed(1)} KB •{' '} {new Date(file.created).toLocaleDateString()} </div> <button onClick={(e) => { e.stopPropagation(); deleteFile(file.fileId); }} style={{ marginTop: '8px', background: '#ef4444', color: 'white', border: 'none', padding: '4px 8px', borderRadius: '4px', cursor: 'pointer' }} > Delete </button> </li> ))} </ul> )} </div> {/* File Preview */} <div style={{ flex: 1 }}> {selectedFile ? ( <div> <h2>{selectedFile.originalName}</h2> <p> <strong>Size:</strong> {(selectedFile.size / 1024).toFixed(1)} KB </p> <p> <strong>Type:</strong> {selectedFile.mimeType} </p> <p> <strong>Uploaded:</strong>{' '} {new Date(selectedFile.created).toLocaleString()} </p> <a href={selectedFile.permanentUrl} target="_blank" rel="noopener noreferrer" style={{ display: 'inline-block', padding: '10px 20px', background: '#4f46e5', color: 'white', textDecoration: 'none', borderRadius: '4px', marginTop: '10px' }} > Download File </a> {selectedFile.mimeType === 'application/pdf' && ( <iframe src={selectedFile.permanentUrl} style={{ width: '100%', height: '600px', marginTop: '20px', border: '1px solid #ddd' }} title={selectedFile.originalName} /> )} </div> ) : ( <p>Select a file to view details</p> )} </div> </div> ); } export default FileManager;
When deleting multiple files (e.g., clearing a dataset):
Frontend tokens can only:
javascript// ✅ Good - Ask for confirmation if (confirm('Delete this file permanently?')) { await deleteFile(fileId); } // ❌ Bad - No confirmation await deleteFile(fileId);
javascriptconst [deleting, setDeleting] = useState(false); const handleDelete = async () => { setDeleting(true); try { await deleteFile(fileId); } finally { setDeleting(false); } };
javascriptconst handleDelete = async (fileId) => { await deleteFile(fileId); // Remove from UI setFiles(files.filter(f => f.fileId !== fileId)); };
javascripttry { await deleteFile(fileId); } catch (error) { if (error.status === 404) { alert('File not found'); } else if (error.status === 403) { alert('Permission denied'); } else { alert('Failed to delete file'); } }
Problem: File doesn't exist
Solutions:
fileId is correctdatasetIdProblem: Token doesn't have access
Solutions:
Problem: Delete request succeeds but file still appears
Solutions:
File management operations are free:
Note: Credits spent on uploads are not refunded when files are deleted.