Quick Start Guide
This walks through creating a vault from a template, adding a stream, and uploading a file to it.
Prerequisites
- A Filedgr account
- An API key and secret — see API Keys
export FILEDGR_API=https://api.filedgr.network
export FILEDGR_API_KEY=<your-key>
export FILEDGR_API_SECRET=<your-secret>
All examples below assume these headers:
-H "x-api-key: $FILEDGR_API_KEY" -H "x-api-secret: $FILEDGR_API_SECRET"
1. Pick a template
curl "$FILEDGR_API/templates?public=true&page=1&page_size=10" \
-H "x-api-key: $FILEDGR_API_KEY" -H "x-api-secret: $FILEDGR_API_SECRET"
Supports search_term, sort_by and sort_type. Remember that an empty result is a
204, not an empty page.
2. Create a vault
curl -X POST "$FILEDGR_API/vaults" \
-H "x-api-key: $FILEDGR_API_KEY" -H "x-api-secret: $FILEDGR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"template_id": "<template-uuid>",
"name": "Delivery 2026-08-26",
"description": "Batch shipment record",
"ledger": "XRPL"
}'
Vault creation is asynchronous and consumes credits — a 402 means you are out. Poll
GET /vaults/{vault_id} and watch status and progress until it reaches
FILEDGR_VAULT_COMPLETED.
3. Add a stream
Streams are created within a vault, because the vault is what pays for them:
curl -X POST "$FILEDGR_API/vaults/<vault-uuid>/streams" \
-H "x-api-key: $FILEDGR_API_KEY" -H "x-api-secret: $FILEDGR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{"mapping": "sensor-data", "description": "Temperature readings", "required": true}'
There is no POST /streams. Templates with required_streams create their streams automatically
when the vault is built.
4. Upload a data attachment
Create the attachment to receive presigned upload URLs:
curl -X POST "$FILEDGR_API/attachments" \
-H "x-api-key: $FILEDGR_API_KEY" -H "x-api-secret: $FILEDGR_API_SECRET" \
-H "Content-Type: application/json" \
-d '{
"name": "readings.csv",
"description": "Morning batch",
"stream_id": "<stream-uuid>",
"ledger": "XRPL",
"filename": "readings.csv",
"estimated_size": 20480
}'
name, stream_id, ledger and estimated_size are required, and estimated_size must be
greater than zero. When filename is given it must end in a 2–4 letter extension.
The key holder needs an Ethereum wallet credential on their account, or this returns 422
MissingWalletCredentialError — the wallet is what the file is notarised against.
The response carries presigned_urls, a list of {part, link} objects. What you do next depends
on the size, and the threshold is 150 MB.
Attachments of 150 MB or less
You get a single entry with part: 1. PUT the whole file to its link and you are done —
ingestion starts automatically from the storage event.
curl -X PUT "<link-from-presigned_urls>" --upload-file readings.csv
Do not call PUT /attachments/{id} for a single-part upload. No multipart upload exists to
finalise, and the call will fail.
Attachments over 150 MB
The file is split into 150 MB parts, one entry per part. Upload each part to its link, keep the
ETag each response returns, then finalise:
curl -X PUT "$FILEDGR_API/attachments/<attachment-uuid>" \
-H "x-api-key: $FILEDGR_API_KEY" -H "x-api-secret: $FILEDGR_API_SECRET" \
-H "Content-Type: application/json" \
-d '[{"part": 1, "etag": "\"abc...\""}, {"part": 2, "etag": "\"def...\""}]'
The body is a bare JSON array, not an object. Each element carries exactly one of link or
etag — send etag. Until this call succeeds the attachment stays in its uploading state and is
never notarised.
Re-posting the same attachment returns already-completed parts and re-presigns only the outstanding ones, so an interrupted upload can be resumed.
5. Watch for completion
Poll GET /attachments/{id}, or register a webhook for
data_attachment.completed and let Filedgr call you instead.