Skip to content

Dashboard API

Authenticated API used by the internal Legaciti dashboard. Administrative endpoints are marked as internal where relevant.

Authenticated API used by the internal Legaciti dashboard. Administrative endpoints are marked as internal where relevant.

Version: 1.0.0

Raw OpenAPI JSON: /openapi/dashboard-api.json

MethodPathSummary
GET/api/activityList workspace activity
POST/api/activity/cleanupCleanup workspace activity

List workspace activity Returns a newest-first, workspace-scoped activity timeline with optional filters. Authentication: betterAuthSession Tags: Activity

NameInTypeRequiredDescription
fromqueryintegerno
toqueryintegerno
event_typequerystringno
severityquerystringno
statusquerystringno
actorquerystringno
qquerystringyes
pagequeryintegeryes
per_pagequeryintegeryes
cursorquerystringno

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"events": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"page": {
"type": "integer"
},
"per_page": {
"type": "integer"
},
"total": {
"type": "integer"
},
"pages": {
"type": "integer"
},
"next_cursor": {
"type": [
"string",
"null"
]
},
"has_more": {
"type": "boolean"
}
},
"required": [
"events",
"page",
"per_page",
"total",
"pages",
"next_cursor",
"has_more"
]
}

400 - Invalid query or missing workspace context.

Section titled “400 - Invalid query or missing workspace context.”

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Cleanup workspace activity Deletes activity rows for the active workspace. Allowed for workspace_admin and superadmin roles. Authentication: betterAuthSession Tags: Activity

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"mode": {
"type": "string",
"enum": [
"all",
"before_date"
]
},
"before_date": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"confirmation": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"mode",
"confirmation"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"mode": {
"type": "string",
"enum": [
"all",
"before_date"
]
},
"deleted_count": {
"type": "integer"
}
},
"required": [
"ok",
"mode",
"deleted_count"
]
}

400 - Invalid request body or missing workspace context.

Section titled “400 - Invalid request body or missing workspace context.”

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}
MethodPathSummary
POST/api/import/orcidQueue ORCID import
POST/api/import/doiImport DOI

Queue ORCID import Queues ORCID imports from the import surface. Similar to ingestion queueing but exposed under import routes. Authentication: betterAuthSession Tags: Import

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"orcid_ids": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"skip_existing": {
"type": "boolean"
},
"trigger_source": {
"type": "string",
"enum": [
"people_page"
]
}
},
"required": [
"orcid_ids"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"properties": {
"queued": {
"type": "integer"
},
"jobs": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"queued",
"jobs"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Import DOI Fetches and upserts publication metadata directly from a DOI and optionally links people. Authentication: betterAuthSession Tags: Import

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"doi": {
"type": "string",
"minLength": 1
},
"person_orcids": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"doi",
"person_orcids"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

201 - New publication created from DOI import.

Section titled “201 - New publication created from DOI import.”

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}
MethodPathSummary
GET/healthHealth check
GET/meCurrent dashboard identity
GET/debug-authAuthentication debug payload

Health check Simple health endpoint for worker availability. Authentication: Public Tags: Info

No parameters.

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"service": {
"type": "string",
"enum": [
"dashboard-api"
]
},
"status": {
"type": "string",
"enum": [
"ok"
]
}
},
"required": [
"service",
"status"
]
}

Current dashboard identity Returns the authenticated user identity and workspace context when a valid Better Auth session is present. Authentication: betterAuthSession Tags: Info

No parameters.

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"email": {
"type": [
"string",
"null"
]
}
},
"required": [
"email"
]
}

Authentication debug payload Returns the resolved auth context (identity, source, superadmin flag, memberships) for the current Better Auth session. Internal: yes Authentication: Public Tags: Info

No parameters.

No request body.

200 - Debug payload with identity and token-derived fields.

Section titled “200 - Debug payload with identity and token-derived fields.”

Content type: application/json

{
"type": "object",
"additionalProperties": true
}
MethodPathSummary
POST/api/ingestQueue ORCID ingestion
GET/api/ingest/statusPoll ingestion status
GET/api/ingest/stuckList stuck ingestion jobs
POST/api/ingest/stuck/{jobId}/force-failForce-fail an ingestion job

