Install
openclaw skills install mnemospark-liteUse this skill when OpenClaw needs to store files in mnemospark-lite, pay the x402 upload flow, complete uploads, list wallet-scoped uploads, fetch download...
openclaw skills install mnemospark-liteUse this skill to operate mnemospark-lite from OpenClaw.
mnemospark-lite gives any agent access to cloud storage through a simple paid HTTP workflow. Agents can upload files, list stored files, delete files, and generate shareable links that can be passed to another agent or a human. Humans can use the web app at https://app.mnemospark.ai/mnemospark-lite to view files, download them, delete them, and create share links from a friendly UI. It’s the same storage system, designed to work cleanly for both agents and people. Files are retained for 30 days and then automatically deleted.
Support these mnemospark-lite operations:
Use these endpoints as needed:
POST /api/mnemospark-lite/uploadPOST /api/mnemospark-lite/upload/completeGET /api/mnemospark-lite/uploadsGET /api/mnemospark-lite/download/{uploadId}POST /api/mnemospark-lite/sharePOST /api/mnemospark-lite/deleteCollect the minimum inputs for the requested operation.
Common inputs:
MNEMOSPARK_API_BASE_URL=https://api.mnemospark.aiUpload inputs:
tier: one of 10mb, 100mb, 500mb, 1gb, 2gb, 3gbcontentTypeBearer-scoped read/write inputs after upload:
Authorization: Bearer <token>list_scope_bearer from the paid upload flow when availableEntity inputs:
uploadId for download/share/delete operationsuploadId values for deleteWhen running inside OpenClaw:
/home/ubuntu/.openclaw/mnemospark/wallet/wallet.key/usr/bin/node /home/ubuntu/.openclaw/extensions/mnemospark/dist/cli.js walletnpx mnemospark or cwd-sensitive paths when local install state may have driftedpip install 'x402[evm]'When the user wants to upload a file, use this exact flow.
Probe POST ${MNEMOSPARK_API_BASE_URL}/api/mnemospark-lite/upload without payment first when you need the x402 challenge.
Request body:
{
"filename": "example.txt",
"contentType": "text/plain",
"tier": "10mb",
"size_bytes": 12
}
Read PAYMENT-REQUIRED or x-payment-required, base64-decode it, and preserve the advertised payment requirement.
The 402 JSON body may also include:
resource.urlacceptsextensions.bazaarFor bazaar indexing and compatibility, preserve the advertised requirement and echo extensions.bazaar into the x402 PaymentPayload when your client supports that.
Retry the same POST /upload request with:
Content-Type: application/jsonPAYMENT-SIGNATURE: <base64-json> or x-payment: <base64-json>Prefer PAYMENT-SIGNATURE unless the runtime only supports x-payment.
Response fields can include:
data.uploadIddata.uploadUrldata.completion_tokendata.list_scope_bearerdata.publicUrldata.siteUrlmetadata.payment.statusmetadata.payment.transactionHashmetadata.payment.successThe paid POST /upload may return:
200 immediately, or202 with error: settlement_pendingIf it returns 202:
Send the file bytes with PUT to data.uploadUrl.
Example:
curl -T "example.txt" \
-H "Content-Type: text/plain" \
"<uploadUrl>"
Call POST ${MNEMOSPARK_API_BASE_URL}/api/mnemospark-lite/upload/complete with only:
{
"uploadId": "<uploadId>",
"completion_token": "<completion_token>"
}
Rules:
/upload/completeuploadId and completion_token202, poll every few seconds until 200 or timeoutSuccessful completion should expose:
data.upload.publicUrldata.upload.siteUrldata.upload.statusAfter completion, verify at least one bearer-scoped read path:
GET /api/mnemospark-lite/uploadsGET /api/mnemospark-lite/download/{uploadId}Use Authorization: Bearer <list_scope_bearer>.
This confirms the upload is visible to the payer-scoped APIs and can mint or expose a download URL.
When running under OpenClaw, use the x402 client-generated payload flow rather than hand-built JSON.
Use the exact payment payload generated by the x402 client library and base64-encode that JSON as-is.
Do not:
eip155:8453 into baseUse the raw x402 client payload for the paid /upload request, retry the same paid request on 202 settlement_pending with the same payload, then call /upload/complete with only uploadId and completion_token.
Also capture these fields from the paid /upload response when present:
metadata.payment.statusmetadata.payment.transactionHashmetadata.payment.successThose fields are the cleanest proof that facilitator settlement succeeded.
Successful runs used an x402-generated payload containing at least:
x402Versionacceptedresourcepayload.signaturepayload.authorizationExample shape:
{
"x402Version": 2,
"accepted": {
"scheme": "exact",
"network": "eip155:8453",
"asset": "<asset>",
"payTo": "<recipient>",
"amount": "<amount>",
"maxTimeoutSeconds": 3600,
"extra": {
"name": "USD Coin",
"version": "2"
}
},
"resource": {
"url": "https://api.mnemospark.ai/api/mnemospark-lite/upload",
"mimeType": "application/json",
"description": "mnemospark-lite upload"
},
"payload": {
"signature": "<eip3009-signature>",
"authorization": {
"from": "<payer-wallet>",
"to": "<recipient>",
"value": "<amount>",
"validAfter": "<unix-seconds>",
"validBefore": "<unix-seconds>",
"nonce": "<bytes32>"
}
}
}
Treat later backend normalization or enrichment as a server concern, not a reason to mutate the client payload.
When the user wants to see uploads for the payer scope, call:
GET ${MNEMOSPARK_API_BASE_URL}/api/mnemospark-lite/uploadsAuthorization: Bearer <token>You typically receive the token as list_scope_bearer from the paid upload flow.
Expect data.uploads[] fields such as:
idfilenamecontentTypetiermaxSizeactualSizepublicUrlstatuspricePaidexpiresAtcreatedAtNotes:
publicUrl may be null until /upload/completeWhen the user wants download detail or a short-lived download URL, call:
GET ${MNEMOSPARK_API_BASE_URL}/api/mnemospark-lite/download/<uploadId>Authorization: Bearer <token>Expect:
data.uploaddata.upload.downloadUrl when the upload is in a downloadable stateNotes:
When the user wants a 24-hour share link for an existing upload, call:
POST ${MNEMOSPARK_API_BASE_URL}/api/mnemospark-lite/shareAuthorization: Bearer <token>Content-Type: application/jsonBody:
{
"uploadId": "<uploadId>"
}
Expect:
data.shareUrldata.expiresAtNotes:
When the user wants to delete one or more uploads, call:
POST ${MNEMOSPARK_API_BASE_URL}/api/mnemospark-lite/deleteAuthorization: Bearer <token>Content-Type: application/jsonBody:
{
"uploadIds": ["<uploadId1>", "<uploadId2>"]
}
Expect:
data.deleteddata.results[] per upload IDNotes:
GET /uploads to confirm removalsReturn or persist the most useful fields for the active task:
uploadIdpublicUrlsiteUrlshareUrl when minted separatelylist_scope_bearermetadata.payment.status when presentmetadata.payment.transactionHash when presentmetadata.payment.success when present