From refhub-netlify (functions/api-v1.js + src/routes/), the versioned API includes:
GET /api/v1/keysPOST /api/v1/keysPOST /api/v1/keys/:keyId/revokeDELETE /api/v1/keys/:keyIdGET /api/v1/auditall audit logs for key ownerPOST /api/v1/recommendationsSemantic Scholar (JWT-only)POST /api/v1/referencesSemantic Scholar (JWT-only)POST /api/v1/citationsSemantic Scholar (JWT-only)POST /api/v1/lookupSemantic Scholar (JWT-only)GET/POST/DELETE /api/v1/google-driveDrive link management (JWT-only)
Vaults
GET /api/v1/vaultsPOST /api/v1/vaultsGET /api/v1/vaults/:vaultIdPATCH /api/v1/vaults/:vaultIdDELETE /api/v1/vaults/:vaultIdPATCH /api/v1/vaults/:vaultId/visibilityGET /api/v1/vaults/:vaultId/sharesPOST /api/v1/vaults/:vaultId/sharesPATCH /api/v1/vaults/:vaultId/shares/:shareIdDELETE /api/v1/vaults/:vaultId/shares/:shareId
Items
GET /api/v1/vaults/:vaultId/itemssearch/filterPOST /api/v1/vaults/:vaultId/itemsadd items (legacy bulk add)PATCH /api/v1/vaults/:vaultId/items/:itemIdupdate itemDELETE /api/v1/vaults/:vaultId/items/:itemIddelete item (hard)POST /api/v1/vaults/:vaultId/items/upsertbulk upsert by DOI / title+yearPOST /api/v1/vaults/:vaultId/items/import-previewdry-run upsert
Tags
GET /api/v1/vaults/:vaultId/tagsPOST /api/v1/vaults/:vaultId/tagsPATCH /api/v1/vaults/:vaultId/tags/:tagIdDELETE /api/v1/vaults/:vaultId/tags/:tagIdPOST /api/v1/vaults/:vaultId/tags/attachPOST /api/v1/vaults/:vaultId/tags/detach
Relations
GET /api/v1/vaults/:vaultId/relationsPOST /api/v1/vaults/:vaultId/relationsPATCH /api/v1/vaults/:vaultId/relations/:relationIdDELETE /api/v1/vaults/:vaultId/relations/:relationId
Import
POST /api/v1/vaults/:vaultId/import/doiPOST /api/v1/vaults/:vaultId/import/bibtexPOST /api/v1/vaults/:vaultId/import/url
Search / stats / sync
GET /api/v1/vaults/:vaultId/searchGET /api/v1/vaults/:vaultId/statsGET /api/v1/vaults/:vaultId/changes
Export
GET /api/v1/vaults/:vaultId/export?format=json|bibtex
Audit
GET /api/v1/vaults/:vaultId/audit
PDF (used by browser extension, not typical agent workflows)
POST /api/v1/vaults/:vaultId/items/:itemId/pdfPOST /api/v1/vaults/:vaultId/items/:itemId/pdf/sessionPOST /api/v1/vaults/:vaultId/items/:itemId/pdf/complete
| Skill workflow | Endpoint(s) | Required scope | Min vault permission |
|---|---|---|---|
| List accessible vaults | GET /api/v1/vaults |
vaults:read |
— |
| Read one vault with full contents | GET /api/v1/vaults/:vaultId |
vaults:read |
viewer |
| Create vault | POST /api/v1/vaults |
vaults:admin |
— (account-level) |
| Update vault metadata | PATCH /api/v1/vaults/:vaultId |
vaults:admin |
owner |
| Delete vault | DELETE /api/v1/vaults/:vaultId |
vaults:admin |
owner |
| Set vault visibility | PATCH /api/v1/vaults/:vaultId/visibility |
vaults:admin |
owner |
| List collaborators | GET /api/v1/vaults/:vaultId/shares |
vaults:read |
viewer |
| Add collaborator | POST /api/v1/vaults/:vaultId/shares |
vaults:admin |
owner |
| Update collaborator role | PATCH /api/v1/vaults/:vaultId/shares/:shareId |
vaults:admin |
owner |
| Remove collaborator | DELETE /api/v1/vaults/:vaultId/shares/:shareId |
vaults:admin |
owner |
| Add one or more items | POST /api/v1/vaults/:vaultId/items |
vaults:write |
editor |
| Update item | PATCH /api/v1/vaults/:vaultId/items/:itemId |
vaults:write |
editor |
| Delete item | DELETE /api/v1/vaults/:vaultId/items/:itemId |
vaults:write |
editor |
| Bulk upsert items | POST /api/v1/vaults/:vaultId/items/upsert |
vaults:write |
editor |
| Preview upsert (dry-run) | POST /api/v1/vaults/:vaultId/items/import-preview |
vaults:read |
viewer |
| Search/filter items | GET /api/v1/vaults/:vaultId/search or items |
vaults:read |
viewer |
| List tags | GET /api/v1/vaults/:vaultId/tags |
vaults:read |
viewer |
| Create tag | POST /api/v1/vaults/:vaultId/tags |
vaults:write |
editor |
| Update tag | PATCH /api/v1/vaults/:vaultId/tags/:tagId |
vaults:write |
editor |
| Delete tag | DELETE /api/v1/vaults/:vaultId/tags/:tagId |
vaults:write |
editor |
| Attach tags to item | POST /api/v1/vaults/:vaultId/tags/attach |
vaults:write |
editor |
| Detach tags from item | POST /api/v1/vaults/:vaultId/tags/detach |
vaults:write |
editor |
| List relations | GET /api/v1/vaults/:vaultId/relations |
vaults:read |
viewer |
| Create relation | POST /api/v1/vaults/:vaultId/relations |
vaults:write |
editor |
| Update relation type | PATCH /api/v1/vaults/:vaultId/relations/:relationId |
vaults:write |
editor |
| Delete relation | DELETE /api/v1/vaults/:vaultId/relations/:relationId |
vaults:write |
editor |
| Import from DOI | POST /api/v1/vaults/:vaultId/import/doi |
vaults:write |
editor |
| Import from BibTeX | POST /api/v1/vaults/:vaultId/import/bibtex |
vaults:write |
editor |
| Import from URL | POST /api/v1/vaults/:vaultId/import/url |
vaults:write |
editor |
| Vault stats | GET /api/v1/vaults/:vaultId/stats |
vaults:read |
viewer |
| Incremental sync (changes since) | GET /api/v1/vaults/:vaultId/changes?since= |
vaults:read |
viewer |
| Export vault | GET /api/v1/vaults/:vaultId/export?format= |
vaults:export |
viewer |
| Read vault audit log | GET /api/v1/vaults/:vaultId/audit |
any API key | viewer |
| Read global audit log | GET /api/v1/audit |
JWT (management) | — |
| Desired workflow | Status | Notes |
|---|---|---|
| Vault archiving / unarchiving | not implemented | No API route; deferred |
| Vault duplication / clone | not implemented | No API route; deferred |
| Item soft-delete / restore | not implemented | Hard delete only |
| Item revision history | not implemented | No history table in current schema |
| Item move/copy between vaults | not implemented | No API route |
| Webhooks / event delivery | not implemented | Deferred to future cycle |
| Bulk relation import | not implemented | Create individually |
| Audit log viewer in frontend | not implemented | Tracked as frontend TODO |
| DOI enrichment from data routes | management-route only | POST /api/v1/doi-metadata exists but is JWT-only in the Semantic Scholar path; DOI import via import/doi is available |
| API key creation/revocation at runtime | JWT-only | Intentional: setup/admin flow |
Current scopes:
vaults:readvaults:writevaults:exportvaults:admin← new in v2
| Skill operation | Required scope |
|---|---|
vaults.list |
vaults:read |
vaults.get |
vaults:read |
vaults.create |
vaults:admin |
vaults.update |
vaults:admin |
vaults.delete |
vaults:admin |
vaults.setVisibility |
vaults:admin |
vaults.shares.* |
vaults:admin |
items.add |
vaults:write |
items.update |
vaults:write |
items.delete |
vaults:write |
items.upsert |
vaults:write |
items.importPreview |
vaults:read |
items.search |
vaults:read |
tags.list |
vaults:read |
tags.create / update / delete |
vaults:write |
tags.attach / detach |
vaults:write |
relations.list |
vaults:read |
relations.create / update / delete |
vaults:write |
import.doi / bibtex / url |
vaults:write |
vaults.stats / changes / search |
vaults:read |
vaults.export |
vaults:export |
audit.list |
any valid API key |
- Vault delete and item delete are hard deletes — no undo, no restore.
- Bulk upsert matches on DOI first, then
bibtex_key; items with neither are always created. Passidempotency_keyfor safe retries (TTL: 5 minutes, in-memory). - Tag creation is not implicit during item writes — tag IDs must already exist when passed as
tag_ids. tag_idson item update replaces the full tag set (not additive).- Vault access is the combination of ownership, sharing, and optional API-key vault restrictions.
- Management routes and data routes use different auth models.
vaults:adminscope must be explicitly requested at API key creation time.- When adding a share to a
privatevault, the vault is automatically upgraded toprotected. - Valid share roles are
viewerandeditoronly —ownercannot be set via the API. - Share creation requires
email;user_idis not accepted by the current implementation. - All delete operations return
200 { data: { id } }— not204 No Content. - Relation creation is not idempotent — submitting a duplicate pair will produce an error; check before creating.
- Relations list only supports
?type=filter —source_idandtarget_idfilters are not implemented. - DOI import calls Semantic Scholar internally; it will fail if
SEMANTIC_SCHOLAR_API_KEYis not configured.
The skill covers the full current public API surface. Future expansion should follow the same pattern:
API route exists → update skill → update CLI/MCP
Deferred features (archiving, webhooks, revision history) should not be approximated via existing endpoints.