Queue ORCID ingestion Queues one or more ORCID ingestion jobs and returns the job records that were created. Authentication: betterAuthSession Tags: Ingestion

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"orcid_ids": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"skip_existing": {
"type": "boolean"
},
"trigger_source": {
"type": "string",
"enum": [
"people_page"
]
}
},
"required": [
"orcid_ids"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"properties": {
"queued": {
"type": "integer"
},
"requested": {
"type": "integer"
},
"jobs": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"queued",
"requested",
"jobs"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Poll ingestion status Returns the most recent ingestion status for each requested ORCID identifier. Authentication: betterAuthSession Tags: Ingestion

NameInTypeRequiredDescription
orcid_idsquerystringyesComma-separated ORCID identifiers.

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"statuses": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"statuses"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

List stuck ingestion jobs Lists queued or processing ingestion jobs older than a configurable threshold. Internal: yes Authentication: betterAuthSession Tags: Ingestion

NameInTypeRequiredDescription
threshold_secondsqueryintegernoAge threshold in seconds.
limitqueryintegernoMaximum stuck jobs to return.

No request body.

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Force-fail an ingestion job Marks a queued or processing ingestion job as failed for operational recovery. Internal: yes Authentication: betterAuthSession Tags: Ingestion

NameInTypeRequiredDescription
jobIdpathstringyesIngestion job identifier.

Content type: application/json

{
"type": "object",
"properties": {
"orcid_id": {
"type": "string"
},
"error_message": {
"type": "string"
}
},
"required": [
"orcid_id"
]
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}
MethodPathSummary
GET/api/peopleList people
GET/api/people/{orcid}Get person
PATCH/api/people/{orcid}Update person profile
GET/api/people/{orcid}/publicationsList person publications
PATCH/api/people/{orcid}/affiliationUpdate person affiliation

List people Lists people with optional affiliation and search filters. Authentication: betterAuthSession Tags: People

NameInTypeRequiredDescription
pagequeryintegeryes1-based page number.
perPagequeryintegeryesItems per page.
qquerystringyesSearch by person name or ORCID.
sortquerystringyesSort field.
dirquerystringyesSort direction.
entity_idquerystringnoEntity filter such as cesam.
affiliation_statusquerystringnoNormalized affiliation status filter.
active_onlyquerybooleanyesOnly include currently active memberships.
category_idquerystringno
localequerystringyes

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"people": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"page": {
"type": "integer"
},
"per_page": {
"type": "integer"
},
"total": {
"type": "integer"
},
"pages": {
"type": "integer"
}
},
"required": [
"people",
"page",
"per_page",
"total",
"pages"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Get person Returns a single person including current normalized affiliation fields. Authentication: betterAuthSession Tags: People

NameInTypeRequiredDescription
orcidpathstringyesPerson ORCID identifier.

No request body.

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Update person profile Updates the manually editable person name and biography fields. Authentication: betterAuthSession Tags: People

NameInTypeRequiredDescription
orcidpathstringyesPerson ORCID identifier.

Content type: application/json

{
"type": "object",
"properties": {
"name": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
]
},
"biography": {
"anyOf": [
{
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"minLength": 1
}
}
]
},
{
"type": "null"
}
]
},
"category_ids": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"name"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
},
"required": [
"success"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

List person publications Returns publications linked to a single person, with optional inclusion of soft-deleted rows. Authentication: betterAuthSession Tags: People

NameInTypeRequiredDescription
orcidpathstringyesPerson ORCID identifier.
pagequeryintegeryes1-based page number.
perPagequeryintegeryesItems per page.
includeDeletedquerybooleanyesInclude soft-deleted publications.

No request body.

200 - Paginated publication list for a single person.

Section titled “200 - Paginated publication list for a single person.”

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Update person affiliation Closes the current active membership row and creates a new one for the given entity and status. Authentication: betterAuthSession Tags: People

NameInTypeRequiredDescription
orcidpathstringyesPerson ORCID identifier.

Content type: application/json

{
"type": "object",
"properties": {
"entity_id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"cesam",
"external"
]
},
"starts_at": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"entity_id",
"status"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}
MethodPathSummary
GET/api/publicationsList publications
GET/api/publications/statsPublication totals
GET/api/publications/stats/timeseriesPublication timeseries
GET/api/publications/{id}Get publication
PATCH/api/publications/{id}Patch publication
DELETE/api/publications/{id}Soft-delete publication
POST/api/publications/bulkBulk publication action

