{
  "openapi": "3.1.0",
  "info": {
    "title": "C2PA Signing Service HTTP API",
    "description": "HTTP API for signing, packaging, and querying C2PA processing jobs.",
    "version": "0.1.11"
  },
  "paths": {
    "/v2/c2pa/audio": {
      "post": {
        "tags": [
          "c2pa-audio"
        ],
        "summary": "Handle async C2PA audio signing",
        "operationId": "submitC2paAudioJob",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paAudioRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/c2pa/fragmented": {
      "post": {
        "tags": [
          "c2pa-fragmented"
        ],
        "summary": "Handle async C2PA fragmented (HLS) signing",
        "operationId": "submitC2paFragmentedJob",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paFragmentedRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/c2pa/package": {
      "post": {
        "tags": [
          "c2pa-package"
        ],
        "summary": "Handle async package and sign operation",
        "operationId": "submitC2paPackageJob",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paPackageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/c2pa/video": {
      "post": {
        "tags": [
          "c2pa-video"
        ],
        "summary": "Handle async C2PA video signing",
        "operationId": "submitC2paVideoJob",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paVideoRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/health": {
      "get": {
        "tags": [
          "health"
        ],
        "summary": "Health check endpoint",
        "operationId": "getHealth",
        "responses": {
          "200": {
            "description": "Service is healthy"
          }
        }
      }
    },
    "/v2/jobs/{id}": {
      "get": {
        "tags": [
          "jobs"
        ],
        "summary": "Get job status by ID",
        "operationId": "getJobStatus",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Job identifier",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Job status retrieved",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResultResponse"
                }
              }
            }
          },
          "404": {
            "description": "Job was not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "JOB_NOT_FOUND",
                    "message": "Job not found: batch-missing"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/package": {
      "post": {
        "tags": [
          "package"
        ],
        "summary": "Handle async media packaging",
        "operationId": "submitPackageJob",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job accepted",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/sync/c2pa/audio": {
      "post": {
        "tags": [
          "c2pa-audio"
        ],
        "summary": "Handle sync C2PA audio signing",
        "operationId": "runC2paAudioSync",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paAudioRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job completed within the synchronous timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResultResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "408": {
            "description": "Synchronous wait timed out",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "REQUEST_TIMEOUT",
                    "message": "Request timed out waiting for job completion"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/sync/c2pa/fragmented": {
      "post": {
        "tags": [
          "c2pa-fragmented"
        ],
        "summary": "Handle sync C2PA fragmented (HLS) signing",
        "operationId": "runC2paFragmentedSync",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paFragmentedRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job completed within the synchronous timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResultResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "408": {
            "description": "Synchronous wait timed out",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "REQUEST_TIMEOUT",
                    "message": "Request timed out waiting for job completion"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/sync/c2pa/package": {
      "post": {
        "tags": [
          "c2pa-package"
        ],
        "summary": "Handle sync package and sign operation",
        "operationId": "runC2paPackageSync",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paPackageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job completed within the synchronous timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResultResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "408": {
            "description": "Synchronous wait timed out",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "REQUEST_TIMEOUT",
                    "message": "Request timed out waiting for job completion"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/sync/c2pa/video": {
      "post": {
        "tags": [
          "c2pa-video"
        ],
        "summary": "Handle sync C2PA video signing",
        "operationId": "runC2paVideoSync",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/C2paVideoRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job completed within the synchronous timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResultResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "408": {
            "description": "Synchronous wait timed out",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "REQUEST_TIMEOUT",
                    "message": "Request timed out waiting for job completion"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/sync/package": {
      "post": {
        "tags": [
          "package"
        ],
        "summary": "Handle sync media packaging",
        "operationId": "runPackageSync",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PackageRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Job completed within the synchronous timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JobResultResponse"
                }
              }
            }
          },
          "400": {
            "description": "Request validation failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "invalid_input_type": {
                    "summary": "Unsupported input type for this endpoint",
                    "value": {
                      "error": {
                        "code": "INVALID_INPUT_TYPE",
                        "message": "Invalid input type at index 1",
                        "details": {
                          "input_index": 1
                        }
                      }
                    }
                  },
                  "validation_failed": {
                    "summary": "Payload validation failed",
                    "value": {
                      "error": {
                        "code": "VALIDATION_FAILED",
                        "message": "Validation failed: inputs: length is lower than 1"
                      }
                    }
                  }
                }
              }
            }
          },
          "408": {
            "description": "Synchronous wait timed out",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "example": {
                  "error": {
                    "code": "REQUEST_TIMEOUT",
                    "message": "Request timed out waiting for job completion"
                  }
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                },
                "examples": {
                  "internal_error": {
                    "summary": "Unexpected internal error",
                    "value": {
                      "error": {
                        "code": "INTERNAL_ERROR",
                        "message": "An internal error occurred. Please try again later."
                      }
                    }
                  },
                  "processing_failed": {
                    "summary": "Processing failed",
                    "value": {
                      "error": {
                        "code": "PROCESSING_FAILED",
                        "message": "Processing failed. Please check your request and try again."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v2/watermark": {
      "post": {
        "tags": [
          "softbinding"
        ],
        "summary": "Coming soon",
        "description": "Softbinding watermark creation is not implemented yet.",
        "operationId": "submitWatermarkJob",
        "responses": {
          "501": {
            "description": "Coming soon",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                },
                "example": "Coming soon"
              }
            }
          }
        }
      }
    },
    "/v2/watermark/{id}": {
      "get": {
        "tags": [
          "softbinding"
        ],
        "summary": "Coming soon",
        "description": "Softbinding watermark retrieval is not implemented yet.",
        "operationId": "getWatermarkJob",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Watermark job identifier",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "501": {
            "description": "Coming soon",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                },
                "example": "Coming soon"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApiAssertionDef": {
        "type": "object",
        "description": "A single custom assertion to embed in the C2PA manifest.\n\nOnly JSON payloads are accepted at this endpoint. Use a reverse-domain label\n(`com.example.label`) to avoid collisions with standard C2PA assertions.",
        "required": [
          "label",
          "data"
        ],
        "properties": {
          "data": {
            "description": "Arbitrary JSON payload embedded in the manifest assertion."
          },
          "label": {
            "type": "string",
            "description": "Assertion label, e.g. `\"com.example.rights\"`."
          }
        }
      },
      "ApiErrorBody": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "details": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiErrorDetails"
              }
            ]
          },
          "message": {
            "type": "string"
          }
        }
      },
      "ApiErrorDetails": {
        "type": "object",
        "description": "Error details for API responses",
        "properties": {
          "field": {
            "type": [
              "string",
              "null"
            ]
          },
          "input_index": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          }
        }
      },
      "ApiErrorResponse": {
        "type": "object",
        "description": "API error response structure",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/ApiErrorBody"
          }
        }
      },
      "ApiInputRef": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "path",
              "type"
            ],
            "properties": {
              "path": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "local_file_path"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "path",
              "type"
            ],
            "properties": {
              "path": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "local_folder_path"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "url",
              "type"
            ],
            "properties": {
              "filename_hint": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "remote_file_url"
                ]
              },
              "url": {
                "type": "string"
              }
            }
          },
          {
            "type": "object",
            "required": [
              "url",
              "type"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "remote_folder_url"
                ]
              },
              "url": {
                "type": "string"
              }
            }
          }
        ],
        "description": "Where to read an input file or folder from.\n\n`RemoteFileUrl`/`RemoteFolderUrl` cover both HTTP(S) and S3 sources: the\nscheme of `url` (`https://` vs `s3://`) selects the resolver at request\ntime, there is no separate variant per provider. HTTP has no request-level\nauth mechanism; use a presigned URL to grant scoped, temporary access. S3\naccess (credentials, allowed buckets) is configured server-side and never\nappears in the request body.\n\nNote: an in-request (multipart) upload variant is intentionally not\ndocumented here yet, since no `/v2` endpoint can currently accept one.",
        "examples": [
          {
            "type": "local_file_path",
            "path": "./fixtures/input/local-video.mp4"
          },
          {
            "type": "local_folder_path",
            "path": "./fixtures/input/publication"
          },
          {
            "type": "remote_file_url",
            "url": "https://media.example.com/input/video.mp4",
            "filename_hint": "video.mp4"
          },
          {
            "type": "remote_folder_url",
            "url": "https://media.example.com/input/publication/"
          },
          {
            "type": "remote_file_url",
            "url": "s3://media-bucket/input/video.mp4",
            "filename_hint": "video.mp4"
          },
          {
            "type": "remote_folder_url",
            "url": "s3://media-bucket/input/publication/"
          }
        ]
      },
      "ApiOutputSpec": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "type"
            ],
            "properties": {
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "prefix": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "local"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "bucket",
              "type"
            ],
            "properties": {
              "bucket": {
                "type": "string"
              },
              "name": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "prefix": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "s3"
                ]
              }
            }
          }
        ],
        "description": "Output specification for API requests.\n\nThe `output` section selects the destination and placement: `prefix` is an\noptional caller namespace and `name` an optional logical output folder/base;\neach input contributes its own leaf. The file-leaf naming convention is\nconfigured per output sink in the service config, not per request. Omitting\n`output` is equivalent to `local` with no fields.\n\nThis is pure request data and is always available; whether an `s3` destination\ncan actually be served is a deployment concern (the `s3` build feature and the\nconfigured bucket allow-list), resolved by the output sink factory and rejected\nby request validation when unavailable.",
        "examples": [
          {
            "type": "local",
            "name": "exports"
          },
          {
            "type": "s3",
            "bucket": "processed-media",
            "prefix": "exports/c2pa",
            "name": "demo-publication"
          }
        ]
      },
      "ApiParent": {
        "oneOf": [
          {
            "type": "object",
            "description": "Opaque reference token (no file resolved; bare ingredient).",
            "required": [
              "reference",
              "type"
            ],
            "properties": {
              "reference": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "reference"
                ]
              }
            }
          },
          {
            "type": "object",
            "description": "Actual media file whose C2PA manifest is read and included in the chain.",
            "required": [
              "source",
              "type"
            ],
            "properties": {
              "source": {
                "$ref": "#/components/schemas/ApiParentFileSource"
              },
              "type": {
                "type": "string",
                "enum": [
                  "file"
                ]
              }
            }
          }
        ],
        "description": "Global or per-input parent manifest source."
      },
      "ApiParentFileSource": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "path",
              "type"
            ],
            "properties": {
              "path": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "local_file_path"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "url",
              "type"
            ],
            "properties": {
              "filename_hint": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "remote_file_url"
                ]
              },
              "url": {
                "type": "string"
              }
            }
          }
        ],
        "description": "Allowed input types for a file-based parent. Only single-file variants."
      },
      "ApiParentOverride": {
        "type": "object",
        "description": "Per-input parent override.",
        "required": [
          "input_index"
        ],
        "properties": {
          "input_index": {
            "type": "integer",
            "minimum": 0
          },
          "parent": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiParent",
                "description": "None = disable parent for this input."
              }
            ]
          }
        }
      },
      "C2paAudioParams": {
        "type": "object",
        "description": "Parameters for C2PA audio signing.",
        "properties": {
          "assertions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAssertionDef"
            },
            "description": "Optional custom assertions to embed in the C2PA manifest."
          },
          "parent": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiParent",
                "description": "Optional parent manifest to attach as a provenance ingredient."
              }
            ]
          },
          "parent_overrides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiParentOverride"
            },
            "description": "Per-input overrides for the parent manifest."
          }
        },
        "example": {}
      },
      "C2paAudioRequest": {
        "type": "object",
        "description": "Request for the C2PA audio signing endpoint.\n\nInputs must be single files whose extension names a container the C2PA SDK\ncan sign: `mp3`, `wav`, `flac`, `m4a`, and `mp4`/`m4v` for audio-only\nassets. An input with no derivable extension is accepted and its media type\nis settled during resolution.",
        "required": [
          "inputs"
        ],
        "properties": {
          "inputs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiInputRef"
            }
          },
          "output": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiOutputSpec"
              }
            ]
          },
          "params": {
            "$ref": "#/components/schemas/C2paAudioParams"
          }
        },
        "examples": [
          {
            "inputs": [
              {
                "type": "local_file_path",
                "path": "./fixtures/input/local-audio.mp3"
              },
              {
                "type": "remote_file_url",
                "url": "https://media.example.com/input/interview.wav",
                "filename_hint": "interview.wav"
              },
              {
                "type": "remote_file_url",
                "url": "s3://media-bucket/input/programme.m4a",
                "filename_hint": "programme.m4a"
              }
            ],
            "params": {},
            "output": {
              "type": "s3",
              "bucket": "processed-media",
              "prefix": "exports/c2pa",
              "name": "demo-publication"
            }
          },
          {
            "inputs": [
              {
                "type": "local_file_path",
                "path": "./fixtures/input/local-audio.mp3"
              }
            ],
            "params": {},
            "output": {
              "type": "local",
              "name": "exports"
            }
          }
        ]
      },
      "C2paFragmentedParams": {
        "type": "object",
        "description": "Parameters for fragmented C2PA signing.",
        "required": [
          "playlist_pattern",
          "init_pattern",
          "frag_pattern"
        ],
        "properties": {
          "assertions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAssertionDef"
            },
            "description": "Optional custom assertions to embed in the C2PA manifest."
          },
          "frag_pattern": {
            "type": "string"
          },
          "init_pattern": {
            "type": "string"
          },
          "parent": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiParent",
                "description": "Optional parent manifest to attach as a provenance ingredient."
              }
            ]
          },
          "parent_overrides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiParentOverride"
            },
            "description": "Per-input overrides for the parent manifest."
          },
          "playlist_pattern": {
            "type": "string"
          }
        },
        "example": {
          "playlist_pattern": "**/*.m3u8",
          "init_pattern": "**/init*.mp4",
          "frag_pattern": "seg*.m4s"
        }
      },
      "C2paFragmentedRequest": {
        "type": "object",
        "description": "Request for C2PA fragmented signing endpoint",
        "required": [
          "inputs",
          "params"
        ],
        "properties": {
          "inputs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiInputRef"
            }
          },
          "output": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiOutputSpec"
              }
            ]
          },
          "params": {
            "$ref": "#/components/schemas/C2paFragmentedParams"
          }
        },
        "examples": [
          {
            "inputs": [
              {
                "type": "local_folder_path",
                "path": "./fixtures/input/publication"
              },
              {
                "type": "remote_folder_url",
                "url": "https://media.example.com/input/publication/"
              },
              {
                "type": "remote_folder_url",
                "url": "s3://media-bucket/input/publication/"
              }
            ],
            "params": {
              "playlist_pattern": "**/*.m3u8",
              "init_pattern": "**/init*.mp4",
              "frag_pattern": "seg*.m4s"
            },
            "output": {
              "type": "s3",
              "bucket": "processed-media",
              "prefix": "exports/c2pa",
              "name": "demo-publication"
            }
          },
          {
            "inputs": [
              {
                "type": "local_folder_path",
                "path": "./fixtures/input/publication"
              }
            ],
            "params": {
              "playlist_pattern": "**/*.m3u8",
              "init_pattern": "**/init*.mp4",
              "frag_pattern": "seg*.m4s"
            },
            "output": {
              "type": "local",
              "name": "exports"
            }
          }
        ]
      },
      "C2paPackageParams": {
        "type": "object",
        "description": "Parameters for package-and-sign processing.",
        "properties": {
          "assertions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAssertionDef"
            },
            "description": "Optional custom assertions to embed in the C2PA manifest."
          },
          "frag_pattern": {
            "type": [
              "string",
              "null"
            ]
          },
          "init_pattern": {
            "type": [
              "string",
              "null"
            ]
          },
          "parent": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiParent",
                "description": "Optional parent manifest to attach as a provenance ingredient."
              }
            ]
          },
          "parent_overrides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiParentOverride"
            },
            "description": "Per-input overrides for the parent manifest."
          },
          "playlist_pattern": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "example": {
          "playlist_pattern": "**/*.m3u8",
          "init_pattern": "**/init*.mp4",
          "frag_pattern": "seg*.m4s"
        }
      },
      "C2paPackageRequest": {
        "type": "object",
        "description": "Request for package and sign endpoint",
        "required": [
          "inputs",
          "params"
        ],
        "properties": {
          "inputs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiInputRef"
            }
          },
          "output": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiOutputSpec"
              }
            ]
          },
          "params": {
            "$ref": "#/components/schemas/C2paPackageParams"
          }
        },
        "examples": [
          {
            "inputs": [
              {
                "type": "local_folder_path",
                "path": "./fixtures/input/publication"
              },
              {
                "type": "remote_folder_url",
                "url": "https://media.example.com/input/publication/"
              },
              {
                "type": "remote_folder_url",
                "url": "s3://media-bucket/input/publication/"
              }
            ],
            "params": {
              "playlist_pattern": "**/*.m3u8",
              "init_pattern": "**/init*.mp4",
              "frag_pattern": "seg*.m4s"
            },
            "output": {
              "type": "s3",
              "bucket": "processed-media",
              "prefix": "exports/c2pa",
              "name": "demo-publication"
            }
          },
          {
            "inputs": [
              {
                "type": "local_folder_path",
                "path": "./fixtures/input/publication"
              }
            ],
            "params": {
              "playlist_pattern": "**/*.m3u8",
              "init_pattern": "**/init*.mp4",
              "frag_pattern": "seg*.m4s"
            },
            "output": {
              "type": "local",
              "name": "exports"
            }
          }
        ]
      },
      "C2paVideoParams": {
        "type": "object",
        "description": "Parameters for C2PA video signing.",
        "properties": {
          "assertions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAssertionDef"
            },
            "description": "Optional custom assertions to embed in the C2PA manifest."
          },
          "parent": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiParent",
                "description": "Optional parent manifest to attach as a provenance ingredient."
              }
            ]
          },
          "parent_overrides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiParentOverride"
            },
            "description": "Per-input overrides for the parent manifest."
          }
        },
        "example": {}
      },
      "C2paVideoRequest": {
        "type": "object",
        "description": "Request for C2PA video signing endpoint",
        "required": [
          "inputs"
        ],
        "properties": {
          "inputs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiInputRef"
            }
          },
          "output": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiOutputSpec"
              }
            ]
          },
          "params": {
            "$ref": "#/components/schemas/C2paVideoParams"
          }
        },
        "examples": [
          {
            "inputs": [
              {
                "type": "local_file_path",
                "path": "./fixtures/input/local-video.mp4"
              },
              {
                "type": "remote_file_url",
                "url": "https://media.example.com/input/video.mp4",
                "filename_hint": "video.mp4"
              },
              {
                "type": "remote_file_url",
                "url": "s3://media-bucket/input/video.mp4",
                "filename_hint": "video.mp4"
              }
            ],
            "params": {},
            "output": {
              "type": "s3",
              "bucket": "processed-media",
              "prefix": "exports/c2pa",
              "name": "demo-publication"
            }
          },
          {
            "inputs": [
              {
                "type": "local_file_path",
                "path": "./fixtures/input/local-video.mp4"
              }
            ],
            "params": {},
            "output": {
              "type": "local",
              "name": "exports"
            }
          }
        ]
      },
      "JobResponse": {
        "type": "object",
        "description": "Response for async job submission",
        "required": [
          "job_id",
          "status"
        ],
        "properties": {
          "job_id": {
            "type": "string"
          },
          "status": {
            "type": "string"
          }
        }
      },
      "JobResultResponse": {
        "type": "object",
        "description": "Complete job result response (for sync endpoints and status queries)",
        "required": [
          "job_id",
          "status",
          "results",
          "timing"
        ],
        "properties": {
          "job_id": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProcessingResult"
            }
          },
          "status": {
            "type": "string"
          },
          "timing": {
            "$ref": "#/components/schemas/JobTiming"
          }
        }
      },
      "JobTiming": {
        "type": "object",
        "description": "Timing information for a job",
        "required": [
          "queued_at"
        ],
        "properties": {
          "finished_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "queued_at": {
            "type": "string",
            "format": "date-time"
          },
          "started_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "PackageParams": {
        "type": "object",
        "description": "Parameters for media packaging.\n\nThe output destination and name now live in the request `output` section, so\nthis carries no fields; it is retained for a stable request/schema shape.",
        "example": {}
      },
      "PackageRequest": {
        "type": "object",
        "description": "Request to package media files",
        "required": [
          "inputs",
          "params"
        ],
        "properties": {
          "inputs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiInputRef"
            }
          },
          "output": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiOutputSpec"
              }
            ]
          },
          "params": {
            "$ref": "#/components/schemas/PackageParams"
          }
        },
        "examples": [
          {
            "inputs": [
              {
                "type": "local_folder_path",
                "path": "./fixtures/input/publication"
              },
              {
                "type": "remote_folder_url",
                "url": "https://media.example.com/input/publication/"
              },
              {
                "type": "remote_folder_url",
                "url": "s3://media-bucket/input/publication/"
              }
            ],
            "params": {},
            "output": {
              "type": "s3",
              "bucket": "processed-media",
              "prefix": "exports/c2pa",
              "name": "demo-publication"
            }
          },
          {
            "inputs": [
              {
                "type": "local_folder_path",
                "path": "./fixtures/input/publication"
              }
            ],
            "params": {},
            "output": {
              "type": "local",
              "name": "exports"
            }
          }
        ]
      },
      "ProcessingResult": {
        "type": "object",
        "description": "Result for a single input in a job",
        "required": [
          "input_index",
          "status"
        ],
        "properties": {
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "input_index": {
            "type": "integer",
            "minimum": 0
          },
          "output_path": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "health",
      "description": "Service health endpoints"
    },
    {
      "name": "jobs",
      "description": "Asynchronous job lifecycle endpoints"
    },
    {
      "name": "c2pa-video",
      "description": "C2PA signing for monolithic video assets"
    },
    {
      "name": "c2pa-audio",
      "description": "C2PA signing for monolithic audio assets"
    },
    {
      "name": "c2pa-fragmented",
      "description": "C2PA signing for fragmented video assets"
    },
    {
      "name": "package",
      "description": "HLS & DASH packaging only endpoints"
    },
    {
      "name": "c2pa-package",
      "description": "Combined package and sign endpoints"
    },
    {
      "name": "softbinding",
      "description": "Placeholder softbinding watermark endpoints"
    }
  ]
}