diff --git a/python/src/omotes_sdk_protocol/job_pb2.py b/python/src/omotes_sdk_protocol/job_pb2.py
index a3ea7d3..c5b9290 100644
--- a/python/src/omotes_sdk_protocol/job_pb2.py
+++ b/python/src/omotes_sdk_protocol/job_pb2.py
@@ -14,7 +14,7 @@
 
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tjob.proto\"j\n\rJobSubmission\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x17\n\ntimeout_ms\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\rworkflow_type\x18\x03 \x01(\t\x12\x0c\n\x04\x65sdl\x18\x04 \x01(\x0c\x42\r\n\x0b_timeout_ms\"\xb2\x01\n\tJobResult\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12*\n\x0bresult_type\x18\x02 \x01(\x0e\x32\x15.JobResult.ResultType\x12\x18\n\x0boutput_esdl\x18\x03 \x01(\x0cH\x00\x88\x01\x01\x12\x0c\n\x04logs\x18\x04 \x01(\t\"3\n\nResultType\x12\r\n\tSUCCEEDED\x10\x00\x12\x0b\n\x07TIMEOUT\x10\x01\x12\t\n\x05\x45RROR\x10\x02\x42\x0e\n\x0c_output_esdl\"D\n\x11JobProgressUpdate\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x10\n\x08progress\x18\x02 \x01(\x01\x12\x0f\n\x07message\x18\x03 \x01(\t\"\xa0\x01\n\x0fJobStatusUpdate\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12*\n\x06status\x18\x02 \x01(\x0e\x32\x1a.JobStatusUpdate.JobStatus\"S\n\tJobStatus\x12\x0e\n\nREGISTERED\x10\x00\x12\x0c\n\x08\x45NQUEUED\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\x12\x0c\n\x08\x46INISHED\x10\x03\x12\r\n\tCANCELLED\x10\x04\"\x19\n\tJobCancel\x12\x0c\n\x04uuid\x18\x01 \x01(\tb\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\tjob.proto\"j\n\rJobSubmission\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x17\n\ntimeout_ms\x18\x02 \x01(\rH\x00\x88\x01\x01\x12\x15\n\rworkflow_type\x18\x03 \x01(\t\x12\x0c\n\x04\x65sdl\x18\x04 \x01(\tB\r\n\x0b_timeout_ms\"\xb2\x01\n\tJobResult\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12*\n\x0bresult_type\x18\x02 \x01(\x0e\x32\x15.JobResult.ResultType\x12\x18\n\x0boutput_esdl\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0c\n\x04logs\x18\x04 \x01(\t\"3\n\nResultType\x12\r\n\tSUCCEEDED\x10\x00\x12\x0b\n\x07TIMEOUT\x10\x01\x12\t\n\x05\x45RROR\x10\x02\x42\x0e\n\x0c_output_esdl\"D\n\x11JobProgressUpdate\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12\x10\n\x08progress\x18\x02 \x01(\x01\x12\x0f\n\x07message\x18\x03 \x01(\t\"\xa0\x01\n\x0fJobStatusUpdate\x12\x0c\n\x04uuid\x18\x01 \x01(\t\x12*\n\x06status\x18\x02 \x01(\x0e\x32\x1a.JobStatusUpdate.JobStatus\"S\n\tJobStatus\x12\x0e\n\nREGISTERED\x10\x00\x12\x0c\n\x08\x45NQUEUED\x10\x01\x12\x0b\n\x07RUNNING\x10\x02\x12\x0c\n\x08\x46INISHED\x10\x03\x12\r\n\tCANCELLED\x10\x04\"\x19\n\tJobCancel\x12\x0c\n\x04uuid\x18\x01 \x01(\tb\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
diff --git a/python/src/omotes_sdk_protocol/job_pb2.pyi b/python/src/omotes_sdk_protocol/job_pb2.pyi
index 273e292..56f1381 100644
--- a/python/src/omotes_sdk_protocol/job_pb2.pyi
+++ b/python/src/omotes_sdk_protocol/job_pb2.pyi
@@ -27,14 +27,15 @@ class JobSubmission(google.protobuf.message.Message):
     uuid: builtins.str
     timeout_ms: builtins.int
     workflow_type: builtins.str
-    esdl: builtins.bytes
+    esdl: builtins.str
+    """Raw XML string"""
     def __init__(
         self,
         *,
         uuid: builtins.str = ...,
         timeout_ms: builtins.int | None = ...,
         workflow_type: builtins.str = ...,
-        esdl: builtins.bytes = ...,
+        esdl: builtins.str = ...,
     ) -> None: ...
     def HasField(self, field_name: typing_extensions.Literal["_timeout_ms", b"_timeout_ms", "timeout_ms", b"timeout_ms"]) -> builtins.bool: ...
     def ClearField(self, field_name: typing_extensions.Literal["_timeout_ms", b"_timeout_ms", "esdl", b"esdl", "timeout_ms", b"timeout_ms", "uuid", b"uuid", "workflow_type", b"workflow_type"]) -> None: ...
@@ -67,14 +68,15 @@ class JobResult(google.protobuf.message.Message):
     LOGS_FIELD_NUMBER: builtins.int
     uuid: builtins.str
     result_type: global___JobResult.ResultType.ValueType
-    output_esdl: builtins.bytes
+    output_esdl: builtins.str
+    """Raw XML string"""
     logs: builtins.str
     def __init__(
         self,
         *,
         uuid: builtins.str = ...,
         result_type: global___JobResult.ResultType.ValueType = ...,
-        output_esdl: builtins.bytes | None = ...,
+        output_esdl: builtins.str | None = ...,
         logs: builtins.str = ...,
     ) -> None: ...
     def HasField(self, field_name: typing_extensions.Literal["_output_esdl", b"_output_esdl", "output_esdl", b"output_esdl"]) -> builtins.bool: ...
diff --git a/src/job.proto b/src/job.proto
index 531bb62..f7b26c4 100644
--- a/src/job.proto
+++ b/src/job.proto
@@ -4,13 +4,13 @@ message JobSubmission {
   string uuid = 1;
   optional uint32 timeout_ms = 2;
   string workflow_type = 3;
-  bytes esdl = 4;
+  string esdl = 4; // Raw XML string
 }
 
 message JobResult {
   string uuid = 1;
   ResultType result_type = 2;
-  optional bytes output_esdl = 3;
+  optional string output_esdl = 3; // Raw XML string
   string logs = 4;
 
   enum ResultType {