List publications Lists dashboard publications across shards with filters for visibility, deletion state, ownership, and metadata fields. Authentication: betterAuthSession Tags: Publications

NameInTypeRequiredDescription
pagequeryintegeryes1-based page number.
perPagequeryintegeryesItems per page.
orcid_idquerystringnoFilter to publications linked to a person ORCID.
qquerystringyesSearch term applied to title and author text.
sortquerystringyesSort field.
dirquerystringyesSort direction.
visibilityquerystringyesVisibility filter.
statusquerystringyesDeletion-state filter.
publication_typequerystringnoExact publication type filter.
publication_yearqueryintegernoPublication year filter.
min_cited_byqueryintegernoMinimum citation count filter.
localequerystringyes

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"publications": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"person_orcids": {
"type": "array",
"items": {
"type": "string"
}
},
"person": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"title": {
"type": [
"string",
"null"
]
},
"apa_citation": {
"type": [
"string",
"null"
]
},
"doi_url": {
"type": "string"
},
"publication_date": {
"type": [
"string",
"null"
]
},
"publication_year": {
"type": [
"integer",
"null"
]
},
"publication_type": {
"type": [
"string",
"null"
]
},
"cited_by_count": {
"type": [
"integer",
"null"
]
},
"last_fetched_at": {
"type": "integer"
},
"edit_count": {
"type": "integer"
},
"visible": {
"type": "boolean"
},
"deleted_at": {
"type": [
"string",
"null"
]
}
},
"required": [
"id",
"person_orcids",
"person",
"doi_url",
"last_fetched_at",
"edit_count",
"visible"
],
"additionalProperties": true
}
},
"page": {
"type": "integer"
},
"per_page": {
"type": "integer"
},
"total": {
"type": "integer"
},
"pages": {
"type": "integer"
},
"sort": {
"type": "string"
},
"dir": {
"type": "string"
},
"q": {
"type": "string"
},
"visibility": {
"type": "string"
},
"status": {
"type": "string"
},
"publication_type": {
"type": [
"string",
"null"
]
},
"publication_year": {
"type": [
"integer",
"null"
]
},
"min_cited_by": {
"type": [
"integer",
"null"
]
}
},
"required": [
"publications",
"page",
"per_page",
"total",
"pages",
"sort",
"dir",
"q",
"visibility",
"status"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Publication totals Returns aggregate publication totals used by the dashboard overview widgets. Authentication: betterAuthSession Tags: Publications

No parameters.

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"total_publications": {
"type": "integer"
},
"edited_publications": {
"type": "integer"
},
"hidden_publications": {
"type": "integer"
},
"orcid_sources": {
"type": "integer"
}
},
"required": [
"total_publications",
"edited_publications",
"hidden_publications",
"orcid_sources"
]
}

Publication timeseries Returns recent daily and monthly ingestion counts for dashboard charts. Authentication: betterAuthSession Tags: Publications

No parameters.

No request body.

200 - Daily and monthly publication counts.

Section titled “200 - Daily and monthly publication counts.”

Content type: application/json

{
"type": "object",
"properties": {
"daily_last_7_days": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"label": {
"type": "string"
},
"count": {
"type": "integer"
}
},
"required": [
"key",
"label",
"count"
]
}
},
"monthly_last_6_months": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string"
},
"label": {
"type": "string"
},
"count": {
"type": "integer"
}
},
"required": [
"key",
"label",
"count"
]
}
}
},
"required": [
"daily_last_7_days",
"monthly_last_6_months"
]
}

Get publication Returns the original, edited, and merged publication payload along with linked people and promoted metadata. Dashboard-only custom fields are returned on detail responses as nullable top-level values and merged into the merged object: q is any integer, q_percentage is an integer from 0 to 100, if_value and if5a_value are decimal numbers, and funding is true, false, or null. These fields are not exposed by the public or integrations APIs. Authentication: betterAuthSession Tags: Publications

