{"openapi":"3.1.0","info":{"title":"Aeterna","description":"\n## 🏛️ Aeterna — E-ARK Compliant Digital Preservation Platform\n\nAeterna is a multi-tenant digital preservation system conforming to the\nEuropean eArchiving standards (CSIP, SIP, AIP, DIP, PREMIS).\n\n### Standards Compliance\n- **E-ARK CSIP** v2.1.0 — Common Specification for Information Packages\n- **E-ARK SIP** — Submission Information Package specification\n- **E-ARK AIP** — Archival Information Package specification\n- **E-ARK DIP** — Dissemination Information Package specification\n- **PREMIS 3.0** — Preservation metadata standard\n- **METS 1.12** — Metadata Encoding and Transmission Standard\n- **Dublin Core** / **EAD** — Descriptive metadata standards\n\n### Multi-tenant Architecture\nEach client organization (tenant) has:\n- Dedicated MinIO Docker container for isolated storage\n- Dedicated Apache Solr collection for full-text search\n- Role-based access control (RBAC) per tenant\n\n### Authentication\nUse `POST /api/v1/auth/login` to obtain a Bearer token.\nInclude it in requests as: `Authorization: Bearer <token>`\n    ","contact":{"name":"Aeterna Platform","url":"https://github.com/aeterna"},"license":{"name":"EUPL-1.2","url":"https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12"},"version":"0.1.0"},"paths":{"/api/v1/auth/login":{"post":{"tags":["Authentication"],"summary":"Login","description":"Authenticate a user and return a JWT token pair.\n\n- For **platform admins**: leave `tenant_slug` empty\n- For **tenant users**: provide `tenant_slug`","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPairResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["Authentication"],"summary":"Refresh token","description":"Exchange a refresh token for a new token pair.","operationId":"refresh_token_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPairResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["Authentication"],"summary":"Current user info","description":"Get information about the currently authenticated user.","operationId":"get_me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserBasicInfo"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/logout":{"post":{"tags":["Authentication"],"summary":"Logout","description":"Logout (client should discard tokens; server-side revocation TODO).","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/tenants":{"get":{"tags":["Tenants"],"summary":"List all tenants","operationId":"list_tenants_api_v1_tenants_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Active Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantResponse"},"title":"Response List Tenants Api V1 Tenants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Tenants"],"summary":"Create new tenant","description":"Creates a new tenant and provisions:\n- Dedicated MinIO Docker container for storage\n- Apache Solr collection for full-text search\n- Built-in roles (tenant_admin, archivist, reviewer, reader, api_client)","operationId":"create_tenant_api_v1_tenants_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}":{"get":{"tags":["Tenants"],"summary":"Get tenant by ID","operationId":"get_tenant_api_v1_tenants__tenant_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Tenants"],"summary":"Update tenant","operationId":"update_tenant_api_v1_tenants__tenant_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tenants"],"summary":"Delete tenant","description":"Deletes a tenant and deprovisions all associated infrastructure.\nWARNING: This deletes ALL data for this tenant.","operationId":"delete_tenant_api_v1_tenants__tenant_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}/storage":{"get":{"tags":["Tenants"],"summary":"Get storage info","operationId":"get_storage_info_api_v1_tenants__tenant_id__storage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantStorageInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}/reprovision":{"post":{"tags":["Tenants"],"summary":"Re-provision tenant storage","description":"Rebuild MinIO container and Solr collection for an existing tenant.","operationId":"reprovision_tenant_api_v1_tenants__tenant_id__reprovision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}/users":{"get":{"tags":["Tenants"],"summary":"List users in a tenant (platform admin)","description":"List all users belonging to a specific tenant.","operationId":"list_tenant_users_api_v1_tenants__tenant_id__users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserResponse"},"title":"Response List Tenant Users Api V1 Tenants  Tenant Id  Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Tenants"],"summary":"Create user in a tenant (platform admin)","description":"Create a new user inside the specified tenant. Useful for provisioning the first tenant admin.","operationId":"create_tenant_user_api_v1_tenants__tenant_id__users_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{tenant_id}/roles":{"get":{"tags":["Tenants"],"summary":"List roles in a tenant (platform admin)","description":"List built-in and custom roles for a specific tenant.","operationId":"list_tenant_roles_api_v1_tenants__tenant_id__roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{},"title":"Response List Tenant Roles Api V1 Tenants  Tenant Id  Roles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users":{"get":{"tags":["Users"],"summary":"List users in current tenant","operationId":"list_users_api_v1_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserResponse"},"title":"Response List Users Api V1 Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Users"],"summary":"Create user in current tenant","operationId":"create_user_api_v1_users_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["Users"],"summary":"Current user full profile","operationId":"get_my_profile_api_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/{user_id}":{"get":{"tags":["Users"],"summary":"Get user by ID","operationId":"get_user_api_v1_users__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Users"],"summary":"Update user","operationId":"update_user_api_v1_users__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Users"],"summary":"Delete user","operationId":"delete_user_api_v1_users__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/change-password":{"post":{"tags":["Users"],"summary":"Change own password","operationId":"change_password_api_v1_users_me_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChange"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/roles/all":{"get":{"tags":["Users"],"summary":"List all roles in tenant","operationId":"list_roles_api_v1_users_roles_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RoleResponse"},"type":"array","title":"Response List Roles Api V1 Users Roles All Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/users/roles":{"post":{"tags":["Users"],"summary":"Create custom role","operationId":"create_role_api_v1_users_roles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ingest/upload":{"post":{"tags":["Ingest"],"summary":"Upload a SIP for ingestion","description":"Upload a Submission Information Package (SIP) for E-ARK compliant ingestion.\n\n**Supported formats:**\n- **Standard E-ARK SIP** (ZIP): Must follow E-ARK CSIP v2.2.0 structure with root METS.xml\n- **BagIt SIP** (ZIP, RFC 8493, GAP-08): ZIP containing a BagIt bag (bagit.txt + data/ directory).\n  BagIt packages are automatically detected by the pipeline — no extra parameters needed.\n  Checksum verification is performed against the BagIt manifest (manifest-sha256.txt or manifest-md5.txt).\n\n**Optional descriptive metadata:**\n- `ead3_file`: EAD3 finding aid XML (GAP-09)\n- `eac_cpf_file`: EAC-CPF authority record XML (GAP-09)\n- `submission_agreement`: Submission Agreement identifier or URL (GAP-14)\n\nAfter upload, the ingest pipeline starts automatically. Poll the status endpoint\nto track progress.","operationId":"upload_sip_api_v1_ingest_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_sip_api_v1_ingest_upload_post"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ingest/{package_id}/status":{"get":{"tags":["Ingest"],"summary":"Get ingest pipeline status","description":"Poll the current status of an ingest pipeline run.","operationId":"get_ingest_status_api_v1_ingest__package_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/{package_id}/report":{"get":{"tags":["Ingest"],"summary":"Get full ingest report","description":"Get the complete ingest report for a package.","operationId":"get_ingest_report_api_v1_ingest__package_id__report_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/{package_id}/retry":{"post":{"tags":["Ingest"],"summary":"Retry a failed ingest","description":"Retry a failed ingest pipeline from the beginning.","operationId":"retry_ingest_api_v1_ingest__package_id__retry_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages":{"get":{"tags":["Packages"],"summary":"List information packages","description":"Browse the AIP catalog with optional filters.","operationId":"list_packages_api_v1_packages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"package_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by type: SIP, AIP, DIP","title":"Package Type"},"description":"Filter by type: SIP, AIP, DIP"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in title/creator","title":"Search"},"description":"Search in title/creator"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}":{"get":{"tags":["Packages"],"summary":"Get package detail","description":"Get full details of a specific package including files and PREMIS events.","operationId":"get_package_api_v1_packages__package_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackageDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Packages"],"summary":"Mark package as deleted","description":"Soft-delete a package (marks as DELETED status).\nActual storage removal requires a separate preservation action.","operationId":"delete_package_api_v1_packages__package_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/premis":{"get":{"tags":["Packages"],"summary":"Get PREMIS preservation events","description":"Returns the full preservation event chain for a package.","operationId":"get_premis_events_api_v1_packages__package_id__premis_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PremisEventInfo"},"title":"Response Get Premis Events Api V1 Packages  Package Id  Premis Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/premis.xml":{"get":{"tags":["Packages"],"summary":"Download PREMIS XML","description":"Download the PREMIS 3.0 XML document for a package.\n\nGAP-46 FIX: Now includes file-level objectCharacteristics (fixity, size, format PRONOM)\nas required by CS PREMIS v1.0.1 §5.1. Previously called build_premis_container_xml()\nwithout file_objects, producing a PREMIS XML without any premis:file objects.","operationId":"get_premis_xml_api_v1_packages__package_id__premis_xml_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/mets.xml":{"get":{"tags":["Packages"],"summary":"Download METS XML","description":"Download the METS 1.12 XML document for a package.\n\nGAP-43 FIX: The on-demand METS now includes:\n- submission_agreement → metsHdr altRecordID TYPE=\"SUBMISSIONAGREEMENT\"\n- parent_pid (for versioned AIPs) → metsHdr altRecordID TYPE=\"PREVIOUSSUBMISSION\"\n- premis_checksum (SHA-256 of PREMIS XML) → amdSec/digiprovMD/mdRef CHECKSUM (CSIP32 MUST)\nPreviously all three were missing, violating CSIP14, E-ARK AIP versioning spec, and CSIP32.","operationId":"get_mets_xml_api_v1_packages__package_id__mets_xml_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/descriptive-metadata":{"get":{"tags":["Packages"],"summary":"List descriptive metadata files (GAP-09)","description":"Returns information about descriptive metadata files associated with the package (EAD3 finding aids, EAC-CPF authority records, Dublin Core). Types and paths are derived from the package_metadata stored during ingest.","operationId":"get_descriptive_metadata_api_v1_packages__package_id__descriptive_metadata_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DescriptiveMetadataInfo"},"title":"Response Get Descriptive Metadata Api V1 Packages  Package Id  Descriptive Metadata Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/new-version":{"post":{"tags":["Packages","Packages"],"summary":"Create a new AIP version (GAP-12)","description":"GAP-12: E-ARK AIP Versioning — creates a new AIP version that references the current AIP as its parent via parent_id. The new AIP:\n- Inherits storage from the parent (no file re-ingestion required for metadata-only updates)\n- Gets a new UUID, PID and ARK identifier\n- References the parent PID in METS altRecordID TYPE='PREVIOUSSUBMISSION'\n- Records a PREMIS 'modification' event\n\nThe parent AIP status is unchanged (remains ACTIVE). Both versions coexist in the repository per OAIS versioning model.","operationId":"create_new_version_api_v1_packages__package_id__new_version_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}},{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},{"name":"description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Create New Version Api V1 Packages  Package Id  New Version Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search":{"get":{"tags":["Search"],"summary":"Full-text search","description":"Search information packages by title, description, content, and creator. Supports full-text queries and optional filters. Results are sorted by relevance score, then by creation date (newest first).","operationId":"search_packages_api_v1_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query (empty = browse all)","default":"","title":"Q"},"description":"Search query (empty = browse all)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-based)","default":1,"title":"Page"},"description":"Page number (1-based)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":20,"title":"Page Size"},"description":"Results per page"},{"name":"package_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: SIP, AIP, DIP","title":"Package Type"},"description":"Filter: SIP, AIP, DIP"},{"name":"format_puid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by PRONOM PUID (e.g. fmt/18)","title":"Format Puid"},"description":"Filter by PRONOM PUID (e.g. fmt/18)"},{"name":"mime_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by MIME type","title":"Mime Type"},"description":"Filter by MIME type"},{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter from date (ISO 8601)","title":"From Date"},"description":"Filter from date (ISO 8601)"},{"name":"to_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to date (ISO 8601)","title":"To Date"},"description":"Filter to date (ISO 8601)"},{"name":"is_valid","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by validation status","title":"Is Valid"},"description":"Filter by validation status"},{"name":"text_extracted","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter: only packages with extracted text","title":"Text Extracted"},"description":"Filter: only packages with extracted text"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/suggest":{"get":{"tags":["Search"],"summary":"Autocomplete suggestions","description":"Returns title/creator suggestions for autocomplete based on partial query.","operationId":"search_suggest_api_v1_search_suggest_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Partial search term (min 2 chars)","title":"Q"},"description":"Partial search term (min 2 chars)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Search Suggest Api V1 Search Suggest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/stats":{"get":{"tags":["Search"],"summary":"Index statistics","description":"Returns the number of indexed packages and Solr availability for the current tenant.","operationId":"search_stats_api_v1_search_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchStatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/search/reindex/{package_id}":{"post":{"tags":["Search"],"summary":"Re-index a package","description":"Queue a Solr re-indexing job for a specific package (admin only).","operationId":"reindex_package_api_v1_search_reindex__package_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","title":"Package Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/disseminate":{"post":{"tags":["Dissemination"],"summary":"Request DIP generation","description":"Creates a Dissemination Information Package (DIP) from an ACTIVE AIP. Returns 202 Accepted and starts background processing.","operationId":"request_dissemination_api_v1_packages__package_id__disseminate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DisseminateRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DipStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/dip":{"get":{"tags":["Dissemination"],"summary":"Get DIP status","description":"Returns the DIP package linked to this AIP, if one has been generated or is being generated.","operationId":"get_dip_status_api_v1_packages__package_id__dip_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DipStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/dip/download":{"get":{"tags":["Dissemination"],"summary":"Download DIP ZIP","description":"Stream the DIP ZIP file for download. The DIP must be AVAILABLE.","operationId":"download_dip_api_v1_packages__package_id__dip_download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/zip":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/files/{file_id}/content":{"get":{"tags":["Dissemination"],"summary":"Get file content","description":"Stream the raw content of a file within a package. Supports inline preview for PDFs and images.","operationId":"get_file_content_api_v1_packages__package_id__files__file_id__content_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}},{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"File Id"}},{"name":"download","in":"query","required":false,"schema":{"type":"boolean","description":"Force download instead of inline display","default":false,"title":"Download"},"description":"Force download instead of inline display"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stats":{"get":{"tags":["Statistics"],"summary":"Get platform/tenant statistics","description":"Returns real-time statistics for the dashboard.\nPlatform admins see global stats; tenant users see their tenant stats.","operationId":"get_stats_api_v1_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/audit-logs":{"get":{"tags":["Audit Log"],"summary":"List audit log entries","description":"Returns paginated audit log entries with optional filters. Requires admin role.","operationId":"list_audit_logs_api_v1_audit_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by action (e.g. 'user.login', 'package.ingest')","title":"Action"},"description":"Filter by action (e.g. 'user.login', 'package.ingest')"},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resource type (e.g. 'package', 'user')","title":"Resource Type"},"description":"Filter by resource type (e.g. 'package', 'user')"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by specific user ID","title":"User Id"},"description":"Filter by specific user ID"},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by success/failure","title":"Success"},"description":"Filter by success/failure"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter entries from this datetime (ISO 8601)","title":"Date From"},"description":"Filter entries from this datetime (ISO 8601)"},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter entries up to this datetime (ISO 8601)","title":"Date To"},"description":"Filter entries up to this datetime (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit-logs/actions":{"get":{"tags":["Audit Log"],"summary":"List distinct audit log action types","description":"Returns all distinct action strings present in the audit log (for filter dropdowns).","operationId":"list_audit_actions_api_v1_audit_logs_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/preservation/risk-registry":{"get":{"tags":["Preservation"],"summary":"Format risk registry","description":"Returns the list of formats classified by preservation risk level.","operationId":"get_risk_registry_api_v1_preservation_risk_registry_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"risk_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Level"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/preservation/at-risk-packages":{"get":{"tags":["Preservation"],"summary":"Packages containing at-risk formats","description":"Returns packages that contain files in formats classified as high or medium risk.","operationId":"get_at_risk_packages_api_v1_preservation_at_risk_packages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"risk_level","in":"query","required":false,"schema":{"type":"string","default":"high","title":"Risk Level"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/preservation/rechecksum":{"post":{"tags":["Preservation"],"summary":"Trigger re-checksum verification","description":"Launches an async task to re-verify all file checksums for this package.","operationId":"trigger_rechecksum_api_v1_packages__package_id__preservation_rechecksum_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/preservation/revalidate":{"post":{"tags":["Preservation"],"summary":"Trigger E-ARK re-validation","description":"Launches an async task to re-validate this package against current E-ARK specifications.","operationId":"trigger_revalidate_api_v1_packages__package_id__preservation_revalidate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/preservation/migrate":{"post":{"tags":["Preservation"],"summary":"Trigger format migration (PDF → PDF/A)","description":"Launches an async preservation action to convert all PDF files in this AIP to PDF/A archival format (ISO 19005-2, PDF/A-2b by default). Original files in representations/rep1/data/ are preserved unchanged (OAIS principle). Converted files are stored in representations/rep2/data/ with a new METS.xml. A PREMIS 'migration' event is recorded for each converted file. Requires Ghostscript installed in the worker container.","operationId":"trigger_format_migration_api_v1_packages__package_id__preservation_migrate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrateRequest","default":{"target_format":"PDF/A-2b","source_format":"application/pdf"}}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/preservation/status":{"get":{"tags":["Preservation"],"summary":"Get preservation action status","description":"Returns the last known preservation action results for this package.","operationId":"get_preservation_status_api_v1_packages__package_id__preservation_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/compliance-report":{"get":{"tags":["Preservation"],"summary":"E-ARK Compliance Report","description":"Generates a compliance checklist for the package against E-ARK CSIP requirements.","operationId":"get_compliance_report_api_v1_packages__package_id__compliance_report_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/retention-policies":{"get":{"tags":["Retention & Disposal"],"summary":"List retention policies","description":"List all retention policies for the current tenant.","operationId":"list_retention_policies_api_v1_retention_policies_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Show only active policies","default":true,"title":"Active Only"},"description":"Show only active policies"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RetentionPolicyResponse"},"title":"Response List Retention Policies Api V1 Retention Policies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Retention & Disposal"],"summary":"Create retention policy","description":"Create a new retention/disposal policy for the tenant.","operationId":"create_retention_policy_api_v1_retention_policies_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionPolicyCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionPolicyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/retention-policies/{policy_id}":{"get":{"tags":["Retention & Disposal"],"summary":"Get retention policy","description":"Get a specific retention policy.","operationId":"get_retention_policy_api_v1_retention_policies__policy_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Policy Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionPolicyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Retention & Disposal"],"summary":"Update retention policy","description":"Update a retention policy. Changes do NOT retroactively update disposal_due_date.","operationId":"update_retention_policy_api_v1_retention_policies__policy_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Policy Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionPolicyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RetentionPolicyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Retention & Disposal"],"summary":"Deactivate retention policy","description":"Soft-deactivate a retention policy (sets is_active=False).\nExisting package assignments are preserved; disposal_due_date is not changed.","operationId":"deactivate_retention_policy_api_v1_retention_policies__policy_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Policy Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/packages/{package_id}/set-retention":{"post":{"tags":["Retention & Disposal","Retention & Disposal"],"summary":"Assign retention policy to package","description":"Assign a retention policy to an AIP package. Computes disposal_due_date = submitted_at + retention_period_years. Records a PREMIS event for auditability.","operationId":"set_package_retention_api_v1_packages__package_id__set_retention_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRetentionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Set Package Retention Api V1 Packages  Package Id  Set Retention Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Retention & Disposal","Retention & Disposal"],"summary":"Remove retention policy from package","description":"Remove the retention policy assignment from a package.","operationId":"remove_package_retention_api_v1_packages__package_id__set_retention_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"package_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Package Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/retention/approaching":{"get":{"tags":["Retention & Disposal","Retention & Disposal"],"summary":"Packages near/past disposal date","description":"Returns packages whose disposal_due_date is within the next `days` days (or already overdue). Used by preservation staff and the automated retention check task.","operationId":"get_approaching_disposal_api_v1_retention_approaching_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":3650,"minimum":1,"description":"Look-ahead window in days","default":90,"title":"Days"},"description":"Look-ahead window in days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RetentionApproachingItem"},"title":"Response Get Approaching Disposal Api V1 Retention Approaching Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oai":{"get":{"tags":["OAI-PMH"],"summary":"OAI-PMH 2.0 Endpoint","description":"Open Archives Initiative Protocol for Metadata Harvesting. Exposes ACTIVE AIP packages as Dublin Core records, scoped per tenant. Provide Authorization: Bearer <token> or use set=tenant:{slug} to scope results.","operationId":"oai_pmh_oai_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"verb","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"OAI-PMH verb","title":"Verb"},"description":"OAI-PMH verb"},{"name":"identifier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Record identifier (PID)","title":"Identifier"},"description":"Record identifier (PID)"},{"name":"metadataPrefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metadata format prefix","title":"Metadataprefix"},"description":"Metadata format prefix"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"From datestamp","title":"From"},"description":"From datestamp"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Until datestamp","title":"Until"},"description":"Until datestamp"},{"name":"set","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set name (e.g. tenant:acme)","title":"Set"},"description":"Set name (e.g. tenant:acme)"},{"name":"resumptionToken","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Resumption token for paging","title":"Resumptiontoken"},"description":"Resumption token for paging"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"application/xml":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"tags":["System"],"summary":"Health check","description":"Platform health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AuditLogItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"action":{"type":"string","title":"Action"},"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type"},"resource_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Id"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"success":{"type":"boolean","title":"Success"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"details":{"type":"object","title":"Details"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"}},"type":"object","required":["id","tenant_id","user_id","action","resource_type","resource_id","ip_address","user_agent","success","error_message","details","timestamp"],"title":"AuditLogItem"},"AuditLogResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AuditLogItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["items","total","skip","limit","has_more"],"title":"AuditLogResponse"},"Body_upload_sip_api_v1_ingest_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"SIP ZIP file (E-ARK CSIP or BagIt RFC 8493)"},"title":{"type":"string","title":"Title","description":"Package title"},"description":{"type":"string","title":"Description","description":"Package description"},"creator":{"type":"string","title":"Creator","description":"Creator/producer name"},"submission_agreement":{"type":"string","title":"Submission Agreement","description":"GAP-14: Optional Submission Agreement identifier or URL. References the formal agreement between the producer and the archive governing this submission. Will be stored in the AIP METS metsHdr as <altRecordID TYPE='SUBMISSIONAGREEMENT'> per E-ARK SIP v2.x specification."},"ead3_file":{"type":"string","format":"binary","title":"Ead3 File","description":"GAP-09: Optional EAD3 finding aid XML file (Encoded Archival Description 3.0). If provided, will be stored in the AIP under metadata/descriptive/ and referenced as an additional dmdSec in the METS document."},"eac_cpf_file":{"type":"string","format":"binary","title":"Eac Cpf File","description":"GAP-09: Optional EAC-CPF authority record XML file (Encoded Archival Context – Corporate bodies, Persons, Families). If provided, will be stored in the AIP under metadata/descriptive/ and referenced as an additional dmdSec in the METS document."}},"type":"object","required":["file","title"],"title":"Body_upload_sip_api_v1_ingest_upload_post"},"DescriptiveMetadataInfo":{"properties":{"metadata_type":{"type":"string","title":"Metadata Type"},"filename":{"type":"string","title":"Filename"},"aip_path":{"type":"string","title":"Aip Path"},"is_valid":{"type":"boolean","title":"Is Valid"},"summary":{"type":"object","title":"Summary","default":{}},"errors":{"items":{"type":"string"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["metadata_type","filename","aip_path","is_valid"],"title":"DescriptiveMetadataInfo","description":"Summary of a descriptive metadata file associated with a package."},"DipStatusResponse":{"properties":{"id":{"type":"string","title":"Id"},"pid":{"type":"string","title":"Pid"},"status":{"type":"string","title":"Status"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"created_at":{"type":"string","title":"Created At"},"processed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processed At"},"is_available":{"type":"boolean","title":"Is Available"}},"type":"object","required":["id","pid","status","size_bytes","storage_path","parent_id","created_at","processed_at","is_available"],"title":"DipStatusResponse","description":"DIP package status response."},"DisseminateRequest":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"DisseminateRequest","description":"Request body for DIP generation."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IngestReport":{"properties":{"package_id":{"type":"string","title":"Package Id"},"pid":{"type":"string","title":"Pid"},"aip_pid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aip Pid"},"title":{"type":"string","title":"Title"},"creator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator"},"status":{"type":"string","title":"Status"},"is_valid":{"type":"boolean","title":"Is Valid"},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"validation_errors":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Validation Errors","default":[]},"validation_warnings":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Validation Warnings","default":[]},"steps_completed":{"items":{"type":"string"},"type":"array","title":"Steps Completed","default":[]},"storage_bucket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Bucket"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"checksum_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum Sha256"},"premis_events_count":{"type":"integer","title":"Premis Events Count","default":0},"submission_agreement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submission Agreement"},"csip_version":{"type":"string","title":"Csip Version","default":"2.2.0"},"premis_version":{"type":"string","title":"Premis Version","default":"3.0"},"mets_version":{"type":"string","title":"Mets Version","default":"1.12"}},"type":"object","required":["package_id","pid","title","creator","status","is_valid","submitted_at","completed_at"],"title":"IngestReport","description":"Complete ingest report generated after pipeline completion."},"IngestStatusResponse":{"properties":{"package_id":{"type":"string","title":"Package Id"},"pid":{"type":"string","title":"Pid"},"status":{"type":"string","title":"Status"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"pipeline_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipeline Stage"},"progress_pct":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Progress Pct","default":0},"steps":{"items":{"$ref":"#/components/schemas/PipelineStepStatus"},"type":"array","title":"Steps","default":[]},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"validation_errors":{"type":"integer","title":"Validation Errors","default":0},"validation_warnings":{"type":"integer","title":"Validation Warnings","default":0},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["package_id","pid","status","task_id"],"title":"IngestStatusResponse","description":"Current status of an ingest pipeline run."},"IngestUploadResponse":{"properties":{"package_id":{"type":"string","title":"Package Id"},"pid":{"type":"string","title":"Pid"},"status":{"type":"string","title":"Status","default":"UPLOADED"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"},"message":{"type":"string","title":"Message","default":"SIP uploaded successfully. Processing started."},"submitted_at":{"type":"string","format":"date-time","title":"Submitted At"}},"type":"object","required":["package_id","pid","submitted_at"],"title":"IngestUploadResponse","description":"Returned immediately after SIP upload, before processing starts."},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"tenant_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Slug"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"MigrateRequest":{"properties":{"target_format":{"type":"string","title":"Target Format","default":"PDF/A-2b"},"source_format":{"type":"string","title":"Source Format","default":"application/pdf"}},"type":"object","title":"MigrateRequest"},"PackageDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"pid":{"type":"string","title":"Pid"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"package_type":{"type":"string","title":"Package Type"},"status":{"type":"string","title":"Status"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"creator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator"},"submission_agreement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submission Agreement"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"checksum_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum Sha256"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"validation_report":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Validation Report"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"storage_bucket":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Bucket"},"format_id_completed":{"type":"boolean","title":"Format Id Completed"},"virus_scan_completed":{"type":"boolean","title":"Virus Scan Completed"},"text_extracted":{"type":"boolean","title":"Text Extracted"},"package_metadata":{"type":"object","title":"Package Metadata"},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At"},"processed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Processed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"descriptive_metadata_types":{"items":{"type":"string"},"type":"array","title":"Descriptive Metadata Types","default":[]},"representations":{"items":{"$ref":"#/components/schemas/PackageRepresentationInfo"},"type":"array","title":"Representations","default":[]},"premis_events":{"items":{"$ref":"#/components/schemas/PremisEventInfo"},"type":"array","title":"Premis Events","default":[]}},"type":"object","required":["id","pid","external_id","package_type","status","title","description","creator","size_bytes","checksum_sha256","is_valid","validation_report","storage_path","storage_bucket","format_id_completed","virus_scan_completed","text_extracted","package_metadata","submitted_at","processed_at","created_at","updated_at"],"title":"PackageDetail","description":"Full package detail response."},"PackageFileInfo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"filename":{"type":"string","title":"Filename"},"path":{"type":"string","title":"Path"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"checksum_sha256":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checksum Sha256"},"format_puid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Puid"},"format_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format Name"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","filename","path","size_bytes","checksum_sha256","format_puid","format_name","mime_type","created_at"],"title":"PackageFileInfo","description":"A file within a representation."},"PackageListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"pid":{"type":"string","title":"Pid"},"package_type":{"type":"string","title":"Package Type"},"status":{"type":"string","title":"Status"},"title":{"type":"string","title":"Title"},"creator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","pid","package_type","status","title","creator","size_bytes","is_valid","submitted_at","created_at","updated_at"],"title":"PackageListItem","description":"Brief package info for list views."},"PackageListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PackageListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["items","total","skip","limit","has_more"],"title":"PackageListResponse","description":"Paginated list of packages."},"PackageRepresentationInfo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"rep_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rep Type"},"storage_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Path"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"files":{"items":{"$ref":"#/components/schemas/PackageFileInfo"},"type":"array","title":"Files","default":[]}},"type":"object","required":["id","name","rep_type","storage_path","created_at"],"title":"PackageRepresentationInfo","description":"A representation within an information package."},"PasswordChange":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"PasswordChange"},"PipelineStepStatus":{"properties":{"name":{"type":"string","title":"Name"},"status":{"type":"string","enum":["pending","running","completed","failed","skipped"],"title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"type":"object","required":["name","status"],"title":"PipelineStepStatus","description":"Status of a single pipeline step."},"PremisEventInfo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"event_identifier":{"type":"string","title":"Event Identifier"},"event_type":{"type":"string","title":"Event Type"},"event_datetime":{"type":"string","format":"date-time","title":"Event Datetime"},"event_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Detail"},"event_outcome":{"type":"string","title":"Event Outcome"},"event_outcome_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Outcome Detail"},"agent_name":{"type":"string","title":"Agent Name"},"agent_type":{"type":"string","title":"Agent Type"}},"type":"object","required":["id","event_identifier","event_type","event_datetime","event_detail","event_outcome","event_outcome_detail","agent_name","agent_type"],"title":"PremisEventInfo","description":"A PREMIS preservation event for display."},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"RetentionApproachingItem":{"properties":{"package_id":{"type":"string","format":"uuid","title":"Package Id"},"pid":{"type":"string","title":"Pid"},"ark_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ark Id"},"title":{"type":"string","title":"Title"},"disposal_due_date":{"type":"string","format":"date-time","title":"Disposal Due Date"},"disposal_action":{"type":"string","title":"Disposal Action"},"retention_policy_name":{"type":"string","title":"Retention Policy Name"},"days_remaining":{"type":"integer","title":"Days Remaining"},"status":{"type":"string","title":"Status"}},"type":"object","required":["package_id","pid","ark_id","title","disposal_due_date","disposal_action","retention_policy_name","days_remaining","status"],"title":"RetentionApproachingItem","description":"A package approaching or past its disposal due date."},"RetentionPolicyCreate":{"properties":{"name":{"type":"string","maxLength":512,"minLength":1,"title":"Name","description":"Policy name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Human-readable description"},"retention_period_years":{"type":"integer","maximum":999.0,"minimum":1.0,"title":"Retention Period Years","description":"Number of years to retain packages from their submission date"},"disposal_action":{"type":"string","title":"Disposal Action","description":"Action when retention expires: REVIEW | TRANSFER | DESTROY","default":"REVIEW"},"legal_basis":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Legal Basis","description":"Legal/regulatory basis (e.g. 'GDPR Art.5(1)(e)', 'CAD Art.43')"}},"type":"object","required":["name","retention_period_years"],"title":"RetentionPolicyCreate","description":"Request body for creating a new retention policy."},"RetentionPolicyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"retention_period_years":{"type":"integer","title":"Retention Period Years"},"disposal_action":{"type":"string","title":"Disposal Action"},"legal_basis":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legal Basis"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"packages_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Packages Count"}},"type":"object","required":["id","tenant_id","name","description","retention_period_years","disposal_action","legal_basis","is_active","created_at","updated_at"],"title":"RetentionPolicyResponse","description":"Response schema for a retention policy."},"RetentionPolicyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"retention_period_years":{"anyOf":[{"type":"integer","maximum":999.0,"minimum":1.0},{"type":"null"}],"title":"Retention Period Years"},"disposal_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disposal Action"},"legal_basis":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Legal Basis"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"RetentionPolicyUpdate","description":"Request body for updating an existing retention policy."},"RoleCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":2,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions","default":[]}},"type":"object","required":["name"],"title":"RoleCreate"},"RoleResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"is_builtin":{"type":"boolean","title":"Is Builtin"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","description","permissions","is_builtin","created_at"],"title":"RoleResponse"},"SearchHit":{"properties":{"package_id":{"type":"string","title":"Package Id"},"pid":{"type":"string","title":"Pid"},"package_type":{"type":"string","title":"Package Type"},"package_status":{"type":"string","title":"Package Status"},"dc_title":{"type":"string","title":"Dc Title"},"dc_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dc Description"},"dc_creator":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Dc Creator"},"file_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Count"},"total_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Size Bytes"},"formats":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Formats"},"format_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Format Names"},"mime_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Mime Types"},"is_valid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Valid"},"virus_clean":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Virus Clean"},"text_extracted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Text Extracted"},"content_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Preview"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"processed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Processed At"},"submitter_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Submitter Name"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"highlights":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Highlights"}},"type":"object","required":["package_id","pid","package_type","package_status","dc_title"],"title":"SearchHit","description":"A single search result document."},"SearchResponse":{"properties":{"query":{"type":"string","title":"Query"},"hits":{"type":"integer","title":"Hits"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"},"results":{"items":{"$ref":"#/components/schemas/SearchHit"},"type":"array","title":"Results"},"facets":{"type":"object","title":"Facets","default":{}}},"type":"object","required":["query","hits","page","page_size","total_pages","results"],"title":"SearchResponse","description":"Paginated search results with metadata."},"SearchStatsResponse":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"total_indexed":{"type":"integer","title":"Total Indexed"},"solr_available":{"type":"boolean","title":"Solr Available"}},"type":"object","required":["tenant_id","total_indexed","solr_available"],"title":"SearchStatsResponse","description":"Solr index statistics for the tenant."},"SetRetentionRequest":{"properties":{"retention_policy_id":{"type":"string","format":"uuid","title":"Retention Policy Id","description":"UUID of the retention policy to assign"}},"type":"object","required":["retention_policy_id"],"title":"SetRetentionRequest","description":"Request to assign a retention policy to a package."},"TenantCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":2,"title":"Name"},"slug":{"anyOf":[{"type":"string","maxLength":100,"minLength":2},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"TenantCreate"},"TenantResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"storage_provisioned":{"type":"boolean","title":"Storage Provisioned"},"solr_provisioned":{"type":"boolean","title":"Solr Provisioned"},"solr_collection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solr Collection"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"user_count":{"type":"integer","title":"User Count","default":0},"package_count":{"type":"integer","title":"Package Count","default":0}},"type":"object","required":["id","name","slug","description","is_active","storage_provisioned","solr_provisioned","solr_collection","created_at","updated_at"],"title":"TenantResponse"},"TenantStorageInfo":{"properties":{"storage_container":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Container"},"storage_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storage Port"},"storage_provisioned":{"type":"boolean","title":"Storage Provisioned"},"solr_collection":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solr Collection"},"solr_provisioned":{"type":"boolean","title":"Solr Provisioned"}},"type":"object","required":["storage_container","storage_port","storage_provisioned","solr_collection","solr_provisioned"],"title":"TenantStorageInfo","description":"Storage provisioning details (admin only)"},"TenantUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":2},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"config":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Config"}},"type":"object","title":"TenantUpdate"},"TokenPairResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"user":{"$ref":"#/components/schemas/UserBasicInfo"}},"type":"object","required":["access_token","refresh_token","expires_in","user"],"title":"TokenPairResponse"},"UserBasicInfo":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"is_platform_admin":{"type":"boolean","title":"Is Platform Admin"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"}},"type":"object","required":["id","email","full_name","is_platform_admin","tenant_id","permissions"],"title":"UserBasicInfo"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"},"full_name":{"type":"string","maxLength":255,"minLength":1,"title":"Full Name"},"role_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Role Ids","default":[]}},"type":"object","required":["email","password","full_name"],"title":"UserCreate"},"UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active"},"is_platform_admin":{"type":"boolean","title":"Is Platform Admin"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"roles":{"items":{"$ref":"#/components/schemas/RoleResponse"},"type":"array","title":"Roles","default":[]},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions","default":[]}},"type":"object","required":["id","email","full_name","is_active","is_platform_admin","tenant_id","created_at","updated_at","last_login_at"],"title":"UserResponse"},"UserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Full Name"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"role_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Role Ids"}},"type":"object","title":"UserUpdate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}