Integrations API
Installation-scoped integrations API for external CMS consumers such as WordPress and Drupal plugins.
Installation-scoped integrations API for external CMS consumers such as WordPress and Drupal plugins.
Version: 2026-04-22
Raw OpenAPI JSON: /openapi/integrations-api.json
Servers
Section titled “Servers”- https://api.legaciti.org - Legaciti API domain
Endpoints
Section titled “Endpoints”Integrations
Section titled “Integrations”| Method | Path | Summary |
|---|---|---|
| GET | /integrations/v1/health | Integrations API health check |
| GET | /integrations/v1/installation | Resolve current installation |
| GET | /integrations/v1/publications | List publications for integrations consumers |
| GET | /integrations/v1/works | List works for integrations consumers |
| GET | /integrations/v1/projects | List projects for integrations consumers |
| GET | /integrations/v1/people | List people for integrations consumers |
| GET | /integrations/v1/verify/{originId} | Read verification token for one origin |
GET /integrations/v1/health
Section titled “GET /integrations/v1/health”Integrations API health check Authentication: Public Tags: Integrations
Parameters
Section titled “Parameters”No parameters.
Request Body
Section titled “Request Body”No request body.
Responses
Section titled “Responses”200 - Worker health response.
Section titled “200 - Worker health response.”Content type: application/json
{ "type": "object", "properties": { "status": { "type": "string", "enum": [ "ok" ] }, "version": { "type": "string", "enum": [ "2026-04-22" ] } }, "required": [ "status", "version" ]}GET /integrations/v1/installation
Section titled “GET /integrations/v1/installation”Resolve current installation Authentication: API key (X-API-Key) Tags: Integrations
Parameters
Section titled “Parameters”No parameters.
Request Body
Section titled “Request Body”No request body.
Responses
Section titled “Responses”200 - Current installation context.
Section titled “200 - Current installation context.”Content type: application/json
{ "type": "object", "properties": { "installation": { "type": "object", "properties": { "id": { "type": "string" }, "workspace_id": { "type": "string" }, "platform": { "type": "string", "enum": [ "wordpress", "drupal" ] }, "status": { "type": "string", "enum": [ "draft", "pending_verification", "active", "disabled", "revoked", "archived" ] }, "display_name": { "type": "string" }, "description": { "type": [ "string", "null" ] }, "created_at": { "type": "integer" }, "updated_at": { "type": "integer" }, "origins": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "origin": { "type": "string" }, "verification_status": { "type": "string", "enum": [ "pending", "verified", "failed", "revoked" ] }, "verified_at": { "type": [ "integer", "null" ] }, "last_verification_error": { "type": [ "string", "null" ] } }, "required": [ "id", "origin", "verification_status" ] } }, "scopes": { "type": "array", "items": { "type": "string" } } }, "required": [ "id", "workspace_id", "platform", "status", "display_name", "created_at", "updated_at", "origins", "scopes" ] } }, "required": [ "installation" ]}401 - Missing or invalid credential.
Section titled “401 - Missing or invalid credential.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}403 - Credential inactive, expired, or origin rejected.
Section titled “403 - Credential inactive, expired, or origin rejected.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}GET /integrations/v1/publications
Section titled “GET /integrations/v1/publications”List publications for integrations consumers Read-only publication listing for installation-authenticated consumers with the publications.read scope. Authentication: API key (X-API-Key) Tags: Integrations
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | no | |
| per_page | query | integer | no | |
| q | query | string | no | |
| sort | query | string | no | |
| dir | query | string | no | |
| publication_type | query | string | no | |
| publication_year | query | integer | no | |
| min_cited_by | query | integer | no |
Request Body
Section titled “Request Body”No request body.
Responses
Section titled “Responses”200 - Filtered publications visible to the integrations consumer.
Section titled “200 - Filtered publications visible to the integrations consumer.”Content type: application/json
{ "type": "object", "properties": { "publications": { "type": "array", "items": { "type": "object", "properties": { "doi": { "type": "string" }, "author_match_state": { "type": "string", "enum": [ "needs_attention", "complete" ] }, "title": { "oneOf": [ { "type": "string" }, { "type": "object", "additionalProperties": { "type": "string" } }, { "type": "null" } ] }, "doi_url": { "type": "string", "format": "uri" }, "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" } }, "required": [ "doi", "author_match_state", "title", "doi_url", "publication_date", "publication_year", "publication_type", "cited_by_count", "last_fetched_at" ] } }, "page": { "type": "integer" }, "per_page": { "type": "integer" }, "total": { "type": "integer" }, "pages": { "type": "integer" }, "sort": { "type": "string", "enum": [ "last_fetched_at", "publication_date", "cited_by_count" ] }, "dir": { "type": "string", "enum": [ "asc", "desc" ] }, "q": { "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" ]}400 - Invalid query parameters.
Section titled “400 - Invalid query parameters.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}401 - Missing or invalid credential.
Section titled “401 - Missing or invalid credential.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}403 - Credential inactive, origin rejected, or required scope not granted.
Section titled “403 - Credential inactive, origin rejected, or required scope not granted.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}GET /integrations/v1/works
Section titled “GET /integrations/v1/works”List works for integrations consumers Read-only works listing for installation-authenticated consumers with the works.read scope. Authentication: API key (X-API-Key) Tags: Integrations
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | no | |
| per_page | query | integer | no | |
| q | query | string | no | |
| sort | query | string | no | |
| dir | query | string | no | |
| work_type | query | string | no | |
| publication_year | query | integer | no |
Request Body
Section titled “Request Body”No request body.
Responses
Section titled “Responses”200 - Filtered works visible to the integrations consumer.
Section titled “200 - Filtered works visible to the integrations consumer.”Content type: application/json
{ "type": "object", "properties": { "works": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "title": { "type": "string" }, "work_type": { "type": [ "string", "null" ] }, "publication_date": { "type": [ "string", "null" ] }, "publication_year": { "type": [ "integer", "null" ] }, "created_at": { "type": "integer" }, "href": { "type": "string", "format": "uri" } }, "required": [ "id", "title", "work_type", "publication_date", "publication_year", "created_at", "href" ] } }, "page": { "type": "integer" }, "per_page": { "type": "integer" }, "total": { "type": "integer" }, "pages": { "type": "integer" }, "sort": { "type": "string", "enum": [ "created_at", "publication_date", "publication_year" ] }, "dir": { "type": "string", "enum": [ "asc", "desc" ] }, "q": { "type": "string" }, "work_type": { "type": [ "string", "null" ] }, "publication_year": { "type": [ "integer", "null" ] } }, "required": [ "works", "page", "per_page", "total", "pages", "sort", "dir", "q" ]}400 - Invalid query parameters.
Section titled “400 - Invalid query parameters.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}401 - Missing or invalid credential.
Section titled “401 - Missing or invalid credential.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}403 - Credential inactive, origin rejected, or required scope not granted.
Section titled “403 - Credential inactive, origin rejected, or required scope not granted.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}GET /integrations/v1/projects
Section titled “GET /integrations/v1/projects”List projects for integrations consumers Read-only project listing for installation-authenticated consumers with the projects.read scope. Authentication: API key (X-API-Key) Tags: Integrations
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | no | |
| per_page | query | integer | no | |
| q | query | string | no | |
| sort | query | string | no | |
| dir | query | string | no | |
| funding_currency | query | string | no |
Request Body
Section titled “Request Body”No request body.
Responses
Section titled “Responses”200 - Filtered projects visible to the integrations consumer.
Section titled “200 - Filtered projects visible to the integrations consumer.”Content type: application/json
{ "type": "object", "properties": { "projects": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "programme": { "type": "string" }, "title": { "type": "string" }, "abstract": { "type": [ "string", "null" ] }, "start_date": { "type": [ "string", "null" ] }, "end_date": { "type": [ "string", "null" ] }, "cesam_funding_amount": { "type": [ "number", "null" ] }, "cesam_funding_currency": { "type": "string", "enum": [ "EUR", "USD" ] }, "total_funding_amount": { "type": [ "number", "null" ] }, "total_funding_currency": { "type": "string", "enum": [ "EUR", "USD" ] }, "funding_entities": { "type": "array", "items": {} }, "proponent_institution": { "type": [ "string", "null" ] }, "project_logo": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] }, "funding_partner_images": { "type": "array", "items": { "type": "object", "additionalProperties": true } }, "created_at": { "type": "integer" }, "href": { "type": "string", "format": "uri" } }, "required": [ "id", "programme", "title", "abstract", "start_date", "end_date", "cesam_funding_amount", "cesam_funding_currency", "total_funding_amount", "total_funding_currency", "funding_entities", "proponent_institution", "project_logo", "funding_partner_images", "created_at", "href" ] } }, "page": { "type": "integer" }, "per_page": { "type": "integer" }, "total": { "type": "integer" }, "pages": { "type": "integer" }, "sort": { "type": "string", "enum": [ "created_at", "start_date", "end_date" ] }, "dir": { "type": "string", "enum": [ "asc", "desc" ] }, "q": { "type": "string" }, "funding_currency": { "type": [ "string", "null" ], "enum": [ "EUR", "USD", null ] } }, "required": [ "projects", "page", "per_page", "total", "pages", "sort", "dir", "q" ]}400 - Invalid query parameters.
Section titled “400 - Invalid query parameters.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}401 - Missing or invalid credential.
Section titled “401 - Missing or invalid credential.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}403 - Credential inactive, origin rejected, or required scope not granted.
Section titled “403 - Credential inactive, origin rejected, or required scope not granted.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}GET /integrations/v1/people
Section titled “GET /integrations/v1/people”List people for integrations consumers Read-only people listing for installation-authenticated consumers with the people.read scope. Authentication: API key (X-API-Key) Tags: Integrations
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | no | |
| per_page | query | integer | no | |
| q | query | string | no |
Request Body
Section titled “Request Body”No request body.
Responses
Section titled “Responses”200 - Filtered people visible to the integrations consumer.
Section titled “200 - Filtered people visible to the integrations consumer.”Content type: application/json
{ "type": "object", "properties": { "people": { "type": "array", "items": { "type": "object", "properties": { "name": { "oneOf": [ { "type": "string" }, { "type": "object", "additionalProperties": { "type": "string" } } ] }, "photo_url": { "type": [ "string", "null" ] }, "slug": { "type": [ "string", "null" ] }, "people_type": { "type": [ "string", "null" ] } }, "required": [ "name", "photo_url", "slug", "people_type" ] } }, "page": { "type": "integer" }, "per_page": { "type": "integer" }, "total": { "type": "integer" }, "pages": { "type": "integer" }, "q": { "type": "string" } }, "required": [ "people", "page", "per_page", "total", "pages", "q" ]}400 - Invalid query parameters.
Section titled “400 - Invalid query parameters.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}401 - Missing or invalid credential.
Section titled “401 - Missing or invalid credential.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}403 - Credential inactive, origin rejected, or required scope not granted.
Section titled “403 - Credential inactive, origin rejected, or required scope not granted.”Content type: application/json
{ "type": "object", "properties": { "error": { "type": "string" }, "code": { "type": "string" }, "details": { "oneOf": [ { "type": "object", "additionalProperties": true }, { "type": "null" } ] } }, "required": [ "error", "code" ], "additionalProperties": false}GET /integrations/v1/verify/{originId}
Section titled “GET /integrations/v1/verify/{originId}”Read verification token for one origin Plain-text verification endpoint that origin owners mirror from their own site during manual challenge verification. Authentication: Public Tags: Integrations
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
| originId | path | string | yes | Stable integration origin identifier. |
Request Body
Section titled “Request Body”No request body.
Responses
Section titled “Responses”200 - Verification token in plain text.
Section titled “200 - Verification token in plain text.”Content type: text/plain
{ "type": "string", "description": "Plain-text verification token served from the origin-specific proof endpoint."}400 - Missing or malformed origin identifier.
Section titled “400 - Missing or malformed origin identifier.”Content type: text/plain
{ "type": "string"}404 - Origin not found or no verification token available.
Section titled “404 - Origin not found or no verification token available.”Content type: text/plain
{ "type": "string"}