{"openapi":"3.0.1","info":{"title":"Toolforge API","version":"8.28.3","description":"[Toolforge](https://toolforge.org) is a free\n[platform as a service](https://en.wikipedia.org/wiki/Platform_as_a_service) for Wikimedia contributors. It\nprovides web servers, data access, job management, and other features to help developers maintain tools and bots.\n\nFor authentication, the external server only accepts [deploy tokens](https://wikitech.wikimedia.org/wiki/Help:Toolforge/Deploy_your_tool#Create_the_deploy_token), you can still access non-authenticated endpoints.\nThe internal server accepts also the internal toolforge kubernetes certificates for authentication.\nAdding more authentication methods for the external server is in progress.\n\nSome useful links:\n  * [Main toolforge page](https://toolforge.org)\n  * [Wiki page, with the detailed deprecation process](https://wikitech.wikimedia.org/wiki/Help:Toolforge/API)\n  * [Cloud-announce mailing list](https://lists.wikimedia.org/postorius/lists/cloud-announce.lists.wikimedia.org/)\n    where major notices are sent\n  * [Toolforge changelog page](https://wikitech.wikimedia.org/wiki/Portal:Toolforge/Changelog), where smaller\n    updates are published"},"servers":[{"description":"External server.","url":"https://api.svc.toolforge.org"},{"description":"Internal server, only reachable from within toolforge.","url":"https://api.svc.tools.eqiad1.wikimedia.cloud:30003"}],"paths":{"/builds/v1/healthz":{"get":{"operationId":"builds_Healthcheck","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsHealthResponse"}}},"description":"Returns the health status of the service"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsHealthResponse"}}},"description":"Returned when the service is not ready"}},"security":[],"tags":["Builds"]}},"/builds/v1/metrics":{"get":{"operationId":"builds_Metrics","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Returns the metrics of the service"}},"security":[],"tags":["Builds"]}},"/builds/v1/tool/{toolname}/builds":{"get":{"operationId":"builds_List","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsListResponse"}}},"description":"Returns the list of builds"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]},"post":{"operationId":"builds_Start","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsBuildParameters"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsStartResponse"}}},"description":"returns the newly created build information"},"400":{"$ref":"#/components/responses/buildsbad-parameters"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"404":{"$ref":"#/components/responses/buildsnot-found"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"x-codegen-request-body-name":"new_build","tags":["Builds"]}},"/builds/v1/tool/{toolname}/builds/latest":{"get":{"operationId":"builds_Latest","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsLatestResponse"}}},"description":"The latest build"},"400":{"$ref":"#/components/responses/buildsbad-parameters"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"404":{"$ref":"#/components/responses/buildsnot-found"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]}},"/builds/v1/tool/{toolname}/builds/{id}":{"delete":{"operationId":"builds_Delete","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}},{"description":"Id of the build","explode":false,"in":"path","name":"id","required":true,"schema":{"type":"string"},"style":"simple"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsDeleteResponse"}}},"description":"The build was deleted"},"400":{"$ref":"#/components/responses/buildsbad-parameters"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"404":{"$ref":"#/components/responses/buildsnot-found"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]},"get":{"operationId":"builds_Get","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}},{"description":"Id of the build","explode":false,"in":"path","name":"id","required":true,"schema":{"type":"string"},"style":"simple"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsGetResponse"}}},"description":"The build was found"},"400":{"$ref":"#/components/responses/buildsbad-parameters"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"404":{"$ref":"#/components/responses/buildsnot-found"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]}},"/builds/v1/tool/{toolname}/builds/{id}/cancel":{"put":{"operationId":"builds_Cancel","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}},{"description":"Id of the build","explode":false,"in":"path","name":"id","required":true,"schema":{"type":"string"},"style":"simple"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsCancelResponse"}}},"description":"The build was canceled"},"400":{"$ref":"#/components/responses/buildsbad-parameters"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"404":{"$ref":"#/components/responses/buildsnot-found"},"409":{"$ref":"#/components/responses/buildsconflict"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]}},"/builds/v1/tool/{toolname}/builds/{id}/logs":{"get":{"operationId":"builds_Logs","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}},{"description":"Id of the build","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Follow the logs","in":"query","name":"follow","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"$ref":"#/components/schemas/buildsBuildLog"}}},"description":"returns newline separated sequence of \"#/components/schemas/BuildLog\" or\n\"#/component/schemas/InternalError\" if there was an error after the\nstreaming has started (as the http status code can't be changed)\n"},"400":{"$ref":"#/components/responses/buildsbad-parameters"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"404":{"$ref":"#/components/responses/buildsnot-found"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]}},"/builds/v1/tool/{toolname}/clean":{"post":{"operationId":"builds_Clean","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsCleanResponse"}}},"description":"Returns a summary of what was cleaned up."},"401":{"$ref":"#/components/responses/buildsunauthorized"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]}},"/builds/v1/tool/{toolname}/quotas":{"get":{"operationId":"builds_Quota","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsQuotaResponse"}}},"description":"Returns the quota information"},"401":{"$ref":"#/components/responses/buildsunauthorized"},"500":{"$ref":"#/components/responses/buildsinternal-error"}},"security":[{"key":[]}],"tags":["Builds"]}},"/components/metrics":{"get":{"summary":"Metrics","description":"Endpoint that serves Prometheus metrics.","operationId":"components_metrics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["Components"]}},"/components/v1/healthz":{"get":{"summary":"Healthz","operationId":"components_healthz","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_HealthState_"}}}}},"tags":["Components"]}},"/components/v1/tool/{toolname}/config":{"get":{"tags":["Components"],"summary":"Get Tool Config","description":"Retrieve the configuration for a specific tool.","operationId":"components_get_tool_config","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_ToolConfig_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}},"post":{"tags":["Components"],"summary":"Update Tool Config","description":"Update or create the configuration for a specific tool.","operationId":"components_update_tool_config","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsToolConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_ToolConfig_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}},"delete":{"tags":["Components"],"summary":"Delete Tool Config","description":"Delete the configuration for a specific tool.","operationId":"components_delete_tool_config","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_ToolConfig_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/components/v1/tool/{toolname}/config/generate":{"get":{"tags":["Components"],"summary":"Generate Tool Config","description":"Generate the configuration for a specific tool from existing jobs if possible.\n\nFallback to a hardcoded example otherwise. Note that this will not generate resources that are not supported.","operationId":"components_generate_tool_config","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_ToolConfig_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/components/v1/tool/{toolname}/deployment/token":{"get":{"tags":["Components"],"summary":"Get Tool Deploy Token","operationId":"components_get_tool_deploy_token","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_DeployToken_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}},"post":{"tags":["Components"],"summary":"Create Tool Deploy Token","operationId":"components_create_tool_deploy_token","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_DeployToken_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}},"put":{"tags":["Components"],"summary":"Update Tool Deploy Token","operationId":"components_update_tool_deploy_token","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_DeployToken_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}},"delete":{"tags":["Components"],"summary":"Delete Tool Deploy Token","operationId":"components_delete_tool_deploy_token","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_DeployToken_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/components/v1/tool/{toolname}/deployment/latest":{"get":{"tags":["Components"],"summary":"Get Latest Deployment","description":"Print the latest deployment for a specific tool, sorted by creation_time","operationId":"components_get_latest_deployment","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_Deployment_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/components/v1/tool/{toolname}/deployment/{deployment_id}/cancel":{"put":{"tags":["Components"],"summary":"Cancel Tool Deployment","operationId":"components_cancel_tool_deployment","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}},{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_Deployment_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/components/v1/tool/{toolname}/deployment/latest/cancel":{"put":{"tags":["Components"],"summary":"Cancel Tool Deployment","operationId":"components_cancel_tool_deployment","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}},{"name":"deployment_id","in":"query","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_Deployment_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/components/v1/tool/{toolname}/deployment":{"get":{"tags":["Components"],"summary":"List Tool Deployments","description":"List all deployments for a specific tool.","operationId":"components_list_tool_deployments","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_DeploymentList_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}},"post":{"tags":["Components"],"summary":"Create Tool Deployment","description":"Create a new tool deployment.","operationId":"components_create_tool_deployment","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}},{"name":"force-build","in":"query","required":false,"schema":{"type":"boolean","title":"Force Build","description":"By default the component is only rebuilt if there was a change in the source code and there's no build for that same commit. To force a re-build regardless of the source code status, use force-build","default":false},"description":"By default the component is only rebuilt if there was a change in the source code and there's no build for that same commit. To force a re-build regardless of the source code status, use force-build"},{"name":"force-run","in":"query","required":false,"schema":{"type":"boolean","title":"Force Run","description":"By default an already running component is not restarted if there are no changes to the run parameters. To force a re-run regardless of the run parameters, use force-run","default":false},"description":"By default an already running component is not restarted if there are no changes to the run parameters. To force a re-run regardless of the run parameters, use force-run"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/componentsDeploymentCreateRequest"},{"type":"null"}],"title":"Deployment Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_Deployment_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/components/v1/tool/{toolname}/deployment/{deployment_id}":{"delete":{"tags":["Components"],"summary":"Delete Tool Deployment","operationId":"components_delete_tool_deployment","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}},{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_Deployment_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}},"get":{"tags":["Components"],"summary":"Get Tool Deployment","operationId":"components_get_tool_deployment","security":[{"APIKeyHeader":[]},{"APIKeyQuery":[]}],"parameters":[{"name":"toolname","in":"path","required":true,"schema":{"type":"string","title":"Toolname"}},{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsApiResponse_Deployment_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/componentsHTTPValidationError"}}}}}}},"/envvars/v1/healthz":{"get":{"description":"Check service health status.","operationId":"envvars_Healthcheck","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsHealthResponse"}}},"description":"returns the health status of the service"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsHealthResponse"}}},"description":"happens when the service is not ready"}},"security":[],"tags":["Envvars"]}},"/envvars/v1/metrics":{"get":{"description":"Get service metrics in Prometheus format.","operationId":"envvars_Metrics","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Returns the metrics of the service"}},"security":[],"tags":["Envvars"]}},"/envvars/v1/tool/{toolname}/envvars":{"get":{"description":"List all your envvars.","operationId":"envvars_List","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsListResponse"}}},"description":"all the user envvars"},"500":{"$ref":"#/components/responses/envvarsinternal-error"}},"security":[{"key":[]}],"tags":["Envvars"]},"post":{"description":"Create/update an envvar.","operationId":"envvars_Create","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsEnvvar"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsGetResponse"}}},"description":"the newly created or updated envvar"},"403":{"$ref":"#/components/responses/envvarsforbidden"},"500":{"$ref":"#/components/responses/envvarsinternal-error"}},"security":[{"key":[]}],"x-codegen-request-body-name":"envvar","tags":["Envvars"]}},"/envvars/v1/tool/{toolname}/envvars/{name}":{"delete":{"description":"Delete an envvar.","operationId":"envvars_Delete","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}},{"description":"Name of the envvar (same as the environment variable that will\nbe exposed)\n","explode":false,"in":"path","name":"name","required":true,"schema":{"$ref":"#/components/schemas/envvarsEnvvarName"},"style":"simple"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsGetResponse"}}},"description":"the deleted envvar"},"404":{"$ref":"#/components/responses/envvarsnot-found"},"500":{"$ref":"#/components/responses/envvarsinternal-error"}},"security":[{"key":[]}],"tags":["Envvars"]},"get":{"description":"Show a specific envvar.","operationId":"envvars_Show","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}},{"description":"Name of the envvar (same as the environment variable that will\nbe exposed)\n","explode":false,"in":"path","name":"name","required":true,"schema":{"$ref":"#/components/schemas/envvarsEnvvarName"},"style":"simple"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsGetResponse"}}},"description":"returns a envvar"},"404":{"$ref":"#/components/responses/envvarsnot-found"},"500":{"$ref":"#/components/responses/envvarsinternal-error"}},"security":[{"key":[]}],"tags":["Envvars"]}},"/envvars/v1/tool/{toolname}/quotas":{"get":{"description":"Get envvars quota information.","operationId":"envvars_Quota","parameters":[{"description":"Name of the tool","in":"path","name":"toolname","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsQuotaResponse"}}},"description":"information about the quota available to the user for creating envvars"},"500":{"$ref":"#/components/responses/envvarsinternal-error"}},"security":[{"key":[]}],"tags":["Envvars"]}},"/jobs/v1/tool/{tool_name}/images":{"get":{"operationId":"jobs_images","description":"Returns the list of available container images that you can use to create a new job.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The response contains a list of available container images.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsImageListResponse"}}}},"401":{"$ref":"#/components/responses/jobsunauthorized_error"}},"security":[{"key":[]}],"tags":["Jobs"]}},"/jobs/v1/tool/{tool_name}/quotas":{"get":{"operationId":"jobs_quotas","description":"Returns information on the tool account quotas in Toolforge.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The response contains the quota details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsQuotaResponse"}}}},"401":{"$ref":"#/components/responses/jobsunauthorized_error"}},"security":[{"key":[]}],"tags":["Jobs"]}},"/jobs/v1/tool/{tool_name}/jobs":{"get":{"operationId":"jobs_list","description":"Returns the list of jobs defined for this Toolforge tool account.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}},{"name":"include_unset","in":"query","description":"If unset or `true`, include all the fields including those that were not passed on job creation.","required":false,"schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":"The list of jobs is returned.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsJobListResponse"}}}},"401":{"$ref":"#/components/responses/jobsunauthorized_error"}},"security":[{"key":[]}],"tags":["Jobs"]},"post":{"operationId":"jobs_create","description":"Create a new job in this Toolforge tool account.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/jobsNewOneOffJob"},{"$ref":"#/components/schemas/jobsNewScheduledJob"},{"$ref":"#/components/schemas/jobsNewContinuousJob"}]}}}},"responses":{"200":{"description":"A new job was created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsJobResponse"}}}},"400":{"$ref":"#/components/responses/jobsbad_parameters_error"},"401":{"$ref":"#/components/responses/jobsunauthorized_error"}},"security":[{"key":[]}],"tags":["Jobs"]},"patch":{"operationId":"jobs_update","description":"Updates an existing job or creates a new job for this Toolforge tool account","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/jobsNewOneOffJob"},{"$ref":"#/components/schemas/jobsNewScheduledJob"},{"$ref":"#/components/schemas/jobsNewContinuousJob"}]}}}},"responses":{"200":{"description":"Operation was successful","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsUpdateResponse"}}}},"400":{"$ref":"#/components/responses/jobsbad_parameters_error"},"401":{"$ref":"#/components/responses/jobsunauthorized_error"}},"security":[{"key":[]}],"tags":["Jobs"]},"delete":{"operationId":"jobs_flush","description":"Stop and delete all defined jobs from this Toolforge tool account.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"All jobs were flushed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsFlushResponse"}}}},"401":{"$ref":"#/components/responses/jobsunauthorized_error"}},"security":[{"key":[]}],"tags":["Jobs"]}},"/jobs/v1/tool/{tool_name}/jobs/{id}":{"get":{"operationId":"jobs_show","description":"Show information about a given job for this Toolforge tool account.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","description":"Job name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job was found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsJobResponse"}}}},"400":{"$ref":"#/components/responses/jobsbad_parameters_error"},"401":{"$ref":"#/components/responses/jobsunauthorized_error"},"404":{"$ref":"#/components/responses/jobsnot_found_error"}},"security":[{"key":[]}],"tags":["Jobs"]},"delete":{"operationId":"jobs_delete","description":"Stop and delete the specified job from this Toolforge tool account.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","description":"Job name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job was deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsDeleteResponse"}}}},"400":{"$ref":"#/components/responses/jobsbad_parameters_error"},"401":{"$ref":"#/components/responses/jobsunauthorized_error"},"404":{"$ref":"#/components/responses/jobsnot_found_error"}},"security":[{"key":[]}],"tags":["Jobs"]}},"/jobs/v1/tool/{tool_name}/jobs/{id}/logs":{"get":{"operationId":"jobs_get_logs","description":"Get logs for a given job in this Toolforge tool account.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","description":"Job name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job logs are served.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/jobsJobLogs"}}}},"400":{"$ref":"#/components/responses/jobsbad_parameters_error"},"401":{"$ref":"#/components/responses/jobsunauthorized_error"},"404":{"$ref":"#/components/responses/jobsnot_found_error"}},"security":[{"key":[]}],"tags":["Jobs"]}},"/jobs/v1/tool/{tool_name}/jobs/{id}/restart":{"post":{"operationId":"jobs_restart","description":"Restart a given job. If the job is a cronjob, execute it right now.","parameters":[{"name":"tool_name","in":"path","description":"Tool name.","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","description":"Job name.","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Job has been restarted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsRestartResponse"}}}},"400":{"$ref":"#/components/responses/jobsbad_parameters_error"},"401":{"$ref":"#/components/responses/jobsunauthorized_error"},"404":{"$ref":"#/components/responses/jobsnot_found_error"}},"security":[{"key":[]}],"tags":["Jobs"]}},"/jobs/v1/healthz":{"get":{"operationId":"jobs_healthcheck","description":"Endpoint that can be used to know the health status of the API itself.","responses":{"200":{"description":"The health status of the service is well known.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsHealthResponse"}}}}},"security":[],"tags":["Jobs"]}},"/jobs/v1/metrics":{"get":{"operationId":"jobs_metrics","description":"Endpoint that exposes Prometheus metrics for the API.","responses":{"200":{"description":"Prometheus metrics are returned.","content":{"text/plain":{"schema":{"type":"string"}}}}},"security":[],"tags":["Jobs"]}},"/logs/metrics":{"get":{"summary":"Metrics","description":"Endpoint that serves Prometheus metrics.","operationId":"logs_metrics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"tags":["Logs"]}},"/logs/v1/healthz":{"get":{"summary":"Healthz","operationId":"logs_healthz","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/logsApiResponse_HealthState_"}}}}},"tags":["Logs"]}},"/logs/v1/tool/{tool_name}/job/{job_name}/logs":{"get":{"tags":["Logs"],"summary":"Get Tool Logs","description":"Retrieve the logs for a specific tool.","operationId":"logs_get_tool_logs","security":[{"ToolforgeToolHeader":[]}],"parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}},{"name":"job_name","in":"path","required":true,"schema":{"type":"string","title":"Job Name"}},{"name":"lines","in":"query","required":false,"schema":{"type":"integer","minimum":0,"title":"Number of lines to retrieve","description":"Total number of log lines to retrieve. Skip or pass 0 to get all logs (no limit). A pagination token will be included in the response if fewer lines are returned and more are available. Update the lines parameter accordingly between paginated calls.","default":0},"description":"Total number of log lines to retrieve. Skip or pass 0 to get all logs (no limit). A pagination token will be included in the response if fewer lines are returned and more are available. Update the lines parameter accordingly between paginated calls."},{"name":"direction","in":"query","required":false,"schema":{"enum":["oldest_first","newest_first"],"type":"string","title":"Line order and anchoring","description":"`oldest_first` returns `lines` log entries in chronological order, starting with `since`.\n`newest_first` returns `lines` log entries in **reverse** chronological order, starting with `until`.\nWhen `lines` is zero (or unspecified), all log entries in the since/until range are returned, still in the order specified by this parameter.","default":"oldest_first"},"description":"`oldest_first` returns `lines` log entries in chronological order, starting with `since`.\n`newest_first` returns `lines` log entries in **reverse** chronological order, starting with `until`.\nWhen `lines` is zero (or unspecified), all log entries in the since/until range are returned, still in the order specified by this parameter."},{"name":"since","in":"query","required":false,"schema":{"type":"string","title":"Since time","description":"Retrieve logs from this time","examples":["2026-03-02T21:29:55+01:00","2026-03-02","1h32m22s"],"default":"1h"},"description":"Retrieve logs from this time"},{"name":"until","in":"query","required":false,"schema":{"type":"string","title":"Until time","description":"Retrieve logs up to this time","examples":["2026-03-02T21:29:55+01:00","2026-03-02","1h32m22s"],"default":"0s"},"description":"Retrieve logs up to this time"},{"name":"bucket_offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"exclusiveMaximum":1000000,"title":"Number of entries to skip among those sharing the `since` timestamp","description":"Implementation detail, only meaningful when copied from a pagination response field. Semantics will change without notice!","default":0},"description":"Implementation detail, only meaningful when copied from a pagination response field. Semantics will change without notice!"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/logsApiResponse_JobsLogs_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/logsHTTPValidationError"}}}}}}},"/logs/v1/tool/{tool_name}/job/{job_name}/logs_stream":{"get":{"tags":["Logs"],"summary":"Stream Tool Logs","description":"Stream logs from a job.","operationId":"logs_stream_tool_logs","security":[{"ToolforgeToolHeader":[]}],"parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}},{"name":"job_name","in":"path","required":true,"schema":{"type":"string","title":"Job Name"}},{"name":"lines","in":"query","required":false,"schema":{"type":"integer","title":"Number of lines to retrieve","description":"Total number of lines of logs to retrieve, note that there's a maximum limit, skip or pass 0 to use the default 500.","default":0},"description":"Total number of lines of logs to retrieve, note that there's a maximum limit, skip or pass 0 to use the default 500."},{"name":"since","in":"query","required":false,"schema":{"type":"string","title":"Since time","description":"Retrieve logs from this time","examples":["2026-03-02T21:29:55+01:00","2026-03-02","1h32m22s"],"default":"1h"},"description":"Retrieve logs from this time"}],"responses":{"200":{"description":"Stream of newline separated json-encoded LogEntry objects","content":{"text/plain":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/logsHTTPValidationError"}}}}}}},"/logs/v1/tool/{tool_name}/source/jobs/log":{"post":{"tags":["Logs"],"summary":"Write Jobs Logs","operationId":"logs_write_jobs_logs","security":[{"ToolforgeToolHeader":[]},{"ToolforgeUserHeader":[]}],"parameters":[{"name":"tool_name","in":"path","required":true,"schema":{"type":"string","title":"Tool Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"anyOf":[{"$ref":"#/components/schemas/logsJobUpdatedLog"},{"$ref":"#/components/schemas/logsJobRestartedLog"},{"$ref":"#/components/schemas/logsJobDeletedLog"},{"$ref":"#/components/schemas/logsJobCreatedLog"}]},"title":"Log Entries"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/logsApiResponse_LogWriteResult_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/logsHTTPValidationError"}}}}}}}},"components":{"schemas":{"buildsBuild":{"allOf":[{"$ref":"#/components/schemas/buildsBuildCondition"},{"properties":{"build_id":{"type":"string"},"destination_image":{"type":"string"},"end_time":{"type":"string"},"parameters":{"$ref":"#/components/schemas/buildsBuildParameters"},"resolved_ref":{"type":"string"},"start_time":{"type":"string"}},"type":"object"}]},"buildsBuildCondition":{"properties":{"message":{"type":"string"},"status":{"$ref":"#/components/schemas/buildsBuildStatus"}},"type":"object"},"buildsBuildLog":{"properties":{"line":{"type":"string"}},"type":"object"},"buildsBuildParameters":{"properties":{"envvars":{"additionalProperties":{"type":"string"},"description":"Environment variables and values to be set at build time","type":"object"},"image_name":{"description":"The name of the image to be built","type":"string"},"ref":{"description":"Source code reference to build (ex. a git branch name)","type":"string"},"source_url":{"description":"URL to the public git repository that contains the source code\nto build\n","type":"string"},"use_deprecated_versions":{"default":false,"description":"<- If set, it will use a deprecated version of the builder+runner images, use only as last resort while migrating. It will be ignored if `use_latest_versions` is `true`.","type":"boolean"},"use_latest_versions":{"default":false,"description":"<- If set, it will use the latest available versions of the builder+runner images, recommended if you want to be able to have some buffer before the old versions are removed","type":"boolean"}},"required":["source_url"],"type":"object"},"buildsBuildStatus":{"enum":["BUILD_PENDING","BUILD_RUNNING","BUILD_SUCCESS","BUILD_FAILURE","BUILD_CANCELLED","BUILD_TIMEOUT","BUILD_UNKNOWN"],"type":"string"},"buildsCancelResponse":{"properties":{"id":{"description":"Id of the cancelled build","type":"string"},"messages":{"$ref":"#/components/schemas/buildsResponseMessages"}},"type":"object"},"buildsCleanResponse":{"properties":{"messages":{"$ref":"#/components/schemas/buildsResponseMessages"}},"type":"object"},"buildsDeleteResponse":{"properties":{"id":{"description":"Id of the deleted build","type":"string"},"messages":{"$ref":"#/components/schemas/buildsResponseMessages"}},"type":"object"},"buildsGetResponse":{"properties":{"build":{"$ref":"#/components/schemas/buildsBuild"},"messages":{"$ref":"#/components/schemas/buildsResponseMessages"}},"type":"object"},"buildsHealthResponse":{"properties":{"messages":{"$ref":"#/components/schemas/buildsResponseMessages"},"status":{"enum":["OK","ERROR"],"type":"string"}},"type":"object"},"buildsLatestResponse":{"properties":{"build":{"$ref":"#/components/schemas/buildsBuild"},"messages":{"$ref":"#/components/schemas/buildsResponseMessages"}},"type":"object"},"buildsListResponse":{"properties":{"builds":{"items":{"$ref":"#/components/schemas/buildsBuild"},"type":"array"},"messages":{"$ref":"#/components/schemas/buildsResponseMessages"}},"type":"object"},"buildsNewBuild":{"properties":{"name":{"type":"string"},"parameters":{"$ref":"#/components/schemas/buildsBuildParameters"},"resolved_ref":{"type":"string"}},"type":"object"},"buildsQuota":{"properties":{"categories":{"items":{"$ref":"#/components/schemas/buildsQuotaCategory"},"type":"array"}},"type":"object"},"buildsQuotaCategory":{"properties":{"items":{"items":{"$ref":"#/components/schemas/buildsQuotaCategoryItem"},"type":"array"},"name":{"type":"string"}},"type":"object"},"buildsQuotaCategoryItem":{"properties":{"available":{"type":"string"},"capacity":{"type":"string"},"limit":{"type":"string"},"name":{"type":"string"},"used":{"type":"string"}},"type":"object"},"buildsQuotaResponse":{"properties":{"messages":{"$ref":"#/components/schemas/buildsResponseMessages"},"quota":{"$ref":"#/components/schemas/buildsQuota"}},"type":"object"},"buildsResponseMessages":{"description":"Lists of messages by priority, note that there will be a warning here when the endpoint is being deprecated\nwith information on how to proceed to update it.\n","properties":{"error":{"items":{"type":"string"},"type":"array"},"info":{"items":{"type":"string"},"type":"array"},"warning":{"items":{"type":"string"},"type":"array"}},"type":"object"},"buildsStartResponse":{"properties":{"messages":{"$ref":"#/components/schemas/buildsResponseMessages"},"new_build":{"$ref":"#/components/schemas/buildsNewBuild"}},"type":"object"},"componentsApiResponse_DeployToken_":{"properties":{"data":{"$ref":"#/components/schemas/componentsDeployToken"},"messages":{"$ref":"#/components/schemas/componentsResponseMessages","default":{"info":[],"warning":["You are using a beta feature of Toolforge."],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[DeployToken]"},"componentsApiResponse_DeploymentList_":{"properties":{"data":{"$ref":"#/components/schemas/componentsDeploymentList"},"messages":{"$ref":"#/components/schemas/componentsResponseMessages","default":{"info":[],"warning":["You are using a beta feature of Toolforge."],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[DeploymentList]"},"componentsApiResponse_Deployment_":{"properties":{"data":{"$ref":"#/components/schemas/componentsDeployment"},"messages":{"$ref":"#/components/schemas/componentsResponseMessages","default":{"info":[],"warning":["You are using a beta feature of Toolforge."],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[Deployment]"},"componentsApiResponse_HealthState_":{"properties":{"data":{"$ref":"#/components/schemas/componentsHealthState"},"messages":{"$ref":"#/components/schemas/componentsResponseMessages","default":{"info":[],"warning":["You are using a beta feature of Toolforge."],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[HealthState]"},"componentsApiResponse_ToolConfig_":{"properties":{"data":{"$ref":"#/components/schemas/componentsToolConfig"},"messages":{"$ref":"#/components/schemas/componentsResponseMessages","default":{"info":[],"warning":["You are using a beta feature of Toolforge."],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[ToolConfig]"},"componentsContinuousComponentInfo":{"properties":{"build":{"anyOf":[{"$ref":"#/components/schemas/componentsSourceBuildInfo"},{"$ref":"#/components/schemas/componentsSourceBuildReference"}],"title":"Build"},"run":{"$ref":"#/components/schemas/componentsContinuousRunInfo"},"component_type":{"type":"string","enum":["continuous","scheduled"],"title":"Component Type","default":"continuous"}},"type":"object","required":["build","run"],"title":"ContinuousComponentInfo"},"componentsContinuousRunInfo":{"properties":{"command":{"type":"string","title":"Command","description":"Command to use to run this component, `launcher` will be prepended to it to load the environment if needed.","examples":["bash -c 'while date; do sleep 10; done'"]},"cpu":{"type":"string","title":"Cpu","description":"Job CPU resource limit.","examples":["1"]},"emails":{"$ref":"#/components/schemas/componentsJobsEmailOption","description":"Job emails setting.","default":"none","examples":["none"]},"filelog":{"type":"boolean","title":"Filelog","description":"Whether this job uses filelog or not.","examples":[false]},"filelog_stderr":{"type":"string","title":"Filelog Stderr","description":"Path to the stderr file log.","examples":["logs/my-job.err"]},"filelog_stdout":{"type":"string","title":"Filelog Stdout","description":"Path to the stdout file log.","examples":["logs/my-job.out"]},"memory":{"type":"string","title":"Memory","description":"Job memory resource limit.","examples":["1G"]},"mount":{"$ref":"#/components/schemas/componentsMount","description":"NFS mount configuration for the job.","default":"none","examples":["none","all"]},"port":{"type":"integer","title":"Port","description":"Port where the service listens on. Other components can then address this one with `http://<this_component_name>:<port>`","examples":[8080]},"port_protocol":{"$ref":"#/components/schemas/componentsPortProtocol","description":"Protocol to use while exposing port for the job.","default":"tcp","examples":["tcp"]},"publish":{"type":"string","pattern":"^/$","title":"Publish","description":"If set, it will expose this component to the internet via https://<tool_name>.toolforge.org<path>. Only the root path '/' is supported for now.","examples":["/"]},"replicas":{"type":"integer","minimum":1.0,"title":"Replicas","description":"Number of replicas to be used for the job. Configurable only when continuous is true.","examples":[1]},"health_check_script":{"type":"string","title":"Health Check Script","description":"Script/command to run to check that the service is running correctly. This will run inside the same container as the service itself.","examples":["test -e /tmp/everything_is_ok"]},"health_check_http":{"type":"string","title":"Health Check Http","description":"HTTP path to query for the status of the system. It expects an HTTP 200 OK response, anything else is interpreted as failure.","examples":["/healthz"]}},"type":"object","required":["command"],"title":"ContinuousRunInfo"},"componentsDeployToken":{"properties":{"token":{"type":"string","format":"uuid","title":"Token"},"creation_date":{"type":"string","format":"date-time","title":"Creation Date"}},"type":"object","title":"DeployToken"},"componentsDeployment":{"properties":{"deploy_id":{"type":"string","title":"Deploy Id"},"creation_time":{"type":"string","title":"Creation Time"},"description":{"type":"string","title":"Description","description":"Human-readable context describing what was deployed and why.","default":""},"builds":{"additionalProperties":{"$ref":"#/components/schemas/componentsDeploymentBuildInfo"},"type":"object","title":"Builds"},"runs":{"additionalProperties":{"$ref":"#/components/schemas/componentsDeploymentRunInfo"},"type":"object","title":"Runs"},"tool_config":{"anyOf":[{"$ref":"#/components/schemas/componentsToolConfig"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/componentsDeploymentState","default":"pending"},"long_status":{"type":"string","title":"Long Status","default":""},"force_build":{"type":"boolean","title":"Force Build","default":false},"force_run":{"type":"boolean","title":"Force Run","default":false}},"type":"object","required":["deploy_id","creation_time","builds","runs"],"title":"Deployment"},"componentsDeploymentBuildInfo":{"properties":{"build_id":{"anyOf":[{"type":"string"},{"type":"string","enum":["no-id-yet","no-build-needed"]}],"title":"Build Id"},"build_status":{"$ref":"#/components/schemas/componentsDeploymentBuildState"},"build_image":{"anyOf":[{"type":"string"},{"type":"string","const":"no-image-yet"}],"title":"Build Image","default":"no-image-yet"},"build_long_status":{"type":"string","title":"Build Long Status","default":""}},"type":"object","required":["build_id","build_status"],"title":"DeploymentBuildInfo"},"componentsDeploymentBuildState":{"type":"string","enum":["pending","running","failed","successful","unknown","skipped","cancelled"],"title":"DeploymentBuildState"},"componentsDeploymentCreateRequest":{"properties":{"description":{"type":"string","title":"Description","description":"Optional human-readable context describing what is being deployed and why.","default":"","examples":["Deploy T401993: add deployment descriptions"]}},"type":"object","title":"DeploymentCreateRequest"},"componentsDeploymentList":{"properties":{"deployments":{"items":{"$ref":"#/components/schemas/componentsDeployment"},"type":"array","title":"Deployments"}},"type":"object","required":["deployments"],"title":"DeploymentList"},"componentsDeploymentRunInfo":{"properties":{"run_status":{"$ref":"#/components/schemas/componentsDeploymentRunState"},"run_long_status":{"type":"string","title":"Run Long Status","default":""}},"type":"object","required":["run_status"],"title":"DeploymentRunInfo"},"componentsDeploymentRunState":{"type":"string","enum":["pending","failed","successful","skipped","unknown"],"title":"DeploymentRunState","description":"This are the states a run can be in\n\nA run being an execution of a component (ex. running a continuous job, or creating a new scheduled job)."},"componentsDeploymentState":{"type":"string","enum":["pending","running","failed","timed_out","successful","cancelling","cancelled"],"title":"DeploymentState"},"componentsHTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/componentsValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"componentsHealthState":{"properties":{"status":{"type":"string","enum":["OK","ERROR"],"title":"Status"}},"type":"object","required":["status"],"title":"HealthState"},"componentsJobsEmailOption":{"type":"string","enum":["none","all","onfinish","onfailure"],"title":"JobsEmailOption"},"componentsMount":{"type":"string","enum":["all","none"],"title":"Mount"},"componentsPortProtocol":{"type":"string","enum":["tcp","udp"],"title":"PortProtocol"},"componentsResponseMessages":{"properties":{"info":{"items":{"type":"string"},"type":"array","title":"Info","default":[]},"warning":{"items":{"type":"string"},"type":"array","title":"Warning","default":["You are using a beta feature of Toolforge."]},"error":{"items":{"type":"string"},"type":"array","title":"Error","default":[]}},"type":"object","title":"ResponseMessages"},"componentsScheduledComponentInfo":{"properties":{"build":{"anyOf":[{"$ref":"#/components/schemas/componentsSourceBuildInfo"},{"$ref":"#/components/schemas/componentsSourceBuildReference"}],"title":"Build"},"run":{"$ref":"#/components/schemas/componentsScheduledRunInfo"},"component_type":{"type":"string","enum":["continuous","scheduled"],"title":"Component Type","default":"scheduled"}},"type":"object","required":["build","run"],"title":"ScheduledComponentInfo"},"componentsScheduledRunInfo":{"properties":{"command":{"type":"string","title":"Command","description":"Command to use to run this component, `launcher` will be prepended to it to load the environment if needed.","examples":["bash -c 'while date; do sleep 10; done'"]},"cpu":{"type":"string","title":"Cpu","description":"Job CPU resource limit.","examples":["1"]},"emails":{"$ref":"#/components/schemas/componentsJobsEmailOption","description":"Job emails setting.","default":"none","examples":["none"]},"filelog":{"type":"boolean","title":"Filelog","description":"Whether this job uses filelog or not.","examples":[false]},"filelog_stderr":{"type":"string","title":"Filelog Stderr","description":"Path to the stderr file log.","examples":["logs/my-job.err"]},"filelog_stdout":{"type":"string","title":"Filelog Stdout","description":"Path to the stdout file log.","examples":["logs/my-job.out"]},"memory":{"type":"string","title":"Memory","description":"Job memory resource limit.","examples":["1G"]},"mount":{"$ref":"#/components/schemas/componentsMount","description":"NFS mount configuration for the job.","default":"none","examples":["none","all"]},"retry":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Retry","description":"Job retry policy. Zero means don't retry at all (the default)","examples":[0]},"schedule":{"type":"string","title":"Schedule","description":"If the job is a cronjob, execution schedule.","examples":["@hourly","*/15 * * * *"]},"timeout":{"type":"integer","minimum":0.0,"title":"Timeout","description":"Maximum amount of seconds the job will be allowed to run before it is failed","examples":[120]}},"type":"object","required":["command","schedule"],"title":"ScheduledRunInfo"},"componentsSourceBuildInfo":{"properties":{"repository":{"type":"string","minLength":1,"format":"uri","title":"Repository","description":"URL of the public git repository with the code to build.","examples":["https://gitlab.wikimedia.org/toolforge-repos/sample-complex-app-backend"]},"ref":{"type":"string","title":"Ref","description":"Git ref to build from. This can be a tag, a branch name or a commit SHA.","examples":["main","v1.2.3","35b594f5d452c288c4a15fe667a7dfb94a7e5489"]},"use_latest_versions":{"type":"boolean","title":"Use Latest Versions","description":"If set, it will use the latest buildpacks and run images for this build. Helpful to always get the latest versions or test them before they become standard."},"use_deprecated_versions":{"type":"boolean","title":"Use Deprecated Versions","description":"If set, it will use the deprecated buildpacks and run images for this build. Helpful while migrating to the newer buildpacks."}},"type":"object","required":["repository","ref"],"title":"SourceBuildInfo"},"componentsSourceBuildReference":{"properties":{"reuse_from":{"type":"string","title":"Reuse From","description":"Component to re-use the build from.","examples":["parent-component"]}},"type":"object","required":["reuse_from"],"title":"SourceBuildReference"},"componentsToolConfig":{"properties":{"config_version":{"anyOf":[{"type":"string","const":"v1beta1"},{"type":"null"}],"title":"Config Version","default":"v1beta1","examples":["v1beta1"],"nullable":true},"source_url":{"type":"string","minLength":1,"format":"uri","title":"Source Url","description":"If passed, it will ignore anything else and try to fetch the configuration from the given URL on every deploy."},"components":{"additionalProperties":{"anyOf":[{"$ref":"#/components/schemas/componentsContinuousComponentInfo"},{"$ref":"#/components/schemas/componentsScheduledComponentInfo"}]},"type":"object","minProperties":1,"title":"Components","description":"List of components to run. Each component matches a continuous job, scheduled job, one-off job or webservice."}},"type":"object","required":["components"],"title":"ToolConfig"},"componentsValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"envvarsEnvvar":{"properties":{"name":{"$ref":"#/components/schemas/envvarsEnvvarName"},"value":{"description":"Value of the envvar to store","type":"string"}},"required":["name","value"],"type":"object"},"envvarsEnvvarName":{"pattern":"^[A-Z][A-Z_0-9]{2,}[A-Z0-9]$","type":"string"},"envvarsEnvvarsQuota":{"properties":{"quota":{"description":"The quota available to the user","type":"integer"},"used":{"description":"The quota used by the user","type":"integer"}},"type":"object"},"envvarsGetResponse":{"properties":{"envvar":{"$ref":"#/components/schemas/envvarsEnvvar"},"messages":{"$ref":"#/components/schemas/envvarsResponseMessages"}},"type":"object"},"envvarsHealthResponse":{"properties":{"messages":{"$ref":"#/components/schemas/envvarsResponseMessages"},"status":{"enum":["OK","ERROR"],"type":"string"}},"type":"object"},"envvarsListResponse":{"properties":{"envvars":{"items":{"$ref":"#/components/schemas/envvarsEnvvar"},"type":"array"},"messages":{"$ref":"#/components/schemas/envvarsResponseMessages"}},"type":"object"},"envvarsQuotaResponse":{"properties":{"messages":{"$ref":"#/components/schemas/envvarsResponseMessages"},"quota":{"$ref":"#/components/schemas/envvarsEnvvarsQuota"}},"type":"object"},"envvarsResponseMessages":{"description":"Lists of messages by priority, note that there will be a warning here when the endpoint is being deprecated\nwith information on how to proceed to update it.\n","properties":{"error":{"items":{"type":"string"},"type":"array"},"info":{"items":{"type":"string"},"type":"array"},"warning":{"items":{"type":"string"},"type":"array"}},"type":"object"},"jobsResponseMessages":{"type":"object","description":"Lists of messages by priority, note that there will be a warning here when the endpoint is being deprecated\nwith information on how to proceed to update it.\n","properties":{"info":{"type":"array","items":{"type":"string"}},"warning":{"type":"array","items":{"type":"string"}},"error":{"type":"array","items":{"type":"string"}}}},"jobsImageListResponse":{"type":"object","properties":{"images":{"type":"array","items":{"$ref":"#/components/schemas/jobsImage"}},"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsQuotaResponse":{"type":"object","properties":{"quota":{"$ref":"#/components/schemas/jobsQuota"},"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsJobListResponse":{"type":"object","properties":{"jobs":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/jobsDefinedOneOffJob"},{"$ref":"#/components/schemas/jobsDefinedScheduledJob"},{"$ref":"#/components/schemas/jobsDefinedContinuousJob"}]}},"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsJobResponse":{"type":"object","properties":{"job":{"oneOf":[{"$ref":"#/components/schemas/jobsDefinedOneOffJob"},{"$ref":"#/components/schemas/jobsDefinedScheduledJob"},{"$ref":"#/components/schemas/jobsDefinedContinuousJob"}]},"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsRestartResponse":{"type":"object","properties":{"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsDeleteResponse":{"type":"object","properties":{"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsUpdateResponse":{"type":"object","properties":{"messages":{"$ref":"#/components/schemas/jobsResponseMessages"},"job_changed":{"type":"boolean"}}},"jobsFlushResponse":{"type":"object","properties":{"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsHealthResponse":{"type":"object","properties":{"health":{"$ref":"#/components/schemas/jobsHealth"},"messages":{"$ref":"#/components/schemas/jobsResponseMessages"}}},"jobsHealth":{"type":"object","properties":{"status":{"type":"string","enum":["OK","ERROR"]},"message":{"type":"string"}}},"jobsImage":{"type":"object","properties":{"shortname":{"type":"string"},"image":{"type":"string"}}},"jobsQuota":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"limit":{"type":"string"},"used":{"type":"string"}}}}}}}}},"jobsJobLogs":{"type":"string"},"jobsHealthCheckType":{"type":"string","enum":["script","http"]},"jobsScriptHealthCheck":{"type":"object","description":"Health check implemented as a script that runs inside the container","required":["type","script"],"properties":{"type":{"$ref":"#/components/schemas/jobsHealthCheckType"},"script":{"type":"string"}}},"jobsHttpHealthCheck":{"type":"object","description":"Health check implemented as an HTTP request inside the container","required":["type","path"],"properties":{"type":{"$ref":"#/components/schemas/jobsHealthCheckType"},"path":{"type":"string"}}},"jobsEmailOption":{"type":"string","description":"job emails setting.","enum":["none","all","onfinish","onfailure"],"example":"all"},"jobsStatusShort":{"type":"string","description":"Short strings representing a job's status","enum":["pending","running","succeeded","failed","unknown"]},"jobsCommonJobStatus":{"type":"object","required":["short","duration"],"properties":{"short":{"$ref":"#/components/schemas/jobsStatusShort"},"messages":{"type":"array","description":"This field is for more detailed explanation of a job's status","example":["scheduling","initializing","exitcode 1"]},"duration":{"type":"string","description":"This shows an estimate of how long a job has been in the current status","example":"24d24h59m45s"},"up_to_date":{"type":"boolean","description":"User's can bypass toolforge to directly modify resources in their runtime namespace.\nThis field is to report if such changes were made resulting in the copy of the job in\nthe runtime being different from what the user submitted during creation\n"}}},"jobsOneOffJobStatus":{"allOf":[{"$ref":"#/components/schemas/jobsCommonJobStatus"}]},"jobsScheduledJobStatus":{"allOf":[{"$ref":"#/components/schemas/jobsCommonJobStatus"},{"type":"object","properties":{"previous_schedule":{"type":"string","description":"datetime string of the prev time the job was triggered (iso8601)","example":"2025-08-27T10:07:48Z"},"next_schedule":{"type":"string","description":"datetime string of the next time the job will be triggered (iso8601)","example":"2025-08-28T10:07:48Z"}}}]},"jobsContinuousJobStatus":{"allOf":[{"$ref":"#/components/schemas/jobsCommonJobStatus"}]},"jobsStorageOptions":{"type":"object","properties":{"mount":{"type":"string","description":"NFS mount configuration for the job.","enum":["all","none"],"example":"none","default":"all"}}},"jobsCommonOptions":{"allOf":[{"$ref":"#/components/schemas/jobsStorageOptions"},{"type":"object","required":["name","imagename"],"properties":{"name":{"type":"string","description":"Unique name that identifies the job.","pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])?([.][a-z0-9]([-a-z0-9]*[a-z0-9])?)*$","minLength":1,"maxLength":52,"example":"my-job"},"imagename":{"type":"string","description":"Container image the job uses.","example":"tool-my-tool/tool-my-tool:latest"},"retry":{"type":"integer","description":"Job retry policy. Zero means don't retry at all (the default)","minimum":0,"maximum":5,"example":0,"default":0},"memory":{"type":["string","null"],"description":"Job memory resource limit.","example":"1G"},"cpu":{"type":["string","null"],"description":"Job CPU resource limit.","example":"1"},"emails":{"$ref":"#/components/schemas/jobsEmailOption"}}}]},"jobsFileLoggingOptions":{"allOf":[{"$ref":"#/components/schemas/jobsStorageOptions"},{"type":"object","properties":{"filelog":{"type":"boolean","description":"Whether this job uses filelog or not.","example":false,"default":false},"filelog_stdout":{"type":["string","null"],"description":"Path to the stdout file log.","example":"logs/my-job.out"},"filelog_stderr":{"type":["string","null"],"description":"Path to the stderr file log.","example":"logs/my-job.err"}}}]},"jobsNewOneOffJob":{"allOf":[{"$ref":"#/components/schemas/jobsCommonOptions"},{"$ref":"#/components/schemas/jobsFileLoggingOptions"},{"type":"object","required":["cmd"],"properties":{"cmd":{"type":"string","description":"Command that this job is executing.","example":"./some-command.sh --with-args"},"job_type":{"type":"string","enum":["one-off"]}}}]},"jobsNewScheduledJob":{"allOf":[{"$ref":"#/components/schemas/jobsCommonOptions"},{"$ref":"#/components/schemas/jobsFileLoggingOptions"},{"type":"object","required":["cmd","schedule"],"properties":{"cmd":{"type":"string","description":"Command that this job is executing.","example":"./some-command.sh --with-args"},"job_type":{"type":"string","enum":["scheduled"]},"schedule":{"type":"string","description":"If the job is a cronjob, execution schedule.","example":"@hourly"},"timeout":{"type":["integer","null"],"description":"Maximum amount of seconds the job will be allowed to run before it is failed","minimum":0,"example":120}}}]},"jobsNewContinuousJob":{"allOf":[{"$ref":"#/components/schemas/jobsCommonOptions"},{"$ref":"#/components/schemas/jobsFileLoggingOptions"},{"type":"object","required":["cmd"],"properties":{"cmd":{"type":"string","description":"Command that this job is executing.","example":"./some-command.sh --with-args"},"continuous":{"type":"boolean","description":"If a job should be always running.\nThis is deprecated and is only here for backward compatibility.\nUse job_type instead.\n","example":true},"job_type":{"type":"string","enum":["continuous"]},"replicas":{"type":["integer","null"],"description":"Number of replicas to be used for the job","minimum":1,"example":1},"port":{"type":["integer","null"],"description":"If passed, it will make this port available internally for other jobs (and externally under https/443 if `publish` is also passed)","minimum":1,"maximum":65535,"example":8080},"port_protocol":{"type":"string","enum":["tcp","udp"],"description":"Protocol for the port exposed by the job","example":"tcp","default":"tcp"},"publish":{"type":"string","description":"Indicates if this job is exposed to the internet via https://{toolname}.toolforge.org by specifying the path.\nOnly the root path '/' is supported for now\n","example":"/"},"health_check":{"type":["object","null"],"description":"Health check configuration for the job","oneOf":[{"$ref":"#/components/schemas/jobsScriptHealthCheck"},{"$ref":"#/components/schemas/jobsHttpHealthCheck"}],"discriminator":{"propertyName":"type","mapping":{"script":"#/components/schemas/jobsScriptHealthCheck","http":"#/components/schemas/jobsHttpHealthCheck"}}}}}]},"jobsDefinedCommonOptions":{"allOf":[{"$ref":"#/components/schemas/jobsCommonOptions"},{"type":"object","properties":{"image":{"type":"string","description":"Container image the job uses.","example":"tool-my-tool/tool-my-tool:latest"},"image_state":{"type":"string","description":"Information about the image state, i.e, if it is stable, deprecated, or something else.","example":"stable"},"status_short":{"type":"string","description":"Job status, short text.","example":"Running."},"status_long":{"type":"string","description":"Job status, extended text.","example":"Running since 30 seconds ago."},"status":{"type":"object","description":"v2 of status_long|status_short, for standardized job status reporting","oneOf":[{"$ref":"#/components/schemas/jobsOneOffJobStatus"},{"$ref":"#/components/schemas/jobsContinuousJobStatus"},{"$ref":"#/components/schemas/jobsScheduledJobStatus"}]}}}]},"jobsDefinedOneOffJob":{"allOf":[{"$ref":"#/components/schemas/jobsDefinedCommonOptions"},{"$ref":"#/components/schemas/jobsFileLoggingOptions"},{"type":"object","required":["cmd","job_type"],"properties":{"cmd":{"type":"string","description":"Command that this job is executing.","example":"./some-command.sh --with-args"},"job_type":{"type":"string","enum":["one-off"]}}}]},"jobsDefinedScheduledJob":{"allOf":[{"$ref":"#/components/schemas/jobsDefinedCommonOptions"},{"$ref":"#/components/schemas/jobsFileLoggingOptions"},{"type":"object","required":["cmd","schedule","job_type"],"properties":{"cmd":{"type":"string","description":"Command that this job is executing.","example":"./some-command.sh --with-args"},"job_type":{"type":"string","enum":["scheduled"]},"schedule":{"type":"string","description":"If the job is a cronjob, execution schedule.","example":"@hourly"},"schedule_actual":{"type":"string","description":"If the job is a cronjob, actual execution schedule.","example":"15 * * * *"},"timeout":{"type":["integer","null"],"description":"Maximum amount of seconds the job will be allowed to run before it is failed","minimum":0,"example":120}}}]},"jobsDefinedContinuousJob":{"allOf":[{"$ref":"#/components/schemas/jobsDefinedCommonOptions"},{"$ref":"#/components/schemas/jobsFileLoggingOptions"},{"type":"object","required":["cmd","job_type"],"properties":{"cmd":{"type":"string","description":"Command that this job is executing.","example":"./some-command.sh --with-args"},"continuous":{"type":"boolean","description":"If a job should be always running.\nThis is deprecated and is only here for backward compatibility.\nUse job_type instead.\n","example":true},"job_type":{"type":"string","enum":["continuous"]},"replicas":{"type":["integer","null"],"description":"Number of replicas to be used for the job","minimum":1,"example":1},"port":{"type":["integer","null"],"description":"Port to expose for the job","minimum":1,"maximum":65535,"example":8080},"port_protocol":{"type":"string","enum":["tcp","udp"],"description":"Protocol for the port exposed by the job","example":"tcp"},"publish":{"type":"string","description":"Returns the job's publish path, if the job is published.\n","example":"/"},"health_check":{"type":["object","null"],"description":"Health check configuration for the job","oneOf":[{"$ref":"#/components/schemas/jobsScriptHealthCheck"},{"$ref":"#/components/schemas/jobsHttpHealthCheck"}],"discriminator":{"propertyName":"type","mapping":{"script":"#/components/schemas/jobsScriptHealthCheck","http":"#/components/schemas/jobsHttpHealthCheck"}}}}}]},"logsApiResponse_HealthState_":{"properties":{"data":{"$ref":"#/components/schemas/logsHealthState"},"messages":{"$ref":"#/components/schemas/logsResponseMessages","default":{"info":[],"warning":[],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[HealthState]"},"logsApiResponse_JobsLogs_":{"properties":{"data":{"$ref":"#/components/schemas/logsJobsLogs"},"messages":{"$ref":"#/components/schemas/logsResponseMessages","default":{"info":[],"warning":[],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[JobsLogs]"},"logsApiResponse_LogWriteResult_":{"properties":{"data":{"$ref":"#/components/schemas/logsLogWriteResult"},"messages":{"$ref":"#/components/schemas/logsResponseMessages","default":{"info":[],"warning":[],"error":[]}}},"type":"object","required":["data"],"title":"ApiResponse[LogWriteResult]"},"logsHTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/logsValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"logsHealthState":{"properties":{"status":{"type":"string","enum":["OK","ERROR"],"title":"Status"}},"type":"object","required":["status"],"title":"HealthState"},"logsJobCreatedLog":{"properties":{"job_name":{"type":"string","title":"Job Name"},"datetime":{"type":"string","format":"date-time","title":"Datetime"},"user_name":{"type":"string","title":"User Name","default":""},"event_type":{"type":"string","const":"created","title":"Event Type","default":"created"},"message_format":{"$ref":"#/components/schemas/logsMessageFormat","default":"json"},"message":{"type":"string","title":"Message"}},"type":"object","required":["job_name","message"],"title":"JobCreatedLog"},"logsJobDeletedLog":{"properties":{"job_name":{"type":"string","title":"Job Name"},"datetime":{"type":"string","format":"date-time","title":"Datetime"},"user_name":{"type":"string","title":"User Name","default":""},"event_type":{"type":"string","const":"deleted","title":"Event Type","default":"deleted"},"message_format":{"$ref":"#/components/schemas/logsMessageFormat","default":"json"},"message":{"type":"string","title":"Message"}},"type":"object","required":["job_name","message"],"title":"JobDeletedLog"},"logsJobRestartedLog":{"properties":{"job_name":{"type":"string","title":"Job Name"},"datetime":{"type":"string","format":"date-time","title":"Datetime"},"user_name":{"type":"string","title":"User Name","default":""},"event_type":{"type":"string","const":"restarted","title":"Event Type","default":"restarted"}},"type":"object","required":["job_name"],"title":"JobRestartedLog"},"logsJobUpdatedLog":{"properties":{"job_name":{"type":"string","title":"Job Name"},"datetime":{"type":"string","format":"date-time","title":"Datetime"},"user_name":{"type":"string","title":"User Name","default":""},"event_type":{"type":"string","const":"updated","title":"Event Type","default":"updated"},"message_format":{"$ref":"#/components/schemas/logsMessageFormat","default":"json"},"message":{"type":"string","title":"Message"}},"type":"object","required":["job_name","message"],"title":"JobUpdatedLog"},"logsJobsLogs":{"properties":{"logs":{"items":{"$ref":"#/components/schemas/logsLogEntry"},"type":"array","title":"Logs"},"next":{"anyOf":[{"$ref":"#/components/schemas/logsPaginationCursor"},{"type":"null"}]}},"type":"object","required":["logs"],"title":"JobsLogs"},"logsLogEntry":{"properties":{"pod":{"type":"string","title":"Pod","default":""},"container":{"type":"string","title":"Container","default":""},"datetime":{"type":"string","format":"date-time","title":"Datetime"},"message":{"type":"string","title":"Message"}},"type":"object","required":["datetime","message"],"title":"LogEntry","description":"Represents a single log entry."},"logsLogWriteResult":{"properties":{"status":{"type":"string","enum":["OK","ERROR"],"title":"Status"}},"type":"object","required":["status"],"title":"LogWriteResult"},"logsMessageFormat":{"type":"string","enum":["json"],"title":"MessageFormat","description":"In case we want to encode things in a different format in the future."},"logsPaginationCursor":{"properties":{"url":{"type":"string","title":"Url","readOnly":true}},"type":"object","required":["url"],"title":"PaginationCursor","description":"PaginationCursor exposes a continuation URI for pagination.\nThe URI is relative (so as not to couple this codebase to the network topology),\nso users need to resolve it against their previous request's absolute URL."},"logsResponseMessages":{"properties":{"info":{"items":{"type":"string"},"type":"array","title":"Info","default":[]},"warning":{"items":{"type":"string"},"type":"array","title":"Warning","default":[]},"error":{"items":{"type":"string"},"type":"array","title":"Error","default":[]}},"type":"object","title":"ResponseMessages"},"logsValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"responses":{"buildsbad-parameters":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsResponseMessages"}}},"description":"Bad parameters passed"},"buildsconflict":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsResponseMessages"}}},"description":"operation conflicts with the current state of a build(s)"},"buildsinternal-error":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsResponseMessages"}}},"description":"An internal error happened"},"buildsnot-found":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsResponseMessages"}}},"description":"The latest build was not found"},"buildsunauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/buildsResponseMessages"}}},"description":"Unauthorized"},"envvarsforbidden":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsResponseMessages"}}},"description":"You are forbidden from performing this action"},"envvarsinternal-error":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsResponseMessages"}}},"description":"An internal error happened"},"envvarsnot-found":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/envvarsResponseMessages"}}},"description":"The latest build was not found"},"jobsunauthorized_error":{"description":"Unauthorized error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsResponseMessages"}}}},"jobsbad_parameters_error":{"description":"Bad parameters error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsResponseMessages"}}}},"jobsnot_found_error":{"description":"Object not found error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/jobsResponseMessages"}}}}}},"tags":[{"name":"Builds"},{"name":"Components"},{"name":"Envvars"},{"name":"Jobs"},{"name":"Logs"}]}