load-s3-agent is a data agent built on top of HyperBEAM ~s3@1.0 temporal data storage device. This agent orchestrates the location of the data moving it from temporal to permanent (Arweave).
N.B: beta testing release, unstable and subject to breaking changes, use in testing enviroments only.
- GET
/: agent info - GET
/provenance/{id}: return the onchain provenance proof of an offchain ANS-104 dataitem (only for dataitems that enabled the onchain provenance flag at upload). - GET
/{dataitem_id}: generate a presigned get_object URL to access the ANS-104 DataItem data - DEPRECATED since v0.7.0 - usegateway.s3-node-1.load.network/resolve/$DATAITEM_IDinstead - GET
/agg/daily?days=N: return the sum-per-day new added data size and dataitems count. N default to 30. - GET
/agg/daily/mime: return the aggregated content-type frequency per day. - GET
/agg/daily/anchored: return the aggregated count of anchored LS3 dataitems to Arweave. - POST
/tags/query: query dataitems for a given tags KV pairs. - POST
/query/dataitem: fetch full metadata for a specificdataitem_id. - POST
/upload: post data (or signed dataitem) to store a public offchain DataItem on~s3@1.0 - POST
/upload/private: post data (or signed dataitem) to store a private offchain DataItem on~s3@1.0 - POST
/post/{dataitem_id}: post an~s3@1.0public DataItem to Arweave via Turbo (N.B: Turbo covers any dataitem cost with size <= 100KB).
echo -n "hello world" | curl -X POST https://load-s3-agent.load.network/upload \
-H "Authorization: Bearer $load_acc_api_key" \
-F "file=@-;type=text/plain" \
-F "content_type=text/plain"Or optionally add custom tags KVs that will be included in the ANS-104 DataItem construction
echo -n "hello custom tagged world" | curl -X POST https://load-s3-agent.load.network/upload \
-H "Authorization: Bearer $load_acc_api_key" \
-F "file=@-;type=text/plain" \
-F 'tags=[{"key":"tag1","value":"tag1"},{"key":"tag2","value":"tag2"}]'Optional: have the agent publish an offchain provenance record for the uploaded DataItem (the API returns the provenance transaction id in offchain_provenance_proof):
echo -n "hello provenance world" | curl -X POST https://load-s3-agent.load.network/upload \
-H "Authorization: Bearer $load_acc_api_key" \
-H "offchain-provenance: true" \
-F "file=@-;type=text/plain"- onchain provenance example: https://viewblock.io/arweave/tx/fnmmd6pqOOQFFpscH8AB4CyGDsGSt_fG5VCPJioBG3c
- offchain dataitem: https://gateway.s3-node-1.load.network/resolve/gT03XTtL0GCfb2AxJFjg8OVkhMuLQvwQVi7KvrbKYF8
- provenance receipt (including settlement): https://load-s3-agent.load.network/provenance/gT03XTtL0GCfb2AxJFjg8OVkhMuLQvwQVi7KvrbKYF8
*** N.B: any private DataItem does not have the tags indexed nor is queryable ***
echo -n "hello world" | curl -X POST https://load-s3-agent.load.network/upload/private \
-H "Authorization: Bearer $load_acc_api_key" \
-H "x-bucket-name: $bucket_name" \
-H "x-dataitem-name: $dataitem_name" \
-H "x-folder-name": $folder_name" \
-H "signed: false" \
-F "file=@-;type=text/plain" \
-F "content_type=text/plain"curl -X POST https://load-s3-agent.load.network/upload/private \
-H "Authorization: Bearer $load_acc_api_key" \
-H "signed: true" \
-H "bucket_name: $bucket_name" \
-H "x-dataitem-name: $dataitem_name" \
-H "x-folder-name": $folder_name" \
-F "file=@path-signed-dataitem.ans104" \
-F "content_type=application/octet-stream"Tags are extracted from the ANS-104 DataItem, indexed and queryable
curl -X POST https://load-s3-agent.load.network/upload \
-H "Authorization: Bearer $load_acc_api_key" \
-H "signed: true" \
-F "file=@your-signed-dataitem.bin"example: for offchain dataitem = eoNAO-HlYasHJt3QFDuRrMVdLUxq5B8bXe4N_kboNWs
curl -X POST \
"https://load-s3-agent.load.network/post/eoNAO-HlYasHJt3QFDuRrMVdLUxq5B8bXe4N_kboNWs" \
-H "Authorization: Bearer REACH_OUT_TO_US" \
-H "Content-Type: application/json"all dataitems pushed after agent's v0.6.0 release are queryable by the dataitem's tags KVs:
curl -X POST https://load-s3-agent.load.network/tags/query \
-H "Content-Type: application/json" \
-d '{
"filters": [
{
"key": "tag1",
"value": "tag1"
},
{
"key": "tag2",
"value": "tag2"
}
]
}'
-
Pagination follows Arweave's GQL schema: optional
first(default 25, max 100) and a cursorafter. -
full_metadataflag (Optional<bool>) to return the full tags associated with a query's dataitem -
owner/targetfilters are supported (can be used with or withoutfilters) -
Tip:
owner/targetquery support is available from agentv0.10.0 -
each returned item includes
dataitem_size(bytes) when available (v0.9.1 and onwards) -
created_after/created_before(ISO-8601/RFC3339 strings) filter items by theircreated_attimestamp (inclusive bounds).
curl -X POST https://load-s3-agent.load.network/tags/query \
-H "Content-Type: application/json" \
-d '{
"filters": [
{
"key": "tag1",
"value": "tag1"
}
],
"full_metadata": true,
"owner": "2BBwe2pSXn_Tp-q_mHry0Obp88dc7L-eDIWx0_BUfD0",
"target": null,
"created_after": "2025-12-01T00:00:00Z",
"created_before": "2025-12-05T00:00:00Z",
"first": 25,
"after": null
}'
Owner-only query:
curl -X POST https://load-s3-agent.load.network/tags/query \
-H "Content-Type: application/json" \
-d '{
"filters": [],
"owner": "2BBwe2pSXn_Tp-q_mHry0Obp88dc7L-eDIWx0_BUfD0"
}'Owner + tags query:
curl -X POST https://load-s3-agent.load.network/tags/query \
-H "Content-Type: application/json" \
-d '{
"filters": [
{
"key": "Content-Type",
"value": "text/plain"
}
],
"owner": "2BBwe2pSXn_Tp-q_mHry0Obp88dc7L-eDIWx0_BUfD0",
"full_metadata": true
}'if page_info.has_next_page returns true, reuse the page_info.next_cursor string as the next after.
count reflects the number of items returned in the current page, while total_count includes every dataitem that matches the filters across all pages.
Retrieve the latest indexed metadata (content type, size, tags, timestamps) for a single dataitem:
curl -X POST https://load-s3-agent.load.network/query/dataitem \
-H "Content-Type: application/json" \
-d '{
"dataitem_id": "87uRZNA6YiaK0jhUMSBtspSCvmZnPPchkMkpXJzA4Gk"
}'[dependencies]
load-s3-agent = { git = "https://github.com/loadnetwork/lcp-uploader-api.git", branch = "main" }Codec helpers (owner/target derivation) are available under load_s3_agent::codec.
use load_s3_agent::create_dataitem;
use load_s3_agent::{get_dataitem_provenance_record, DataItemProvenanceRecord};
fn build_item() -> anyhow::Result<()> {
// ensure UPLOADER_JWK is available in the environment (or .env)
std::env::set_var("UPLOADER_JWK", include_str!("../wallet.json"));
let item = create_dataitem(
b"hello world".to_vec(),
"text/plain",
&[("My-Tag".into(), "tag-value".into())],
)?;
println!("Signed data item id: {}", item.id());
Ok(())
}use load_s3_agent::{codec::derive_owner_address, create_dataitem};
fn owner_from_item() -> anyhow::Result<()> {
std::env::set_var("UPLOADER_JWK", include_str!("../wallet.json"));
let item = create_dataitem(b"hello world".to_vec(), "text/plain", &[])?;
let owner = derive_owner_address(&item).unwrap_or_default();
println!("owner: {owner}");
Ok(())
}This agent is licensed under the MIT License