{"record":{"id":"a9a7523ecffe014a","repo":"calesthio/OpenMontage","slug":"callback-url-must-be-an-http-s-url","errorCode":null,"errorMessage":"callback_url must be an http(s) URL","messagePattern":"callback_url must be an http\\(s\\) URL","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"tools/video/seedance_ark.py","lineNumber":1210,"sourceCode":"    @staticmethod\n    def _is_remote_or_asset(value: str) -> bool:\n        return value.startswith((\"https://\", \"http://\", \"asset://\"))\n\n    def _validate_remote_refs(self, refs: list[Any], label: str) -> None:\n        for ref in refs:\n            value = str(ref)\n            if not value.startswith((\"https://\", \"http://\", \"asset://\")):\n                raise ValueError(\n                    f\"{label} must be a public/signed URL or asset:// ID; \"\n                    \"Ark does not document video Base64 or local paths\"\n                )\n\n    def _validate_optional_parameters(self, payload: dict[str, Any]) -> None:\n        callback = payload.get(\"callback_url\")\n        if callback is not None and not str(callback).startswith(\n            (\"https://\", \"http://\")\n        ):\n            raise ValueError(\"callback_url must be an http(s) URL\")\n        expires = payload.get(\"execution_expires_after\")\n        if expires is not None and not 3600 <= int(expires) <= 259200:\n            raise ValueError(\"execution_expires_after must be between 3600 and 259200\")\n        priority = payload.get(\"priority\")\n        if priority is not None and not 0 <= int(priority) <= 9:\n            raise ValueError(\"priority must be between 0 and 9\")\n        safety = payload.get(\"safety_identifier\")\n        if safety is not None and len(str(safety)) > 64:\n            raise ValueError(\"safety_identifier must be at most 64 characters\")\n\n    def _validate_request_size(self, payload: dict[str, Any]) -> None:\n        # Base64 dominates request size; summing encoded media is a conservative\n        # lower-cost check that avoids building a second complete JSON string.\n        encoded_bytes = 0\n        for item in payload[\"content\"]:\n            media = (\n                item.get(\"image_url\")\n                or item.get(\"audio_url\")","sourceCodeStart":1192,"sourceCodeEnd":1228,"githubUrl":"https://github.com/calesthio/OpenMontage/blob/95e1c3d0ab93482159818560f6a8c8e866b9139f/tools/video/seedance_ark.py#L1192-L1228","documentation":"Error \"callback_url must be an http(s) URL\" thrown in calesthio/OpenMontage.","triggerScenarios":"callback_url passed to Seedance Ark is not an http(s) URL.","commonSituations":"See trigger scenarios.","solutions":["Set callback_url to a full http(s) URL including the scheme, e.g. https://example.com/hook.","Omit callback_url entirely if you do not need completion callbacks."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"95e1c3d0ab93482159818560f6a8c8e866b9139f","analyzedAt":"2026-08-15T06:31:20.014Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}