NameInTypeRequiredDescription
idpathstringyesNormalized or raw DOI identifier.

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"author_match_state": {
"type": "string",
"enum": [
"needs_attention",
"complete"
]
},
"person_orcids": {
"type": "array",
"items": {
"type": "string"
}
},
"person": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
}
},
"visible": {
"type": "boolean"
},
"original": {
"type": "object",
"additionalProperties": true
},
"edited": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
},
"merged": {
"type": "object",
"additionalProperties": true
},
"apa_citation": {
"type": [
"string",
"null"
]
},
"doi_url": {
"type": "string"
},
"publication_date": {
"type": [
"string",
"null"
]
},
"publication_year": {
"type": [
"integer",
"null"
]
},
"publication_type": {
"type": [
"string",
"null"
]
},
"cited_by_count": {
"type": [
"integer",
"null"
]
},
"is_retracted": {
"type": "boolean"
},
"open_access_status": {
"type": [
"string",
"null"
]
},
"enriched_metadata": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
},
"q": {
"type": [
"integer",
"null"
],
"description": "Dashboard-only quartile value. Any integer is accepted."
},
"q_percentage": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 100,
"description": "Dashboard-only percentile value."
},
"if_value": {
"type": [
"number",
"null"
],
"description": "Dashboard-only impact factor value. Comma decimal input is normalized before persistence."
},
"if5a_value": {
"type": [
"number",
"null"
],
"description": "Dashboard-only five-year impact factor value. Comma decimal input is normalized before persistence."
},
"funding": {
"type": [
"boolean",
"null"
],
"description": "Dashboard-only nullable funding flag."
},
"edit_patch": {
"type": [
"string",
"null"
]
},
"last_fetched_at": {
"type": "integer"
},
"last_edited_at": {
"type": [
"integer",
"null"
]
},
"edit_count": {
"type": "integer"
},
"provider_sources": {
"type": "object",
"additionalProperties": true
}
},
"required": [
"id",
"author_match_state",
"person_orcids",
"person",
"visible",
"original",
"edited",
"merged",
"doi_url",
"is_retracted",
"q",
"q_percentage",
"if_value",
"if5a_value",
"funding",
"last_fetched_at",
"last_edited_at",
"edit_count",
"provider_sources"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Patch publication Applies a JSON Patch document to publication metadata or toggles visibility. Dashboard-only custom field paths are accepted for /q, /q_percentage, /if_value, /if5a_value, and /funding; comma decimal input for IF fields is normalized before persistence. Authentication: betterAuthSession Tags: Publications

NameInTypeRequiredDescription
idpathstringyesNormalized or raw DOI identifier.

Content type: application/json

{
"type": "array",
"items": {
"type": "object",
"properties": {
"op": {
"type": "string"
},
"path": {
"type": "string"
},
"value": {}
},
"required": [
"op",
"path"
],
"additionalProperties": true
}
}

Content type: application/json

{
"type": "object",
"properties": {
"ok": {
"type": "boolean"
},
"visible": {
"type": "boolean"
},
"edit_count": {
"type": "integer"
}
},
"required": [
"ok",
"visible"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Soft-delete publication Marks a publication as deleted without removing the row. Authentication: betterAuthSession Tags: Publications

NameInTypeRequiredDescription
idpathstringyesNormalized or raw DOI identifier.

No request body.

Content type: application/json

{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
},
"required": [
"success"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Bulk publication action Soft-deletes or restores a list of publications. Authentication: betterAuthSession Tags: Publications

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
}
},
"action": {
"type": "string",
"enum": [
"delete",
"restore"
]
}
},
"required": [
"ids",
"action"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
},
"required": [
"success"
]
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}
MethodPathSummary
POST/api/site-tools/reset-dataReset dashboard data
POST/api/site-tools/clear-stuck-jobsClear stuck jobs
POST/api/site-tools/repair-author-linksRepair author links for a DOI
POST/api/site-tools/repair-author-links/bulkBulk repair author links
GET/api/site-tools/api-keysList API keys
POST/api/site-tools/api-keysCreate API key
PATCH/api/site-tools/api-keys/{keyHash}Update API key
DELETE/api/site-tools/api-keys/{keyHash}Revoke API key
POST/api/site-tools/api-keys/{keyHash}/rotateRotate API key

