components: schemas: BlockMetaResponse: additionalProperties: false properties: block_size: type: integer child_cid: items: type: string type: array name: type: string type: type: integer unixfs_size: type: integer required: - name - type - block_size - unixfs_size - child_cid type: object BulkDeleteRequest: additionalProperties: false properties: dry_run: type: boolean records: items: $ref: '#/components/schemas/RecordIdentifier' type: array required: - records type: object BulkDeleteResponse: additionalProperties: false properties: results: items: $ref: '#/components/schemas/RecordResult' type: array required: - results type: object BulkRecordRequest: additionalProperties: false properties: records: items: $ref: '#/components/schemas/RecordRequest' type: array required: - records type: object BulkRecordsResponse: additionalProperties: false properties: records: items: $ref: '#/components/schemas/RecordResponse' type: array required: - records type: object Component: additionalProperties: false type: object ErrorResponse: additionalProperties: false properties: error: type: string required: - error type: object FileManagerItem: additionalProperties: false properties: cid: type: string created: format: date-time type: string depth: type: integer is_directory: type: boolean name: type: string path: type: string size: type: integer type: type: integer unpinnable: type: boolean updated: format: date-time type: string required: - path - name - type - size - is_directory - depth - created - updated - cid - unpinnable type: object FileManagerItemResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/FileManagerItem' type: array total: type: integer required: - data - total type: object GatewayWebsiteResponse: additionalProperties: false properties: domain: type: string status: type: string target_hash: type: string target_type: type: string required: - domain - target_type - target_hash - status type: object GatewayWebsiteStatusResponse: additionalProperties: false properties: domain: type: string is_broken: type: boolean last_checked: type: string status: type: string required: - domain - status - is_broken type: object GetBlockMetaBatchRequest: additionalProperties: false properties: cid: items: type: string type: array required: - cid type: object IPNSKeyListResponse: additionalProperties: false properties: created: format: date-time type: string id: type: integer ipns_name: type: string name: type: string peer_id: type: string required: - id - name - ipns_name - peer_id - created type: object IPNSKeyListResponseResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/IPNSKeyListResponse' type: array total: type: integer required: - data - total type: object IPNSKeyRequest: additionalProperties: false properties: key: type: string name: type: string required: - name type: object IPNSKeyResponse: additionalProperties: false properties: created: format: date-time type: string id: type: integer ipns_name: type: string name: type: string peer_id: type: string required: - id - name - ipns_name - peer_id - created type: object IPNSPublishRequest: additionalProperties: false properties: cid: type: string key_id: type: integer ttl: type: string required: - key_id - cid type: object IPNSPublishResponse: additionalProperties: false properties: name: type: string published: format: date-time type: string sequence: type: integer validity: format: date-time type: string value: type: string required: - name - value - sequence - validity - published type: object IPNSRepublishResponse: additionalProperties: false properties: count: type: integer message: type: string required: - count - message type: object IPNSResolveResponse: additionalProperties: false properties: expired: type: boolean expires: format: date-time type: string name: type: string path: type: string sequence: type: integer value: type: string required: - name - value - sequence - path - expired - expires type: object InfoResponse: additionalProperties: false properties: announcement_addresses: items: type: string type: array connection_addresses: items: type: string type: array peer_id: type: string required: - peer_id - announcement_addresses - connection_addresses type: object Multiaddr: items: $ref: '#/components/schemas/Component' type: array PinRequest: additionalProperties: false properties: cid: type: string meta: additionalProperties: type: string type: object name: type: string origins: items: type: string type: array required: - cid type: object PinResultsResponse: additionalProperties: false properties: count: type: integer results: items: $ref: '#/components/schemas/PinStatusResponse' type: array required: - count - results type: object PinStatusResponse: additionalProperties: false properties: created: format: date-time type: string delegates: items: $ref: '#/components/schemas/Multiaddr' type: array info: additionalProperties: type: string type: object pin: $ref: '#/components/schemas/PinRequest' requestid: type: string status: type: string required: - requestid - status - created - pin - delegates type: object RecordIdentifier: additionalProperties: false properties: name: type: string type: type: string required: - name - type type: object RecordRequest: additionalProperties: false properties: content: type: string disabled: type: boolean name: type: string ttl: type: integer type: type: string required: - name - type - content type: object RecordResponse: additionalProperties: false properties: content: type: string disabled: type: boolean name: type: string ttl: type: integer type: type: string zone_id: type: integer required: - zone_id - name - type - content - ttl - disabled type: object RecordResponseResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/RecordResponse' type: array total: type: integer required: - data - total type: object RecordResult: additionalProperties: false properties: error: type: string name: type: string status: type: string type: type: string required: - name - type - status type: object SSLStatusInfo: additionalProperties: false properties: error: type: string issued_at: format: date-time type: string last_updated_at: format: date-time type: string status: type: string required: - status type: object SSLStatusUpdateRequest: additionalProperties: false properties: error: type: string status: type: string timestamp: type: string required: - status type: object ValidationResponse: additionalProperties: false properties: checked_at: format: date-time type: string message: type: string nameservers: items: type: string type: array valid: type: boolean required: - valid - message - checked_at type: object WebsiteConfigResponse: additionalProperties: false properties: gateway_domain: type: string nameservers: items: type: string type: array type: object WebsiteItem: additionalProperties: false properties: active_cid: type: string created: format: date-time type: string dns_hosting_enabled: type: boolean dns_zone_id: type: integer domain: type: string expired: type: boolean gateway_domain: type: string id: type: integer ipns_key_id: type: integer is_subdomain: type: boolean last_checked_at: format: date-time type: string ssl: $ref: '#/components/schemas/SSLStatusInfo' status: type: string target_hash: type: string target_type: type: string updated: format: date-time type: string validation_expires_at: format: date-time type: string validation_token: type: string required: - id - domain - target_type - target_hash - status - validation_token - dns_hosting_enabled - is_subdomain - created - updated - expired type: object WebsiteItemResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/WebsiteItem' type: array total: type: integer required: - data - total type: object WebsiteRequest: additionalProperties: false properties: dns_hosting_enabled: type: boolean domain: type: string target_hash: type: string target_type: type: string required: - domain - target_type - target_hash type: object WebsiteResponse: additionalProperties: false properties: active_cid: type: string created: format: date-time type: string dns_hosting_enabled: type: boolean dns_zone_id: type: integer domain: type: string expired: type: boolean gateway_domain: type: string id: type: integer ipns_key_id: type: integer is_subdomain: type: boolean last_checked_at: format: date-time type: string ssl: $ref: '#/components/schemas/SSLStatusInfo' status: type: string target_hash: type: string target_type: type: string updated: format: date-time type: string validation_expires_at: format: date-time type: string validation_token: type: string required: - id - domain - target_type - target_hash - status - validation_token - dns_hosting_enabled - is_subdomain - created - updated - expired type: object WebsiteUpdateRequest: additionalProperties: false properties: dns_hosting_enabled: type: boolean domain: type: string target_hash: type: string target_type: type: string type: object WebsiteValidateResponse: additionalProperties: false properties: domain: type: string id: type: integer message: type: string reason: type: string valid: type: boolean required: - id - domain - valid - message - reason type: object ZoneListResponse: additionalProperties: false properties: created_at: format: date-time type: string domain: type: string id: type: integer powerdns_zone_id: type: string status: type: string updated_at: format: date-time type: string user_id: type: integer required: - id - user_id - domain - status - created_at - updated_at type: object ZoneListResponseResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/ZoneListResponse' type: array total: type: integer required: - data - total type: object ZoneRequest: additionalProperties: false properties: domain: type: string nameservers: items: type: string type: array required: - domain type: object ZoneResponse: additionalProperties: false properties: created_at: format: date-time type: string domain: type: string id: type: integer powerdns_zone_id: type: string status: type: string updated_at: format: date-time type: string user_id: type: integer required: - id - user_id - domain - status - created_at - updated_at type: object info: description: |2 ## Portal IPFS Plugin API A comprehensive API for IPFS content management, including pinning services, file operations, IPNS key management, and website hosting. ### IPFS Pinning Service API Compatibility This API is fully compatible with the [IPFS Pinning Service API specification](https://github.com/ipfs/pinning-services-api-spec), an implementation-agnostic API standard for pinning service providers. This ensures interoperability with existing IPFS pinning clients and tools. ### Features - **Pinning**: Add, list, update, and remove pinned content - **Content**: Upload files, retrieve IPFS content, and manage metadata - **IPNS**: Manage IPNS keys and publish content - **Files**: Browse and manage pinned files with directory navigation - **Websites**: Create and manage website hosting with DNS and SSL automation ### Authentication All API endpoints require authentication using JWT tokens obtained from the Portal authentication service. ### Rate Limiting API requests are rate-limited based on user account tier. See Portal documentation for current limits. ### Documentation For detailed API usage examples and integration guides, visit the Portal documentation website. license: name: MIT url: https://opensource.org/licenses/MIT title: Portal IPFS Plugin API version: 1.0.0 openapi: 3.0.0 paths: /api/block/meta/{cid}: get: description: |- Retrieves metadata for a specific IPFS block. Returns block size, type, and child CIDs for the specified content identifier. Useful for inspecting IPFS data structures. See also:.* parameters: - description: 'Content identifier (CID) of the IPFS block. Example: bafybeieffnocaq7t4w4daagvydl32igft5oziyyaebqr6vx6rb3fwh2ab4' in: path name: cid required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/BlockMetaResponse' description: Block metadata "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get block details tags: - Content /api/block/meta/batch: post: description: |- Retrieves metadata for multiple IPFS blocks efficiently. Batch endpoint for getting block information for multiple CIDs in a single request, reducing API calls. See also:.* requestBody: content: application/json: schema: $ref: '#/components/schemas/GetBlockMetaBatchRequest' description: Batch request for block metadata required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get multiple block details tags: - Content /api/dns/zones: get: description: |- Lists all DNS zones owned by the current user. Returns paginated list of zones with filtering support. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/ZoneListResponseResponse' description: List of zones "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List DNS zones tags: - DNS - Zones post: description: |- Creates a new DNS zone for a domain. Creates a zone for managing DNS records. The domain must be valid and not already exist. See also:.* requestBody: content: application/json: schema: $ref: '#/components/schemas/ZoneRequest' description: Zone request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "201": content: application/json: schema: $ref: '#/components/schemas/ZoneResponse' description: Zone created "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Create DNS zone tags: - DNS - Zones /api/dns/zones/{id}: delete: description: |- Deletes a DNS zone and all its records. Performs a soft delete, marking the zone as deleted without removing it from the database. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "204": description: Zone deleted "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Delete DNS zone tags: - DNS - Zones get: description: |- Gets detailed information about a DNS zone. Returns full zone configuration including domain and status. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ZoneResponse' description: Zone details "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get DNS zone tags: - DNS - Zones put: description: |- Updates a DNS zone configuration. Only certain fields can be updated after creation. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/ZoneRequest' description: Zone request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ZoneResponse' description: Zone updated "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Update DNS zone tags: - DNS - Zones /api/dns/zones/{id}/records: get: description: |- Lists all DNS records for a zone. Returns paginated list of records with filtering support. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/RecordResponseResponse' description: List of records "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List DNS records tags: - DNS - Records post: description: |- Creates a new DNS record in a zone. Creates a record with the specified name, type, and content. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/RecordRequest' description: Record request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "201": content: application/json: schema: $ref: '#/components/schemas/RecordResponse' description: Record created "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Create DNS record tags: - DNS - Records /api/dns/zones/{id}/records/{name}/{type}: delete: description: |- Deletes a DNS record from a zone. Removes the specified record from the zone. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string - description: Record name in: path name: name required: true schema: type: string - description: Record type (A, AAAA, CNAME, TXT, etc.) in: path name: type required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "204": description: Record deleted "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Delete DNS record tags: - DNS - Records get: description: |- Gets a specific DNS record by name and type. Returns record details including content and TTL. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string - description: Record name in: path name: name required: true schema: type: string - description: Record type (A, AAAA, CNAME, TXT, etc.) in: path name: type required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/RecordResponse' description: Record details "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get DNS record tags: - DNS - Records put: description: |- Updates an existing DNS record. Updates the content and TTL of a record. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string - description: Record name in: path name: name required: true schema: type: string - description: Record type (A, AAAA, CNAME, TXT, etc.) in: path name: type required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/RecordRequest' description: Record request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/RecordResponse' description: Record updated "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Update DNS record tags: - DNS - Records /api/dns/zones/{id}/records/bulk: post: description: |- Creates multiple DNS records in a zone. Creates all records in the request. Errors are reported for individual records that fail. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/BulkRecordRequest' description: Bulk record request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/BulkRecordsResponse' description: Bulk operation result "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Bulk create DNS records tags: - DNS - Records /api/dns/zones/{id}/records/bulk-delete: post: description: |- Deletes multiple DNS records from a zone. Deletes all records in the request. Can be run in dry-run mode to preview changes. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/BulkDeleteRequest' description: Bulk delete request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/BulkDeleteResponse' description: Bulk delete result "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Bulk delete DNS records tags: - DNS - Records /api/dns/zones/{id}/status: get: description: |- Gets the current status of a DNS zone. Returns zone status and configuration details. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ZoneResponse' description: Zone status "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get DNS zone status tags: - DNS - Zones /api/dns/zones/{id}/validate: post: description: |- Validates nameservers for a DNS zone. Checks if the nameservers are properly configured for the zone. See also:.* parameters: - description: Zone ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ValidationResponse' description: Validation result "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Validate DNS zone tags: - DNS - Zones /api/files: get: description: |- Browses all pinned files and directories. Returns a paginated list of files and folders in the root of your pinned content. Each item includes metadata like size, type, and creation date. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/FileManagerItemResponse' description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Browse pinned files tags: - Files /api/files/breadcrumbs: get: description: |- Gets navigation breadcrumbs for a file path. Returns an array of parent directories from root to the specified path, enabling breadcrumb navigation in file browsers. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/FileManagerItemResponse' description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get navigation breadcrumbs tags: - Files /api/files/directory: get: description: |- Lists contents of a specific directory. Returns files and subdirectories within the specified path. Use for navigating through your pinned content hierarchy. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/FileManagerItemResponse' description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List directory tags: - Files /api/info: get: description: |- Retrieves information about the IPFS node. Returns node identity (peer ID) and network connection addresses. Useful for diagnostics and verifying node connectivity. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/InfoResponse' description: Node information "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get node information tags: - Content /api/ipns/keys: get: description: |- Lists all IPNS keys owned by the current user. Returns metadata for all IPNS keys including peer IDs, names, and creation dates. Useful for managing your IPNS publishing keys. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/IPNSKeyListResponseResponse' description: List of IPNS keys "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List IPNS keys tags: - IPNS post: description: |- Creates or imports an IPNS key for content publishing. Generates a new IPNS key or imports an existing private key. IPNS keys allow publishing and updating mutable addresses that point to IPFS content. See also:.* requestBody: content: application/json: schema: $ref: '#/components/schemas/IPNSKeyRequest' description: IPNS key request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "201": content: application/json: schema: $ref: '#/components/schemas/IPNSKeyResponse' description: IPNS key created "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Create IPNS key tags: - IPNS /api/ipns/keys/{id}: delete: description: |- Deletes an IPNS key (soft delete). Removes the IPNS key from your account. Keys referenced by active websites cannot be deleted. This is a soft delete that preserves records. See also:.* parameters: - description: 'Numeric ID of the IPNS key. Example: 123' in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "204": description: IPNS key deleted "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Delete IPNS key tags: - IPNS get: description: |- Gets detailed information about an IPNS key. Returns full key metadata including peer ID, name, and creation timestamp. Use to inspect key properties before publishing. See also:.* parameters: - description: 'Numeric ID of the IPNS key. Example: 123' in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/IPNSKeyResponse' description: IPNS key details "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get IPNS key tags: - IPNS /api/ipns/keys/{id}/republish: post: description: |- Republishes an IPNS record for a specific key owned by the authenticated user. Re-broadcasts the current IPNS record to the network. Useful for refreshing records that may have fallen out of the DHT. Prerequisites: User must own the specified IPNS key. parameters: - description: IPNS key ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/IPNSRepublishResponse' description: Republish result "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Republish IPNS record tags: - IPNS /api/ipns/publish: post: description: |- Publishes content to an IPNS key. Updates an IPNS key to point to a new CID. Allows updating mutable addresses without changing the URL. Supports setting TTL for record validity. See also:.* requestBody: content: application/json: schema: $ref: '#/components/schemas/IPNSPublishRequest' description: IPNS publish request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/IPNSPublishResponse' description: IPNS publish result "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Publish to IPNS tags: - IPNS /api/ipns/resolve/{name}: get: description: |- Resolves an IPNS name to its current target CID. Looks up the current CID that an IPNS name points to. Returns the resolved CID, validity information, and sequence number. See also:.* parameters: - description: 'IPNS name (peer ID). Example: 12D3KooW...' in: path name: name required: true schema: type: string - description: 'Whether to verify routing through the IPFS network. 1 = verify (queries DHT), 0 = local only. Default: 0' in: query name: check_routing schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/IPNSResolveResponse' description: IPNS resolve result "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Resolve IPNS tags: - IPNS /api/upload: post: description: |- Uploads a file to IPFS and returns the content CID. Supports single file uploads with automatic content verification. The uploaded file is added to IPFS and pinned for persistence. See also:.* requestBody: content: multipart/form-data: schema: additionalProperties: false properties: file: format: binary type: string required: - file type: object description: File to upload required: true responses: "200": description: File uploaded successfully "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Upload file to IPFS tags: - Content /api/upload/tus: options: description: Retrieves information about the TUS server's supported versions, extensions, and limits. responses: "200": description: Success headers: Tus-Checksum-Algorithm: description: Added by the checksum extension. The Tus-Checksum-Algorithm response header MUST be a comma-separated list of the checksum algorithms supported by the server. schema: type: string Tus-Extension: description: The Tus-Extension response header MUST be a comma-separated list of the extensions supported by the Server. If no extensions are supported, the Tus-Extension header MUST be omitted. schema: type: string Tus-Max-Size: description: The Tus-Max-Size response header MUST be a non-negative integer indicating the maximum allowed size of an entire upload in bytes. The Server SHOULD set this header if there is a known hard limit. schema: type: string Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string "204": description: Success headers: Tus-Checksum-Algorithm: description: Added by the checksum extension. The Tus-Checksum-Algorithm response header MUST be a comma-separated list of the checksum algorithms supported by the server. schema: type: string Tus-Extension: description: The Tus-Extension response header MUST be a comma-separated list of the extensions supported by the Server. If no extensions are supported, the Tus-Extension header MUST be omitted. schema: type: string Tus-Max-Size: description: The Tus-Max-Size response header MUST be a non-negative integer indicating the maximum allowed size of an entire upload in bytes. The Server SHOULD set this header if there is a known hard limit. schema: type: string Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string "401": content: application/json: schema: type: string description: Unauthorized "403": content: application/json: schema: type: string description: Forbidden summary: Get TUS Server Capabilities tags: - TUS post: description: TUS protocol POST handler for /api/upload/tus parameters: - description: Must be 0 for creation extension. May be a positive number for Creation With Upload extension. in: header name: Content-Length schema: type: integer - in: header name: Tus-Resumable required: true schema: type: object - description: Added by the Creation With Upload Extension in combination with the checksum extension. Checksum of the included data. in: header name: Upload-Checksum schema: type: object - description: Added by the Concatenation extension. Indicates whether the upload is either a partial or final upload. in: header name: Upload-Concat schema: type: string - description: Added by the Creation Defer Length extension. Indicates that the size of the upload is not known currently. in: header name: Upload-Defer-Length schema: type: integer - in: header name: Upload-Length required: true schema: type: object - description: Added by the Creation extension. The Upload-Metadata request and response header MUST consist of one or more comma-separated key-value pairs. The key and value MUST be separated by a space. The key MUST NOT contain spaces and commas and MUST NOT be empty. The key SHOULD be ASCII encoded and the value MUST be Base64 encoded. All keys MUST be unique. The value MAY be empty. In these cases, the space, which would normally separate the key and the value, MAY be left out. Since metadata can contain arbitrary binary values, Servers SHOULD carefully validate metadata values or sanitize them before using them as header values to avoid header smuggling. in: header name: Upload-Metadata schema: type: string - description: Added by the Creation With Upload Extension. Indicates the offset of the included data. in: header name: Upload-Offset schema: type: object requestBody: content: application/offset+octet-stream: schema: type: object description: Remaining (possibly partial) content of the file. Required if Content-Length > 0. responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "201": description: Created headers: Location: description: Url of the created resource. schema: type: string Tus-Resumable: description: Protocol version schema: type: string Upload-Expires: description: Added by the expiration extension. The Upload-Expires response header indicates the time after which the unfinished upload expires. A Server MAY wish to remove incomplete uploads after a given period of time to prevent abandoned uploads from taking up extra storage. The Client SHOULD use this header to determine if an upload is still valid before attempting to resume the upload. This header MUST be included in every PATCH response if the upload is going to expire. If the expiration is known at the creation, the Upload-Expires header MUST be included in the response to the initial POST request. Its value MAY change over time. If a Client does attempt to resume an upload which has since been removed by the Server, the Server SHOULD respond with the 404 Not Found or 410 Gone status. The latter one SHOULD be used if the Server is keeping track of expired uploads. In both cases the Client SHOULD start a new upload. The value of the Upload-Expires header MUST be in RFC 7231 datetime format. schema: type: string Upload-Offset: description: The Upload-Offset request and response header indicates a byte offset within a resource. The value MUST be a non-negative integer. schema: type: string "400": description: Bad Request headers: Tus-Resumable: description: Protocol version schema: type: string "401": content: application/json: schema: type: string description: Unauthorized "403": content: application/json: schema: type: string description: Forbidden "412": description: Precondition Failed headers: Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string "413": description: Request Entity Too Large headers: Tus-Resumable: description: Protocol version schema: type: string "415": description: Unsupported Media Type headers: Tus-Resumable: description: Protocol version schema: type: string "460": description: Checksums mismatch headers: Tus-Resumable: description: Protocol version schema: type: string summary: TUS POST /api/upload/tus tags: - TUS /api/upload/tus/{id}: delete: description: TUS protocol DELETE handler for /api/upload/tus/:id parameters: - description: The ID of the upload resource. in: path name: id required: true schema: type: string - in: header name: Tus-Resumable required: true schema: type: object responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "204": description: Upload was terminated headers: Tus-Resumable: description: Protocol version schema: type: string "401": content: application/json: schema: type: string description: Unauthorized "403": content: application/json: schema: type: string description: Forbidden "412": description: Precondition Failed headers: Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string summary: TUS DELETE /api/upload/tus/:id tags: - TUS head: description: TUS protocol HEAD handler for /api/upload/tus/:id parameters: - description: The ID of the upload resource. in: path name: id required: true schema: type: string - in: header name: Tus-Resumable required: true schema: type: object responses: "200": description: Returns offset headers: Cache-Control: schema: type: string Tus-Resumable: description: Protocol version schema: type: string Upload-Length: description: The Upload-Length request and response header indicates the size of the entire upload in bytes. The value MUST be a non-negative integer. In the concatenation extension, the Client MUST NOT include the Upload-Length header in the final upload creation schema: type: string Upload-Offset: description: The Upload-Offset request and response header indicates a byte offset within a resource. The value MUST be a non-negative integer. schema: type: string "401": content: application/json: schema: type: string description: Unauthorized "403": content: application/json: schema: type: string description: Forbidden "404": description: Not Found headers: Tus-Resumable: description: Protocol version schema: type: string "410": description: Gone headers: Tus-Resumable: description: Protocol version schema: type: string "412": description: Precondition Failed headers: Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string summary: TUS HEAD /api/upload/tus/:id tags: - TUS options: description: Retrieves information about the TUS server's supported versions, extensions, and limits. parameters: - description: The ID of the upload resource. in: path name: id required: true schema: type: string responses: "200": description: Success headers: Tus-Checksum-Algorithm: description: Added by the checksum extension. The Tus-Checksum-Algorithm response header MUST be a comma-separated list of the checksum algorithms supported by the server. schema: type: string Tus-Extension: description: The Tus-Extension response header MUST be a comma-separated list of the extensions supported by the Server. If no extensions are supported, the Tus-Extension header MUST be omitted. schema: type: string Tus-Max-Size: description: The Tus-Max-Size response header MUST be a non-negative integer indicating the maximum allowed size of an entire upload in bytes. The Server SHOULD set this header if there is a known hard limit. schema: type: string Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string "204": description: Success headers: Tus-Checksum-Algorithm: description: Added by the checksum extension. The Tus-Checksum-Algorithm response header MUST be a comma-separated list of the checksum algorithms supported by the server. schema: type: string Tus-Extension: description: The Tus-Extension response header MUST be a comma-separated list of the extensions supported by the Server. If no extensions are supported, the Tus-Extension header MUST be omitted. schema: type: string Tus-Max-Size: description: The Tus-Max-Size response header MUST be a non-negative integer indicating the maximum allowed size of an entire upload in bytes. The Server SHOULD set this header if there is a known hard limit. schema: type: string Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string "401": content: application/json: schema: type: string description: Unauthorized "403": content: application/json: schema: type: string description: Forbidden summary: Get TUS Upload Capabilities tags: - TUS patch: description: TUS protocol PATCH handler for /api/upload/tus/:id parameters: - description: The ID of the upload resource. in: path name: id required: true schema: type: string - description: Length of the body of this request in: header name: Content-Length required: true schema: type: integer - in: header name: Tus-Resumable required: true schema: type: object - description: Added by the checksum extension. Checksum of the current body payload. in: header name: Upload-Checksum schema: type: object - description: The offset at which the upload should be continued. in: header name: Upload-Offset required: true schema: type: object requestBody: content: application/offset+octet-stream: schema: type: object description: Remaining (possibly partial) content of the file. Required if Content-Length > 0. responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "204": description: Upload offset was updated headers: Tus-Resumable: description: Protocol version schema: type: string Upload-Expires: description: Added by the expiration extension. The Upload-Expires response header indicates the time after which the unfinished upload expires. A Server MAY wish to remove incomplete uploads after a given period of time to prevent abandoned uploads from taking up extra storage. The Client SHOULD use this header to determine if an upload is still valid before attempting to resume the upload. This header MUST be included in every PATCH response if the upload is going to expire. If the expiration is known at the creation, the Upload-Expires header MUST be included in the response to the initial POST request. Its value MAY change over time. If a Client does attempt to resume an upload which has since been removed by the Server, the Server SHOULD respond with the 404 Not Found or 410 Gone status. The latter one SHOULD be used if the Server is keeping track of expired uploads. In both cases the Client SHOULD start a new upload. The value of the Upload-Expires header MUST be in RFC 7231 datetime format. schema: type: string Upload-Offset: description: The Upload-Offset request and response header indicates a byte offset within a resource. The value MUST be a non-negative integer. schema: type: string "400": description: Bad Request headers: Tus-Resumable: description: Protocol version schema: type: string "401": content: application/json: schema: type: string description: Unauthorized "403": content: application/json: schema: type: string description: Forbidden "404": description: Not Found headers: Tus-Resumable: description: Protocol version schema: type: string "409": description: Conflict headers: Tus-Resumable: description: Protocol version schema: type: string "410": description: Gone headers: Tus-Resumable: description: Protocol version schema: type: string "412": description: Precondition Failed headers: Tus-Resumable: description: Protocol version schema: type: string Tus-Version: description: The Tus-Version response header MUST be a comma-separated list of protocol versions supported by the Server. The list MUST be sorted by Server's preference where the first one is the most preferred one. schema: type: string "415": description: Unsupported Media Type headers: Tus-Resumable: description: Protocol version schema: type: string "460": description: Checksums mismatch headers: Tus-Resumable: description: Protocol version schema: type: string summary: TUS PATCH /api/upload/tus/:id tags: - TUS /api/websites: get: description: |- Lists all websites owned by the current user. Returns paginated list of website configurations with status, domain, and target information. Supports filtering by status and other criteria. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteItemResponse' description: List of websites "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List websites tags: - Websites post: description: |- Creates a new website configuration for IPFS content. Sets up a website with a domain name pointing to IPFS content. Supports automatic DNS management and SSL certificate provisioning. Prerequisites: Domain must be configured, target CID must exist See also:.* requestBody: content: application/json: schema: $ref: '#/components/schemas/WebsiteRequest' description: Website request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "201": content: application/json: schema: $ref: '#/components/schemas/WebsiteResponse' description: Website created "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Create website tags: - Websites /api/websites/{domain}/ssl-status: get: description: |- Gets SSL certificate status for a website. Public endpoint for checking SSL certificate status. Returns the current state of SSL provisioning including issuance date, expiration, and any errors. See also:.* parameters: - description: 'Domain name for the website. Example: example.com' in: path name: domain required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteResponse' description: SSL status "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Invalid domain format or malformed request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Website not found or does not exist "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred summary: Get SSL status tags: - Websites /api/websites/{id}: delete: description: |- Deletes a website configuration. Performs a soft delete, marking the website as deleted without removing it from the database. Website remains accessible until garbage collection. See also:.* parameters: - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "204": description: Website deleted "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Delete website tags: - Websites get: description: |- Gets detailed information about a website. Returns full website configuration including domain, target CID, SSL status, and DNS settings. Returns 410 Gone if the target content is broken. See also:.* parameters: - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteResponse' description: Website details "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get website tags: - Websites put: description: |- Updates an existing website configuration. Modifies domain, target CID, DNS hosting, or other settings for a website. Only fields included in the request body will be updated; omitted fields remain unchanged. Changes take effect after validation and DNS propagation. See also:.* parameters: - description: Website ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/WebsiteUpdateRequest' description: Website update request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteResponse' description: Website updated "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Update website tags: - Websites /api/websites/{id}/validate: post: description: |- Triggers DNS TXT record validation for a website. Initiates DNS validation to verify domain ownership. Required before SSL certificate issuance. Returns validation result and any errors. Prerequisites: DNS TXT record must be configured See also:.* parameters: - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteValidateResponse' description: Validation result "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Validate website DNS tags: - Websites /api/websites/config: get: description: |- Returns website hosting configuration including the gateway domain. Clients use this endpoint to discover the gateway domain they should point their custom domain's DNS records to when hosting a website. This is required when dns_hosting_enabled is false and the user manages their own DNS. See also:.* responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteConfigResponse' description: Website configuration "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get website hosting configuration tags: - Websites /internal/websites/{domain}: get: description: |- Gets website configuration for gateway content serving. Internal endpoint used by the gateway to retrieve website configuration. Requires X-Gateway-Secret header for authentication. See also:.* parameters: - description: 'Domain name for the website. Example: example.com' in: path name: domain required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/GatewayWebsiteResponse' description: Website configuration "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get website configuration for gateway tags: - Gateway /internal/websites/{domain}/ssl-status: post: description: |- Webhook endpoint for Caddy plugin to update SSL status. Internal webhook called by Caddy when SSL certificates are issued or updated. Requires X-Gateway-Secret header for authentication. See also:.* parameters: - description: 'Domain name for the website. Example: example.com' in: path name: domain required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/SSLStatusUpdateRequest' description: SSL status update required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteResponse' description: SSL status updated "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Invalid domain format or malformed request body "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Missing or invalid X-Gateway-Secret header in request "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Website domain not found "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Invalid status value or timestamp format in request "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred summary: Update SSL status tags: - internal /internal/websites/{domain}/status: get: description: |- Gets website status for gateway monitoring. Internal endpoint used by the gateway to check website health and availability. Requires X-Gateway-Secret header for authentication. See also:.* parameters: - description: 'Domain name for the website. Example: example.com' in: path name: domain required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/GatewayWebsiteStatusResponse' description: Website status "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get website status for gateway tags: - Gateway /ipfs/{cid}: get: description: |- Retrieves IPFS content by CID. Returns the raw content for the specified CID. Supports streaming for large files. Content is served directly from IPFS storage. See also:.* parameters: - description: The CID of the content. in: path name: cid required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Retrieve IPFS content tags: - Content head: description: |- Checks if content exists on IPFS. Performs a HEAD request to verify content availability without downloading the data. Returns 200 if content exists, 404 if not found. See also:.* parameters: - description: The CID of the content. in: path name: cid required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Check content exists tags: - Content options: description: |- CORS preflight handler for IPFS content. Handles OPTIONS requests for IPFS content endpoints. Most CORS preflight requests are handled by middleware, this serves as a fallback. See also:.* parameters: - description: The CID of the content. in: path name: cid required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: IPFS content OPTIONS tags: - Content /pins: get: description: |- Lists all pinned content with optional filtering. Returns paginated list of pin objects representing content pinned to IPFS. Supports filtering by CID, name, status, metadata, and time range. When no filters are provided, only successfully pinned items are shown. Use this to: - Audit pinned content - Search for specific pins - Monitor pinning status See also: POST /pins (add pin), GET /pins/{id} (get pin details) parameters: - description: 'Filter for pins created after this ISO 8601 timestamp. Example: 2024-01-01T00:00:00Z' in: query name: after schema: type: string - description: 'Filter for pins created before this ISO 8601 timestamp. Example: 2024-01-01T00:00:00Z' in: query name: before schema: type: string - description: 'Filter by content identifier. Supports multiple CIDs for batch queries. Example: QmHash1, QmHash2' in: query name: cid schema: items: type: string type: array - description: 'Maximum number of records to return. Default: 10, Max: 100' in: query name: limit schema: type: integer - description: 'Text matching strategy: ''exact'' for exact match, ''iexact'' for case-insensitive exact match, ''contains'' for partial match' in: query name: match schema: type: string - description: 'Filter by metadata key-value pairs. Format: JSON string. Example: {"type":"document"}' in: query name: meta schema: type: string - description: Filter by pin name. Supports partial matching for search functionality. in: query name: name schema: type: string - description: 'Filter by pin status: ''queued'', ''pinning'', ''pinned'', ''failed'', ''unpinned''. Example: pinned,failed' in: query name: status schema: items: type: string type: array responses: "200": content: application/json: schema: $ref: '#/components/schemas/PinResultsResponse' description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List pinned content tags: - Pinning post: description: |- Pins content to IPFS with optional metadata. Creates a new pin object for the specified CID. Content will be pinned to the IPFS network and made available for retrieval. Supports adding names, origins, and custom metadata for organization. Prerequisites: CID must be valid IPFS content identifier See also: GET /pins (list pins), GET /pins/{id} (get pin details) requestBody: content: application/json: schema: $ref: '#/components/schemas/PinRequest' description: Pin object required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "202": content: application/json: schema: $ref: '#/components/schemas/PinStatusResponse' description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Pin content to IPFS tags: - Pinning /pins/{requestid}: delete: description: |- Removes a pin object, unpins content from the network. Deletes the pin object and unpins the content from IPFS storage. Content may still be retrievable from other nodes that have cached it. See also:.* parameters: - description: 'Unique identifier for the pin operation. Example: bafkreiexample' in: path name: requestid required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "202": description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Remove pinned content tags: - Pinning get: description: |- Retrieves detailed information about a specific pin. Returns the current status, metadata, and progress for a pin object. Use this to monitor pinning operations and verify content availability. See also:.* parameters: - description: 'Unique identifier for the pin operation. Example: bafkreiexample' in: path name: requestid required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/PinStatusResponse' description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get pin details tags: - Pinning post: description: |- Updates metadata and settings for an existing pin. Modifies the name, origins, or metadata of a pinned item without changing the CID. Useful for reorganizing or updating pin information. See also:.* parameters: - description: 'Unique identifier for the pin operation. Example: bafkreiexample' in: path name: requestid required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/PinRequest' description: Pin object required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Success "202": content: application/json: schema: $ref: '#/components/schemas/PinStatusResponse' description: Successful response "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthorized "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Replace pinned content tags: - Pinning servers: - url: /