The SDK automatically selects storage providers based on endorsement status, availability, and metadata matching. Understanding provider selection helps you optimize uploads and troubleshoot issues.
const result = await synapse.storage.upload(data, { providerIds: [123n, 456n],})// Uses providers 123 and 456 exactly// First in list becomes primary// No retries on failure (explicit = user's choice)
With explicit providerIds, the SDK disables automatic retries. If these providers fail, the upload fails.
// Find your existing data setsconst dataSets = await synapse.storage.findDataSets()for (const ds of dataSets) { console.log(`Dataset ${ds.dataSetId}: Provider ${ds.providerId}`)}// Use specific data setsconst result = await synapse.storage.upload(data, { dataSetIds: [dataSets[0].dataSetId, dataSets[1].dataSetId],})// Pieces added to these existing data sets// More efficient - batches pieces into same dataset
const result = await synapse.storage.upload(data, { count: 2, excludeProviderIds: [999n, 888n],})// Auto-selects providers, but never uses 999 or 888// Useful for excluding problematic providers
// Upload multiple files to the same providersconst metadata = { project: 'website', env: 'production' }const file1 = await synapse.storage.upload(data1, { metadata })const file2 = await synapse.storage.upload(data2, { metadata })const file3 = await synapse.storage.upload(data3, { metadata })// All three files go to the same providers (metadata match)// Efficient - pieces grouped into same data sets
const result = await synapse.storage.upload(data, { withCDN: true,})// Equivalent to:const result = await synapse.storage.upload(data, { metadata: { withCDN: '' },})// Enables FilBeam CDN for this data set
The withCDN key in metadata has an empty string value by convention. The contract only checks for key presence.
1. Fetch provider lists: - Endorsed providers from contract - Approved providers from contract2. Fetch client's data sets (for metadata matching)3. Select primary (endorsed): - Filter endorsed providers by metadata match (if applicable) - Exclude any providers in excludeProviderIds - Random select from remaining4. Select secondaries (approved): - Filter approved providers - Exclude primary - Exclude any in excludeProviderIds - Filter by metadata match (if applicable) - Random select remaining slots5. For each selected provider: - Find existing data set with matching metadata - If found: reuse that data set - If not: new data set will be created on commit
const projectMetadata = { project: 'app', env: 'prod' }await synapse.storage.upload(config, { metadata: projectMetadata })await synapse.storage.upload(assets, { metadata: projectMetadata })// Both go to the same providers and data sets
Let the SDK choose providers
Unless you have specific requirements, let the SDK auto-select:
// Good (auto-select with retries)await synapse.storage.upload(data, { count: 2 })// Only if needed (no retries, no fallback)await synapse.storage.upload(data, { providerIds: [123n, 456n] })