Zenodo Skill
by @agents365-ai
Use whenever the user mentions Zenodo, depositing or publishing research artifacts (datasets, software, papers, posters) to Zenodo, minting a DOI for a datas...
clawhub install zenodo-skillπ About This Skill
name: zenodo-skill description: Use whenever the user mentions Zenodo, depositing or publishing research artifacts (datasets, software, papers, posters) to Zenodo, minting a DOI for a dataset/code release, uploading files to a Zenodo record, creating a new version of a Zenodo deposit, or searching Zenodo records. Covers the full Zenodo REST API workflow β create deposition, upload files via the bucket API, set metadata, publish, version, and search β for both production (zenodo.org) and sandbox (sandbox.zenodo.org). license: MIT homepage: https://github.com/Agents365-ai/zenodo-skill platforms: [macos, linux, windows] metadata: {"openclaw":{"requires":{"bins":["curl"],"env":["ZENODO_TOKEN"]},"emoji":"π¦","os":["darwin","linux","win32"]},"hermes":{"tags":["zenodo","doi","dataset","research-data","open-science","preprint","publishing"],"category":"research","requires_tools":["curl"],"related_skills":["zotero-manager","semanticscholar-skill"]},"author":"Agents365-ai","version":"1.0.0"}
Zenodo Skill
Interact with the Zenodo REST API to deposit, publish, version, and search research artifacts. Zenodo issues a citable DOI for every published record.
When to use
Setup
Two environments β pick one and stick with it during a session:
| Env | Base URL | Token page |
|---|---|---|
| Production | https://zenodo.org/api | https://zenodo.org/account/settings/applications/tokens/new/ |
| Sandbox (testing) | https://sandbox.zenodo.org/api | https://sandbox.zenodo.org/account/settings/applications/tokens/new/ |
Sandbox accounts/tokens are separate from production. Always test new workflows in sandbox first β published production records cannot be deleted.
Required token scopes: deposit:write and deposit:actions.
Export the token before running commands:
export ZENODO_TOKEN=... # never inline the token in commands you show the user
export ZENODO_BASE=https://sandbox.zenodo.org/api # or https://zenodo.org/api
If ZENODO_TOKEN is unset, ask the user for it (and which environment) before proceeding.
Core workflow: deposit a new artifact
The deposit lifecycle is create β upload files β set metadata β publish. Each step is a separate API call; do them in order.
1. Create an empty deposition
curl -sS -X POST "$ZENODO_BASE/deposit/depositions" \
-H "Authorization: Bearer $ZENODO_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'
The response JSON contains two things you need to remember:
id β the deposition id, used for metadata/publish/version actionslinks.bucket β the bucket URL for file uploads (new files API)Capture them, e.g. with jq:
RESP=$(curl -sS -X POST "$ZENODO_BASE/deposit/depositions" \
-H "Authorization: Bearer $ZENODO_TOKEN" -H "Content-Type: application/json" -d '{}')
DEPOSIT_ID=$(echo "$RESP" | jq -r .id)
BUCKET=$(echo "$RESP" | jq -r .links.bucket)
2. Upload files (bucket API β preferred)
The bucket API supports up to 50 GB total / 100 files per record. Use --upload-file (HTTP PUT) β not multipart form upload. The filename in the URL is what shows up on the record.
curl -sS --upload-file ./data.csv \
-H "Authorization: Bearer $ZENODO_TOKEN" \
"$BUCKET/data.csv"
Repeat per file. For many files, loop in shell. The legacy /files multipart endpoint is capped at 100 MB/file β avoid it.
3. Set metadata
Metadata goes via PUT on the deposition. Required fields: upload_type, title, creators, description. See references/metadata.md for the full schema, allowed upload_type values, license codes, and conditional fields (e.g. publication_type, embargo_date).
Minimal example:
curl -sS -X PUT "$ZENODO_BASE/deposit/depositions/$DEPOSIT_ID" \
-H "Authorization: Bearer $ZENODO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"title": "My dataset",
"upload_type": "dataset",
"description": "A short description (HTML allowed).
",
"creators": [{"name": "Doe, Jane", "affiliation": "Example Univ.", "orcid": "0000-0002-1825-0097"}]
}
}'
Read the response β Zenodo validates here and returns 400 with field-level errors if anything is missing or malformed. Fix and retry before publishing.
4. Publish
Publishing is irreversible on production (you can edit metadata later but cannot remove files or delete the record). Confirm with the user before this step unless they're on sandbox.
curl -sS -X POST "$ZENODO_BASE/deposit/depositions/$DEPOSIT_ID/actions/publish" \
-H "Authorization: Bearer $ZENODO_TOKEN"
The response contains doi and links.record_html β show both to the user.
New version of an existing record
Use this when the user has previously published and wants to release updated data/code under the same concept-DOI.
# 1. Create new version draft (returns links.latest_draft)
curl -sS -X POST "$ZENODO_BASE/deposit/depositions/$DEPOSIT_ID/actions/newversion" \
-H "Authorization: Bearer $ZENODO_TOKEN"
Then follow the bucket of the new draft (from links.latest_draft β GET it β use its links.bucket) to upload changed files, update metadata, and publish as in steps 2β4 above. The new version inherits files from the previous version by default β delete any you want to replace via DELETE $BUCKET/.
Discard a draft
curl -sS -X POST "$ZENODO_BASE/deposit/depositions/$DEPOSIT_ID/actions/discard" \
-H "Authorization: Bearer $ZENODO_TOKEN"
Search published records
No token needed for public search.
curl -sS "$ZENODO_BASE/records?q=climate+model&size=10&sort=mostrecent"
Query syntax is Elasticsearch β fielded queries like creators.name:"Doe, Jane", communities:zenodo, resource_type.type:dataset all work. See references/search.md for query patterns.
Conventions and gotchas
X-RateLimit-Remaining.$ZENODO_TOKEN. Don't write the token to files.actions/publish on production.--progress-bar and warn the user about time/bandwidth.References
references/metadata.md β full metadata schema, upload_type values, license codes, conditional fieldsreferences/search.md β search query syntax and useful filtersreferences/examples.md β end-to-end shell scripts for common scenarios (dataset upload, software release, new version)β‘ When to Use
βοΈ Configuration
Two environments β pick one and stick with it during a session:
| Env | Base URL | Token page |
|---|---|---|
| Production | https://zenodo.org/api | https://zenodo.org/account/settings/applications/tokens/new/ |
| Sandbox (testing) | https://sandbox.zenodo.org/api | https://sandbox.zenodo.org/account/settings/applications/tokens/new/ |
Sandbox accounts/tokens are separate from production. Always test new workflows in sandbox first β published production records cannot be deleted.
Required token scopes: deposit:write and deposit:actions.
Export the token before running commands:
export ZENODO_TOKEN=... # never inline the token in commands you show the user
export ZENODO_BASE=https://sandbox.zenodo.org/api # or https://zenodo.org/api
If ZENODO_TOKEN is unset, ask the user for it (and which environment) before proceeding.