This updated contract resolves implementation blockers by specifying production-grade operations, retry semantics, tenant isolation, and integration contract details.
Retain and extend current services/literature endpoints:
GET /healthzGET /readyzGET /api/v1/papersGET /api/v1/papers/{paper_id}POST /api/v1/ingestionGET /api/v1/ingestion/{job_id}
- All endpoints require
Authorization: Bearer <token>. - Auth validation may be local JWT signature verification or auth-service introspection.
- Tenant context is mandatory and derived from auth claims.
- All responses are JSON with standard fields:
code,message,request_id, and payload data. - Use consistent pagination and sorting schemas.
- Expose manual retry and dead-letter inspection for failed ingestion/extraction jobs.
Create an ingestion job for a source query or document import.
Request body:
sourceenum:pubmed,biorxiv,medrxiv,patent,conference,customquerystringsource_document_idstring, optional for single-document importssource_urlstring, optional for explicit fetchworkspace_idUUID, optional (derived from auth if omitted)project_idUUID, optional (derived from auth if omitted)optionsobjectfetch_modeenum:batch|singlemax_documentsintcrawl_depthint
Response body:
idUUIDsourcequerystatusenum:queued,running,completed,failedcreated_atstarted_atoptionalcompleted_atoptionaltenantmetadata
Fetch ingestion job status, progress, and operational details.
Response body includes:
- all fields from job creation
document_countprocessed_countfailed_countpending_counterror_messagelast_errorbackoff_untildead_letter_counttenantmetadata
Retry a failed ingestion job or a specific failed document.
Request body:
document_idoptionalreasonstring
Response body:
statusretry_scheduled_at
Inspect failed ingestion items.
Response body:
itemsarray of failure recordstotal
List ingested papers with paging and filters.
Query parameters:
pageintpage_sizeintsourceoptionalstatusoptionalqueryoptionalworkspace_idoptionalproject_idoptionaldate_from/date_to
Response body:
itemsarray of paper metadatatotalpagepage_size
Get full paper metadata, extraction status, and available artifacts.
Response fields:
id,title,authors,source,doi,publication_dateabstractsummarycitation_countstatusdocument_statusextraction_statustenantmetadatacitationsentitiesrelationshipstext_chunk_count
List extracted entities for a paper.
Response fields:
- list of entities with
id,type,text,canonical_id,confidence,span,schema,source,created_at - pagination metadata
List extracted relationship candidates.
Response fields:
- list of relationship candidates with
id,from_entity_id,to_entity_id,type,confidence,evidence,metadata,created_at
List citation edges extracted from the paper.
Response fields:
id,cited_source,cited_doi,confidence,created_at
Get duplicate candidates for a document and canonical state.
Response fields:
canonical_document_idduplicate_idssimilarity_scorestatus
Resolve a duplicate cluster.
Request body:
canonical_document_idduplicate_idsactionenum:merge|ignorereasonstring
Response fields:
statusresolved_ataudit_record_id
The literature service uses services/search as the canonical search provider.
GET /api/v1/search?q=<text>&scope=literature&organization_id=<org>&workspace_id=<ws>- Returns keyword search results from the shared search service.
POST /api/v1/searchRequest body:querystringembeddingoptional arrayfiltersoptional objecttenantobject withorganization_id,workspace_id,project_id
- Preferred: the search service exposes a document upsert endpoint such as
POST /api/v1/search/index. - Upsert payload includes:
document_idorganization_idworkspace_idsourcetitleabstractsummarycontent_chunksembeddingmetadata
- Upsert is idempotent and scoped by
document_idand tenant. - If direct upsert is not available, literature publishes
document.indexedevents for search ingestion.
- Primary integration is event-driven.
- Publish versioned events to graph consumer topics.
- Event payloads must include:
event_idevent_typeversiontenantdocument_identitiesrelationshipsevidencecreated_at
- Synchronous graph CRUD direct calls are only allowed as a fallback and must be explicitly documented.
Return dependency status (Postgres, auth, search, broker) and service readiness.
Expose service-level metrics if a metrics endpoint is used directly.
idtitleauthorsabstractsummarysourcedoipublication_datecitation_countstatusdocument_statusextraction_statustenant
iddocument_idtypetextcanonical_idconfidencespanschemasourcecreated_at
iddocument_idfrom_entity_idto_entity_idtypeconfidenceevidencemetadatacreated_at
job_iddocument_idstagestatusstarted_atcompleted_aterror_messageretry_countdead_letter
- Every endpoint requires
Authorization: Bearer <token>. organization_id,workspace_id, andproject_idare derived from auth claims and cannot be overridden with untrusted client input.- Tenant-aware access is enforced by the service, not just by the gateway.
- Admin-only actions respect existing auth roles.
- Standard HTTP codes: 400, 401, 403, 404, 409, 429, 500.
- Structured error returns include
code,message,details, andrequest_id. - Transient errors expose retry guidance when appropriate.
- Rate-limit and backpressure conditions return
429withRetry-After.
- Manual retry endpoints for failed ingestion and extraction tasks.
- Dead-letter inspection.
- Support for source-specific rate limit and backoff state.
- Audit traceability of ingestion and duplicate resolution actions.