RO-Crate Excel Server
A small HTTP service that converts an Excel workbook into RO-Crate JSON-LD using ro-crate-excel. This service is maintained by Danny Kennedy of BKRLCC and Light Garden. It is open-source (GPL), but is NOT an official service associated with RO-Crate.
Currently this service is in active development and may change without notice. If you have any questions or encounter issues, please reach out to the maintainers.
Code is at github.com/light-garden-projects/ro-crate-excel-server
POST/convert
Upload one or more .xlsx workbooks as
multipart/form-data, each in a field named
file. Set every part's filename to that workbook's
path relative to the archive root (POSIX
/ separators), for example
Collection A/Videos/metadata.xlsx. When several workbooks
are uploaded together they are merged into one crate:
the master collection (the workbook whose root declares no parent) stays
at ./, every other workbook is folded in under it, and each
sheet's folder prefix rebases its file references.
Membership convention. To link objects to their
collection, give each RepositoryObject row an
isRef_pcdm:memberOf value of ./ (its own
collection root). The merge rewrites that to the collection's identifier
and synthesises the inverse pcdm:hasMember automatically.
Contextual entities (Person, Place, Language, Organization) must
not carry pcdm:memberOf — they are
linked through property references such as creator,
inLanguage, and publisher.
Request
| Field | Type | Notes |
|---|---|---|
file |
file (.xlsx) |
Required, repeatable. The RO-Crate metadata spreadsheet. Its
filename is treated as the archive-root-relative path and
must be a relative POSIX path: no leading /, no
.. or . segments, and unique across the
upload.
|
Example
# Single workbook
curl -X POST \
-F "file=@ro-crate-metadata.xlsx" \
https://ro-crate-excel-api.light.garden/convert
# Multiple workbooks, each carrying its archive-root-relative path
curl -X POST \
-F "file=@root.xlsx;filename=ro-crate-metadata.xlsx" \
-F "file=@videos.xlsx;filename=Collection A/Videos/metadata.xlsx" \
https://ro-crate-excel-api.light.garden/convert
Add ?report=1 to receive an
application/json envelope
{ "crate": { ... }, "warnings": [ ... ] } instead of the
bare crate (single-workbook uploads). Each warning has a
source, a level (warning or
error), and a message. Warnings with
source: "check" flag { "@id" } references that
point to an entity not defined in the crate (for example, an entity
described in another sheet or workbook).
Responses
| Status | Meaning |
|---|---|
200 |
A single RO-Crate JSON-LD document
(application/ld+json) — the converted workbook, or
the merged crate when several are uploaded. With
?report=1 the response is instead a
{ crate, warnings } envelope, whose warnings include any
source: "merge" entries from the merge step.
|
400 |
No file, a non-.xlsx file, an absolute or
traversal-containing (..) path, a duplicate path, or a
workbook that could not be parsed.
|
413 |
A file exceeds the size limit, or too many files were uploaded. |
Try it
Upload an .xlsx workbook and convert it right here in
your browser.
ro-crate comes from ro-crate-excel; repaired is an automatic fix we applied — see repair strategies; check flags a reference that points to an entity not defined in the crate; merge reports an issue from merging multiple workbooks into one crate.
POST/validate
Validate an RO-Crate JSON-LD document against the RO-Crate
specification. Send the crate as the request body with a
Content-Type of application/json or
application/ld+json.
Example
curl -X POST \
-H "Content-Type: application/ld+json" \
--data-binary @ro-crate-metadata.json \
https://ro-crate-excel-api.light.garden/validate
Response
200 with a JSON body
{ "valid": boolean, "results": [ ... ] }. Each result has
an id, a status of success,
warning, or error, a message, and
a spec clause. valid is
false when any result is an error. A body that
is missing or not a JSON object returns 400.
Try it
Paste RO-Crate JSON-LD below, or load a .json /
.jsonld file, then check it against the RO-Crate
specification.
GET/health
Liveness check. Returns { "status": "ok" }.