Reset dashboard data Administrative endpoint to delete dashboard data across shards. Protected by additional email checks. Internal: yes Authentication: betterAuthSession Tags: Site Tools

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"confirmation": {
"type": "string"
},
"dryRun": {
"type": "boolean"
},
"clearIngestionJobs": {
"type": "boolean"
}
},
"required": [
"confirmation"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

400 - Invalid request or confirmation mismatch.

Section titled “400 - Invalid request or confirmation mismatch.”

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Clear stuck jobs Administrative endpoint to force-fail stale queued or processing ingestion jobs across shards. Internal: yes Authentication: betterAuthSession Tags: Site Tools

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"thresholdSeconds": {
"type": "integer",
"minimum": 60,
"maximum": 86400
},
"dryRun": {
"type": "boolean"
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Repair author links for a DOI Administrative endpoint to reconcile author matches for a single publication DOI. Internal: yes Authentication: betterAuthSession Tags: Site Tools

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"doi": {
"type": "string",
"minLength": 1
},
"dryRun": {
"type": "boolean"
},
"cesamOnly": {
"type": "boolean"
}
},
"required": [
"doi"
],
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

POST /api/site-tools/repair-author-links/bulk

Section titled “POST /api/site-tools/repair-author-links/bulk”

Bulk repair author links Administrative endpoint to scan multiple publications per shard and reconcile author links in bulk. Internal: yes Authentication: betterAuthSession Tags: Site Tools

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"dryRun": {
"type": "boolean"
},
"cesamOnly": {
"type": "boolean"
},
"limitPerShard": {
"type": "integer",
"minimum": 1,
"maximum": 1000
}
},
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

List API keys Administrative endpoint to list API keys used for partner machine-to-machine access. Internal: yes Authentication: betterAuthSession Tags: Site Tools

No parameters.

No request body.

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Create API key Administrative endpoint to create a scoped API key for partner integrations. Internal: yes Authentication: betterAuthSession Tags: Site Tools

No parameters.

Content type: application/json

{
"type": "object",
"properties": {
"client_name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"scopes": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"ingest",
"membership.update"
]
}
},
"rate_limit_per_minute": {
"default": 60,
"type": "integer",
"minimum": 1,
"maximum": 10000
}
},
"required": [
"client_name",
"scopes",
"rate_limit_per_minute"
],
"additionalProperties": false
}

201 - API key created. Plaintext key is returned once.

Section titled “201 - API key created. Plaintext key is returned once.”

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Update API key Administrative endpoint to update active state, scopes, or rate limit of an API key. Internal: yes Authentication: betterAuthSession Tags: Site Tools

NameInTypeRequiredDescription
keyHashpathstringyesSHA-256 hash of the API key.

Content type: application/json

{
"type": "object",
"properties": {
"is_active": {
"type": "boolean"
},
"scopes": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"ingest",
"membership.update"
]
}
},
"rate_limit_per_minute": {
"type": "integer",
"minimum": 1,
"maximum": 10000
}
},
"additionalProperties": false
}

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Revoke API key Administrative endpoint to deactivate an API key. Internal: yes Authentication: betterAuthSession Tags: Site Tools

NameInTypeRequiredDescription
keyHashpathstringyesSHA-256 hash of the API key.

No request body.

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

POST /api/site-tools/api-keys/{keyHash}/rotate

Section titled “POST /api/site-tools/api-keys/{keyHash}/rotate”

Rotate API key Administrative endpoint to issue a new key for an existing client and optionally revoke the old one. Internal: yes Authentication: betterAuthSession Tags: Site Tools

NameInTypeRequiredDescription
keyHashpathstringyesSHA-256 hash of the API key being rotated.

Content type: application/json

{
"type": "object",
"properties": {
"revoke_old": {
"default": true,
"type": "boolean"
}
},
"required": [
"revoke_old"
],
"additionalProperties": false
}

200 - API key rotated. Plaintext new key is returned once.

Section titled “200 - API key rotated. Plaintext new key is returned once.”

Content type: application/json

{
"type": "object",
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}

Content type: application/json

{
"type": "object",
"properties": {
"error": {
"type": "string"
},
"details": {
"oneOf": [
{
"type": "object",
"additionalProperties": true
},
{
"type": "null"
}
]
}
},
"required": [
"error"
],
"additionalProperties": true
}