{"record":{"id":"a7b16256862e9a4e","repo":"remotion-dev/remotion","slug":"failed-to-serialize-render-parameters-to-json-e","errorCode":null,"errorMessage":"Failed to serialize render parameters to JSON: {e}","messagePattern":"Failed to serialize render parameters to JSON: (.+?)","errorType":"exception","errorClass":"RemotionInvalidArgumentException","httpStatus":null,"severity":"error","filePath":"packages/lambda-python/remotion_lambda/remotionclient.py","lineNumber":565,"sourceCode":"        render_params.serve_url = self.serve_url\n\n        try:\n            # Assuming RenderMediaParams and RenderStillParams both have an input_props attribute\n            # and a private_serialized_input_props attribute (even if Optional)\n            render_params.private_serialized_input_props = self._serialize_input_props(\n                input_props=render_params.input_props, render_type=render_type\n            )\n        except (RemotionInvalidArgumentException, ClientError) as e:\n            raise RemotionInvalidArgumentException(\n                f\"Failed to serialize input properties for rendering: {e}\"\n            ) from e\n\n        # Ensure serialize_params method in models.py is typed to return Dict[str, Any]\n        payload: Dict[str, Any] = render_params.serialize_params()\n        try:\n            return json.dumps(payload, default=self._custom_serializer)\n        except (TypeError, OverflowError) as e:\n            raise RemotionInvalidArgumentException(\n                f\"Failed to serialize render parameters to JSON: {e}\"\n            ) from e\n\n    def construct_render_progress_request(\n        self,\n        render_id: str,\n        bucket_name: str,\n        log_level: str = \"info\", # Added type hint\n        s3_output_provider: Optional[CustomCredentials] = None,\n    ) -> str:\n        \"\"\"\n        Construct a render progress request in JSON format.\n\n        Args:\n            render_id (str): ID of the render.\n            bucket_name (str): Name of the bucket.\n            log_level (str): Log level (\"error\", \"warning\", \"info\", \"verbose\").\n            s3_output_provider (Optional[CustomCredentials]): Custom S3 credentials.","sourceCodeStart":547,"sourceCodeEnd":583,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/lambda-python/remotion_lambda/remotionclient.py#L547-L583","documentation":"Thrown by construct_render_request when json.dumps of the full serialized render payload (render_params.serialize_params()) raises TypeError or OverflowError, even after the custom serializer that handles enums, dataclasses, __dict__ and iterables. This means the payload still contained something the custom serializer could not represent (e.g. circular references, very deeply nested integers, or a type the custom serializer falls through on like a custom __dict__ containing non-serializable values).","triggerScenarios":"A render_params field whose value has a __dict__ that recursively references non-serializable objects; a numeric value so large that json.dumps raises OverflowError; a custom object that is not an Enum, dataclass, or iterable, and whose __dict__ still contains unsupported types.","commonSituations":"Attaching custom nested objects to optional params (e.g. webhook config with arbitrary objects); passing very large integers from compute-heavy props; mutating render_params after construction to inject non-serializable state.","solutions":["Read the wrapped TypeError/OverflowError message to identify the offending value or recursion depth.","Ensure every field set on RenderMediaParams/RenderStillParams reduces to JSON primitives or already-serialized dicts before calling render_media_on_lambda/render_still_on_lambda.","If using custom classes, convert them with to_dict() or dataclasses.asdict() yourself before assigning.","For OverflowError on large numbers, cap or stringify the value."],"exampleFix":"// before\nrender_params.webhook = MyCustomWebhook()  # __dict__ holds a file handle\n// after\nrender_params.webhook = Webhook(url='https://example.com/hook', secret='...')","handlingStrategy":"try-catch","validationCode":"import json\ndef payload_serializes(params_dict):\n    try:\n        json.dumps(params_dict, default=str)\n        return True\n    except (TypeError, OverflowError):\n        return False\n\nif not payload_serializes(render_params.serialize_params()):\n    raise ValueError('render params contain non-serializable fields')","typeGuard":"from enum import Enum\ndef serializable_value(v):\n    if isinstance(v, Enum): return True\n    if hasattr(v, '__dataclass_fields__'): return True\n    return v is None or isinstance(v, (str, int, float, bool, list, dict))","tryCatchPattern":"from remotion_lambda.exceptions import RemotionInvalidArgumentException\ntry:\n    json_str = client.construct_render_request(render_params, render_type='video-or-audio')\nexcept RemotionInvalidArgumentException as e:\n    logger.exception('Render request serialization failed; payload was: %r', render_params.serialize_params())\n    raise","preventionTips":["Avoid assigning custom classes to optional render_params fields; prefer dicts.","Use dataclasses with primitive fields for webhook/credential structures.","Test serialization in isolation before submitting the render.","Never mutate render_params after a successful serialization to inject non-serializable state."],"tags":["python","lambda","serialization","json","render-params"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}