diff --git a/src/videoag_common/miscellaneous/errors.py b/src/videoag_common/miscellaneous/errors.py
index 0ca718b2c381c9dd7209ff4180246f8c81b3e8bc..6730d463972796ed139d19008e5035e374d30f81 100644
--- a/src/videoag_common/miscellaneous/errors.py
+++ b/src/videoag_common/miscellaneous/errors.py
@@ -7,6 +7,9 @@ class ApiError:
         self.error_code = error_code
         self.http_status_code = http_status_code
         self.message = message
+    
+    def __str__(self):
+        return f"ApiError[code={self.error_code}, status={self.http_status_code}, message='{self.message}']"
 
 
 class ApiClientException(Exception):
diff --git a/src/videoag_common/miscellaneous/json.py b/src/videoag_common/miscellaneous/json.py
index 6399361ab5237b7f868c0784e23b5b0b17ab035a..8895662ae8a52f46ea284f37327a5be97b565a8a 100644
--- a/src/videoag_common/miscellaneous/json.py
+++ b/src/videoag_common/miscellaneous/json.py
@@ -88,7 +88,7 @@ class CJsonObject(CJsonValue):
         if optional and not self.has(key):
             return None
         if key not in self._data:
-            raise ApiClientException(ERROR_REQUEST_MISSING_PARAMETER(key))
+            raise ApiClientException(ERROR_REQUEST_MISSING_PARAMETER(f"{self._path}.{key}"))
         return CJsonValue(self._data[key], f"{self._path}.{key}")
     
     def get_object(self, key: str) -> "CJsonObject":
diff --git a/src/videoag_common/objects/job.py b/src/videoag_common/objects/job.py
index 5b9e5a1e9cb49b208f57bfb949714c6cecf2a4fb..df45d68ad0e3b415feb22a8998b444f5ca9b2dae 100644
--- a/src/videoag_common/objects/job.py
+++ b/src/videoag_common/objects/job.py
@@ -9,8 +9,8 @@ from .user import User
 
 class JobState(Enum):
     READY = "ready"
-    SPAWNING = "spawning"
-    RUNNING = "running"
+    SPAWNING = "spawning"  # Job is in K8s but wasn't scheduled yet
+    RUNNING = "running"  # Job is running in K8s
     FINISHED = "finished"
     FINISHED_AND_PROCESSED = "finished_and_processed"
     FAILED = "failed"
@@ -22,6 +22,9 @@ _JOB_STATE_ENUM = create_enum_type(JobState)
 
 
 class Job(ApiObject, Base):
+    ERROR_CODE_UNKNOWN_TYPE = "unknown_type"
+    ERROR_CODE_SPAWNING_FAILURE = "spawning_failure"
+    
     __table_args__ = (
         CheckConstraint(
             "(on_end_event_type IS NULL) = (on_end_event_data IS NULL)",
@@ -127,3 +130,10 @@ class Job(ApiObject, Base):
             },
             cause_job_id=cause_job_id
         )
+    
+    def set_error(self, error_code: str, error_message: str or None = None):
+        self.status = JobState.FAILED
+        self.output_data = {
+            "error_code": error_code,
+            "error_message": error_message
+        }