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 CertGetResponse: additionalProperties: false properties: cert_pem: type: string domain: type: string namespace: type: string ok: type: boolean owner_name: type: string private_key_pem: type: string tlsa: type: string required: - ok - domain - namespace - private_key_pem - cert_pem - tlsa - owner_name type: object CertPushRequest: additionalProperties: false properties: cert_pem: type: string domain: type: string namespace: type: string private_key_pem: type: string required: - domain - namespace - cert_pem - private_key_pem type: object CertPushResponse: additionalProperties: false properties: ok: type: boolean owner_name: type: string tlsa: type: string required: - ok - tlsa - owner_name type: object Component: additionalProperties: false type: object DAGBlockNodeResponse: additionalProperties: false properties: children: items: type: string type: array cid: type: string size: type: integer required: - cid - size - children type: object DAGResponse: additionalProperties: false properties: nodes: items: $ref: '#/components/schemas/DAGBlockNodeResponse' type: array root_cid: type: string required: - root_cid - nodes type: object DNSDelegation: additionalProperties: false properties: authoritative_records: items: $ref: '#/components/schemas/DNSDelegationRecord' type: array dnssec: type: string dnssec_error: type: string mode: type: string nameservers: items: type: string type: array parent_records: items: $ref: '#/components/schemas/DNSDelegationRecord' type: array type: object DNSDelegationRecord: additionalProperties: false properties: address: type: string ns: type: string type: type: string value: type: string required: - type type: object DomainDANERepublishResponse: additionalProperties: false properties: delegation: $ref: '#/components/schemas/DNSDelegation' domain: type: string gateway_host: type: string id: type: integer namespace: enum: - icann - hns type: string owner_name: type: string published_to_managed_zone: type: boolean ssl: $ref: '#/components/schemas/SSLStatusInfo' status: enum: - draft - records_generated - waiting_delegation - active - self_hosted - error - onchain_managed type: string tlsa_rdata: type: string zone_name: type: string required: - id - domain - namespace - published_to_managed_zone type: object DomainListResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/DomainResponse' type: array total: type: integer required: - data - total type: object DomainRequest: additionalProperties: false properties: config: type: object dns_hosting_enabled: type: boolean domain: type: string generate: type: boolean label: type: string namespace: type: string platform_domain: type: string platform_namespace: type: string required: - domain - namespace type: object DomainResponse: additionalProperties: false properties: checks: items: $ref: '#/components/schemas/ValidationCheck' type: array delegation: $ref: '#/components/schemas/DNSDelegation' dns_hosting_enabled: type: boolean domain: type: string gateway_host: type: string id: type: integer namespace: enum: - icann - hns type: string owner_name: type: string ssl: $ref: '#/components/schemas/SSLStatusInfo' status: enum: - draft - records_generated - waiting_delegation - active - self_hosted - error - onchain_managed type: string tlsa_rdata: type: string zone_name: type: string required: - id - domain - namespace - dns_hosting_enabled type: object DomainUpdateRequest: additionalProperties: false properties: dns_hosting_enabled: type: boolean primary: type: boolean type: object ErrorDetail: additionalProperties: false properties: details: type: string reason: type: string required: - reason type: object ErrorResponse: additionalProperties: false properties: error: $ref: '#/components/schemas/ErrorDetail' 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 namespace: enum: - icann - hns 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 last_published_at: format: date-time type: string name: type: string peer_id: type: string value: 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 last_published_at: format: date-time type: string name: type: string peer_id: type: string value: 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 PingResponse: additionalProperties: false properties: status: type: string required: - status type: object PlatformAvailabilityResponse: additionalProperties: false properties: label: type: string results: items: $ref: '#/components/schemas/PlatformAvailabilityResult' type: array required: - label - results type: object PlatformAvailabilityResult: additionalProperties: false properties: available: type: boolean namespace: type: string platform_domain: type: string required: - platform_domain - namespace - available type: object PlatformDomainListResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/PlatformDomainResponse' type: array total: type: integer required: - data - total type: object PlatformDomainResponse: additionalProperties: false properties: domain: type: string enabled: type: boolean id: type: integer namespace: type: string zone_id: type: integer required: - id - domain - namespace - zone_id - enabled type: object PostUploadResponse: additionalProperties: false properties: CID: type: string required: - CID type: object RecordDeleteRequest: additionalProperties: false properties: content: type: string type: object RecordIdentifier: additionalProperties: false properties: content: type: string 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 id: type: string name: type: string ttl: type: integer type: type: string zone_id: type: integer required: - zone_id - 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: enum: - pending - issuing - ready - failed type: string required: - status type: object SSLStatusUpdateRequest: additionalProperties: false properties: error: type: string status: type: string timestamp: type: string required: - status type: object TLSAUpdateRequest: additionalProperties: false properties: cert_pem: type: string domain: type: string namespace: type: string tlsa: type: string required: - domain - namespace - tlsa - cert_pem type: object UploadResultResponse: additionalProperties: false properties: cid: type: string error: type: string status: enum: - pending - processing - completed - failed - duplicate type: string required: - status type: object ValidationCheck: additionalProperties: false properties: expected: type: string found: type: string message: type: string name: type: string ok: type: boolean required: - name - ok 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 WebsiteChangeEvent: additionalProperties: false properties: cid: type: string created_at: format: date-time type: string domain: type: string event_type: enum: - published - removed type: string id: type: integer user_id: type: integer website_id: type: integer required: - id - event_type - domain - created_at type: object WebsiteChangesResponse: additionalProperties: false properties: events: items: $ref: '#/components/schemas/WebsiteChangeEvent' type: array high_water_mark: type: integer truncated: type: boolean required: - events - high_water_mark - truncated 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 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_record_host: type: string validation_token: type: string zone_id: type: integer 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 generate: type: boolean label: type: string namespace: type: string platform_domain: type: string platform_namespace: type: string target_hash: type: string target_type: type: string required: - 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 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_record_host: type: string validation_token: type: string zone_id: type: integer 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 namespace: type: string target_hash: type: string target_type: type: string type: object WebsiteValidateResponse: additionalProperties: false properties: checks: items: $ref: '#/components/schemas/ValidationCheck' type: array domain: type: string id: type: integer message: type: string reason: type: string valid: type: boolean required: - id - domain - valid - message - reason type: object WorkspaceAccessResponse: additionalProperties: false properties: password: type: string username: type: string required: - username - password type: object WorkspaceListResponseResponse: additionalProperties: false properties: data: items: $ref: '#/components/schemas/WorkspaceResponse' type: array total: type: integer required: - data - total type: object WorkspaceRequest: additionalProperties: false properties: website_id: type: integer type: object WorkspaceResolveResponse: additionalProperties: false properties: created: format: date-time type: string domain: type: string error: type: string id: type: integer label: type: string status: type: string updated: format: date-time type: string website: $ref: '#/components/schemas/WorkspaceResolveWebsite' website_id: type: integer required: - id - label - domain - status - created - updated type: object WorkspaceResolveWebsite: additionalProperties: false properties: id: type: integer status: type: string target_hash: type: string target_type: type: string required: - id - target_type - target_hash - status type: object WorkspaceResponse: additionalProperties: false properties: created: format: date-time type: string domain: type: string error: type: string id: type: integer label: type: string status: type: string updated: format: date-time type: string website_id: type: integer required: - id - label - domain - status - created - updated 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get multiple block details tags: - Content /api/dag/{cid}: get: description: |- Resolves the complete block graph (DAG) for a root CID in a single query. Returns all blocks reachable from the root CID, including their sizes and ordered child relationships. Uses a recursive SQL query internally for efficient batch resolution instead of per-block round-trips. Only blocks with ready status are included. Blocks appearing in multiple paths are deduplicated. See also: GET /block/meta/:cid (single block metadata) parameters: - description: 'Root content identifier (CID) of the DAG to resolve. Example: bafybeieffnocaq7t4w4daagvydl32igft5oziyyaebqr6vx6rb3fwh2ab4' in: path name: cid required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DAGResponse' description: DAG resolved 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Resolve block DAG 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 requestBody: content: application/json: schema: $ref: '#/components/schemas/RecordDeleteRequest' description: 'Optional content selector: when set, only the record with this content is deleted; when the body is absent the whole RRSet is deleted, and a present body with empty content is rejected' responses: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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": content: application/json: schema: $ref: '#/components/schemas/PostUploadResponse' 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Upload file to IPFS tags: - Content /api/upload/result/{identifier}: get: description: |- Retrieves the result of an upload operation by identifier. Returns the root CID for completed uploads, or the current processing status for pending uploads. Accepts either a TUS upload ID or a numeric request ID as the identifier. See also: POST /upload (upload file), GET /pins/{id} (get pin details) parameters: - description: 'TUS upload ID or numeric request ID. Example: abc123-def456 or 42' in: path name: identifier required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/UploadResultResponse' description: Upload 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get upload result 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:.* parameters: - description: Ending index of the items to return (exclusive). Defaults to 10. in: query name: _end schema: type: integer - description: Comma-separated list of sort orders ('asc' or 'desc') corresponding to _sort fields. Defaults to 'asc'. in: query name: _order schema: type: string - description: 'Comma-separated list of fields to sort by. Available fields: target_type, status' in: query name: _sort schema: type: string - description: Starting index of the items to return (0-based). Defaults to 0. in: query name: _start schema: type: integer - description: Filter by domain contains in: query name: domain_contains schema: type: string - description: Filter by domain endswith in: query name: domain_endswith schema: type: string - description: Filter by domain eq in: query name: domain_eq schema: type: string - description: Filter by domain ne in: query name: domain_ne schema: type: string - description: Filter by domain startswith in: query name: domain_startswith schema: type: string - description: Filter by domain contains in: query name: filters[domain][contains] schema: type: string - description: Filter by domain endswith in: query name: filters[domain][endswith] schema: type: string - description: Filter by domain eq in: query name: filters[domain][eq] schema: type: string - description: Filter by domain ne in: query name: filters[domain][ne] schema: type: string - description: Filter by domain startswith in: query name: filters[domain][startswith] schema: type: string - description: Filter by status contains in: query name: filters[status][contains] schema: type: string - description: Filter by status endswith in: query name: filters[status][endswith] schema: type: string - description: Filter by status eq in: query name: filters[status][eq] schema: type: string - description: Filter by status ne in: query name: filters[status][ne] schema: type: string - description: Filter by status startswith in: query name: filters[status][startswith] schema: type: string - description: Filter by target_type contains in: query name: filters[target_type][contains] schema: type: string - description: Filter by target_type endswith in: query name: filters[target_type][endswith] schema: type: string - description: Filter by target_type eq in: query name: filters[target_type][eq] schema: type: string - description: Filter by target_type ne in: query name: filters[target_type][ne] schema: type: string - description: Filter by target_type startswith in: query name: filters[target_type][startswith] schema: type: string - description: Filter by status contains in: query name: status_contains schema: type: string - description: Filter by status endswith in: query name: status_endswith schema: type: string - description: Filter by status eq in: query name: status_eq schema: type: string - description: Filter by status ne in: query name: status_ne schema: type: string - description: Filter by status startswith in: query name: status_startswith schema: type: string - description: Filter by target_type contains in: query name: target_type_contains schema: type: string - description: Filter by target_type endswith in: query name: target_type_endswith schema: type: string - description: Filter by target_type eq in: query name: target_type_eq schema: type: string - description: Filter by target_type ne in: query name: target_type_ne schema: type: string - description: Filter by target_type startswith in: query name: target_type_startswith schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteItemResponse' description: List of websites headers: X-Total-Count: description: Total number of items schema: type: string "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Authentication required "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Not found "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred 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: "201": content: application/json: schema: $ref: '#/components/schemas/WebsiteResponse' description: Website created "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Invalid request body or validation error "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 "410": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Website target content is broken "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: Invalid website ID format "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 "410": content: application/json: schema: $ref: '#/components/schemas/WebsiteResponse' description: Website is broken or deleted "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred 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: Invalid website ID or request body "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Invalid target (CID/IPNS) or DNS hosting value; target CID not pinned (CID_NOT_PINNED) or IPNS key not found (IPNS_KEY_NOT_FOUND) "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred summary: Update website tags: - Websites /api/websites/{id}/domains: get: description: Lists all domains bound to a website. parameters: - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DomainListResponse' description: List of domains "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List website domains tags: - Websites - Domains post: description: Binds a domain to a website under a specific namespace. parameters: - description: Website ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/DomainRequest' description: Domain request required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/DomainResponse' description: Domain 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Add domain to website tags: - Websites - Domains /api/websites/{id}/domains/{domain_id}: delete: description: Removes a domain binding from a website. parameters: - description: Domain ID in: path name: domain_id required: true schema: type: string - description: Website ID in: path name: id required: true schema: type: string responses: "204": description: Domain 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Remove domain from website tags: - Websites - Domains patch: description: 'Updates a bound domain''s per-domain DNS control: whether the portal manages DNS hosting for this binding (dns_hosting_enabled) and/or whether it is the website''s primary (apex) binding. Omitted fields are left unchanged.' parameters: - description: Domain ID in: path name: domain_id required: true schema: type: string - description: Website ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/DomainUpdateRequest' description: Domain update request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/DomainResponse' description: Domain 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Update domain DNS control tags: - Websites - Domains /api/websites/{id}/domains/{domain_id}/dane/republish: post: description: Forces re-publication of a bound domain's DANE records (the _443._tcp. TLSA RRset) into the portal-managed authoritative PowerDNS zone. It re-pushes the stored certificate/key through the same path used by the cert webhook, idempotently overwriting the TLSA. Use this when a TLSA was deleted or went missing and cert renewal did not re-trigger a publish. Only DANE-capable namespaces (e.g. HNS) are supported; a domain with no stored certificate returns 409. parameters: - description: Domain ID in: path name: domain_id required: true schema: type: string - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DomainDANERepublishResponse' 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Force re-publish of domain DANE records tags: - Websites - Domains /api/websites/{id}/domains/{domain_id}/dns-requirements: get: description: Returns the DNS records a user must publish to complete domain delegation for a bound domain. For HNS this includes the DS/NS/GLUE parent records (publish in the HNS wallet) and authoritative NS/TLSA records; for ICANN it returns the nameservers. parameters: - description: Domain ID in: path name: domain_id required: true schema: type: string - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DomainResponse' description: Domain DNS requirements "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get domain DNS delegation requirements tags: - Websites - Domains /api/websites/{id}/domains/{domain_id}/onchain: post: description: Reclassifies a bound domain as on-chain managed (e.g. a Handshake HIP-5 name whose NS now points at an external contract). Deletes the portal-managed PowerDNS zone and DNSSEC for the binding and switches ownership verification to the TXT token; DANE/SSL state is retained. One-way. parameters: - description: Domain ID in: path name: domain_id required: true schema: type: string - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DomainResponse' description: Converted domain "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Reclassify domain as on-chain managed tags: - Websites - Domains /api/websites/{id}/domains/{domain_id}/verify: post: description: Triggers verification of domain delegation. parameters: - description: Domain ID in: path name: domain_id required: true schema: type: string - description: Website ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/DomainResponse' description: Verification 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Verify domain delegation tags: - Websites - Domains /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: Invalid website ID format "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: 'DNS validation failed: verification TXT record not published or domain does not resolve (DNS_VALIDATION_FAILED)' "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get website hosting configuration tags: - Websites /api/websites/platform-domains: get: description: Lists the platform-owned root domains that are enabled and available for users to claim free subdomains under. Returns the standard paginated list shape ({data, total}), ordered by domain. Only enabled roots are returned. responses: "200": content: application/json: schema: $ref: '#/components/schemas/PlatformDomainListResponse' description: List of supported platform domains "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List supported platform domains tags: - Websites - PlatformDomains /api/websites/platform-domains/availability: get: description: Checks, for a candidate label, whether it is claimable on each enabled platform (free-subdomain) root. Returns one result per root. Auth-required; only probes platform-owned roots, never user-managed zones. parameters: - description: Candidate subdomain label in: query name: label schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/PlatformAvailabilityResponse' description: Availability by root "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Check platform subdomain availability tags: - Websites - PlatformDomains /api/workspaces: get: description: Lists workspaces owned by the authenticated user, including unattached workspaces, filtered, sorted, and paginated. Returns the standard paginated list shape ({data, total}). responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceListResponseResponse' description: Workspaces "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List workspaces tags: - Workspaces post: description: Creates a workspace owned by the authenticated user. Optionally pass website_id to attach it to a website the user owns (the publish link); omit it to create an unattached workspace that needs no Website record or domain. Building in a workspace is separate from publishing. requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkspaceRequest' description: Workspace request required: true responses: "201": content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' description: Created workspace "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Create workspace tags: - Workspaces /api/workspaces/{id}: delete: description: Marks a workspace deleting, revokes its portal API key, deletes the application (and storage) before the database, treats provider 404 as already deleted, and soft-deletes the workspace. parameters: - description: Workspace ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' description: Deleted workspace "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: Workspace not found "409": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Workspace is already being deleted "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Delete workspace tags: - Workspaces get: description: Returns a workspace owned by the authenticated user. parameters: - description: Workspace ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' description: Workspace "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get workspace tags: - Workspaces /api/workspaces/{id}/access: get: description: Returns the owner's proxy Basic Auth credentials. Pass ?rotate=true to rotate them. Only the proxy credential is returned; the portal API key and database password are never exposed. parameters: - description: Workspace ID in: path name: id required: true schema: type: string - description: Rotate the proxy credential before returning in: query name: rotate schema: type: boolean responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceAccessResponse' description: Access credentials "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get workspace access credentials tags: - Workspaces /api/workspaces/{id}/attach: post: description: Links an existing unattached workspace (owned by the user) to a website the user owns. Verifies ownership of both and prevents duplicate attachment. Only records the publish link; it never changes the workspace authoring hostname. parameters: - description: Workspace ID in: path name: id required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkspaceRequest' description: Workspace request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' description: Attached workspace "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Attach workspace to website tags: - Workspaces /api/workspaces/{id}/resume: post: description: Starts a suspended workspace's application (and, per configuration, its dedicated database), refreshes the runtime environment, waits for readiness, and marks it ready. parameters: - description: Workspace ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' description: Ready workspace "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Resume workspace tags: - Workspaces /api/workspaces/{id}/suspend: post: description: Stops a ready workspace's application (and, per configuration, its dedicated database) and marks it suspended. The database and storage are preserved by default. parameters: - description: Workspace ID in: path name: id required: true schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceResponse' description: Suspended workspace "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Suspend workspace tags: - Workspaces /api/workspaces/resolve: get: description: Lets a runtime container resolve its own workspace identity from the Coolify-injected COOLIFY_RESOURCE_UUID (the application/resource UUID) plus its workspace PORTAL_API_KEY. The API-key owner must match the workspace owner and the resource UUID must match the workspace's application_resource_id; a mismatch returns not-found. Returns workspace data plus the optional Website publish relationship, never exposing secrets. parameters: - description: The Coolify-injected application/resource UUID in: query name: resource_uuid schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WorkspaceResolveResponse' description: Resolved workspace "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Bad request "401": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Unauthenticated or invalid API key "403": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Forbidden "404": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Workspace not found for this resource UUID/API key "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Missing resource_uuid "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Resolve a workspace's runtime identity tags: - Workspaces /internal/dns/cert: post: description: Internal endpoint for Caddy to push a cert and receive computed TLSA. requestBody: content: application/json: schema: $ref: '#/components/schemas/CertPushRequest' description: Cert push request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/CertPushResponse' description: TLSA computed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Push certificate and receive TLSA tags: - Gateway - DNS /internal/dns/cert/{domain}: get: description: Internal endpoint for Caddy to fetch the stored DANE key/cert. Returns 404 if none exists yet. parameters: - description: Domain to fetch in: path name: domain required: true schema: type: string - description: 'Namespace: hns or icann' in: query name: namespace schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/CertGetResponse' description: Existing DANE key and cert "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Fetch existing DANE certificate and key tags: - Gateway - DNS /internal/dns/tlsa: post: description: Internal endpoint for Caddy to push computed TLSA records. requestBody: content: application/json: schema: $ref: '#/components/schemas/TLSAUpdateRequest' description: TLSA update request required: true responses: "200": content: application/json: schema: $ref: '#/components/schemas/CertPushResponse' description: TLSA 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Update TLSA record tags: - Gateway - DNS /internal/ping: get: description: Returns service liveness status. Requires X-Gateway-Secret header for authentication. responses: "200": content: application/json: schema: $ref: '#/components/schemas/PingResponse' description: Service is alive "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Health check tags: - Gateway /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: Invalid domain format "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 "410": content: application/json: schema: $ref: '#/components/schemas/GatewayWebsiteResponse' description: Website is broken or deleted "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred 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: Invalid domain format "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 "410": content: application/json: schema: $ref: '#/components/schemas/GatewayWebsiteStatusResponse' description: Website is broken or deleted "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred summary: Get website status for gateway tags: - Gateway /internal/websites/changes: get: description: |- Returns durable website lifecycle changes (published, removed) after the supplied cursor, in ascending durable-ID order, together with the current replay high-water mark. The gateway calls this after an SSE reconnect to discover domains it missed during the gap without relying on visitor traffic. Requires X-Gateway-Secret header for authentication. parameters: - description: Durable event cursor to resume after. Returns all events with id > after. Omit to start from the beginning of the retained window. in: query name: after schema: type: string responses: "200": content: application/json: schema: $ref: '#/components/schemas/WebsiteChangesResponse' description: Reconciled changes "400": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Invalid after cursor "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error occurred summary: Reconcile website changes tags: - Gateway /internal/websites/events: get: description: |- Server-Sent Events endpoint for gateway-to-portal communication. Streams website lifecycle events (published, removed) in real time. Supports Last-Event-ID replay of durable events after a reconnect. Requires X-Gateway-Secret header for authentication. responses: "200": description: SSE event stream "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Stream website events via SSE 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: List pinned content tags: - Pinning options: description: |- CORS preflight handler for pins endpoints. Handles OPTIONS requests for pins endpoints. Most CORS preflight requests are handled by middleware, this serves as a fallback. See also:.* 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Pins OPTIONS 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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get pin details tags: - Pinning options: description: |- CORS preflight handler for pin detail endpoints. Handles OPTIONS requests for pin detail endpoints. Most CORS preflight requests are handled by middleware, this serves as a fallback. 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 "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Pin detail OPTIONS 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: "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Replace pinned content tags: - Pinning /routing/v1/ipns/{name}: get: description: |- Returns the signed IPNS record for the given peer ID. Implements the IPFS Delegated Routing V1 HTTP API (IPIP-337). The response is a raw IPNS record in binary format (application/vnd.ipfs.ipns-record). Accepts both CIDv1 (bafzaajaiaejc...) and raw peer ID (12D3KooW...) formats. See also: https://specs.ipfs.tech/ipips/ipip-337/ parameters: - description: Peer ID of the IPNS key (CIDv1 or raw peer ID format) in: path name: name required: true schema: type: string responses: "200": content: application/vnd.ipfs.ipns-record: schema: type: string description: IPNS record "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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Get IPNS record tags: - Routing /routing/v1/providers/{cid}: get: description: |- Returns provider records for the given CID. Implements the IPFS Delegated Routing V1 HTTP API (IPIP-337). Supports both JSON and streaming NDJSON response formats via content negotiation (Accept header). See also: https://specs.ipfs.tech/ipips/ipip-337/ parameters: - description: Content identifier in: path name: cid required: true schema: type: string responses: "200": content: application/x-ndjson: schema: type: string description: Provider 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 "422": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Validation failed "500": content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' description: Internal server error summary: Find providers for a CID tags: - Routing servers: - url: /