---
title: "작업 결과 조회"
method: GET
path: "/v1/jobs/{job_id}/result"
tags: ["UnifiedJob"]
---

# 작업 결과 조회

`GET /v1/jobs/{job_id}/result`

## Request

- Base URL: `https://api.xdata.kr` (the document declares no server; this is the origin it was published from)
- URL: `https://api.xdata.kr/v1/jobs/{job_id}/result`
- Auth: one of:
  - HTTP basic
  - OAuth 2 (authorization code, authorization URL `https://api.xdata.kr/oauth/authorize`, token URL `https://api.xdata.kr/oauth/token`)

`GET /v1/jobs/{job_id}/result` 작업 결과 조회.

응답 분기:
    - 작업 부재 (또는 다른 org/env)          → 404 JOB_NOT_FOUND (정보 노출 차단)
    - status != 'SUCCEEDED'                  → 409 JOB_INVALID_TRANSITION
    - status == 'SUCCEEDED'                  → 200 OK + result.data + result.artifacts
      (산출물 서명은 한 곳에서 한다). 허용 목록 · 서명 실패 → 500
    - 정책 거부 (AuthPolicyError)            → 401/402/403/422/429 (PR-M)
    - PrincipalContext.organization_id None → 400 (운영 진단)
    - JobRepository.get_result_by_id ValueError → 400 VALIDATION_INVALID_FIELD
    - 그 외 예외                             → 500 (미들웨어 fallback)

## Path parameters

- `job_id` string, required

## Query parameters

- `env_scope` 'production' | 'real_test' | 'sandbox', nullable: 환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.

## Headers

- `Authorization` string, nullable
- `X-Env-Scope` 'production' | 'real_test' | 'sandbox', nullable: 환경을 고릅니다. 값은 production · real_test · sandbox 중 하나입니다. 경로 접두(/v1/sandbox/... · /v1/test/... · /v1/production/...) · X-Env-Scope 헤더 · env_scope 쿼리 가운데 한 통로로 반드시 보내야 합니다. 빼면 자동으로 채우지 않고 거절하며, 두 통로에 서로 다른 값을 담아도 거절합니다. 거절은 HTTP 422 이고 오류 코드는 VALIDATION_ENV_SCOPE_MISMATCH 입니다.

## Response `200`

Successful Response

- JobResultResponse: `GET /v1/jobs/{job_id}/result` 성공 응답 - 정본 §4-3 의 네 칸과 1:1. 이 라우트는 `status == 'SUCCEEDED'` 일 때만 이 본문을 낸다(그 아닌 상태는 409). 그래서 `finished_at` 이 필수다 - `serialize_job_result_response` 가 그것이 비면 ValueError 로 격상하는 다층 안전망을 둔다. 문서 전용인 까닭은 `JobSubmitResponse` 의 그 문단과 같다.
  - `job_id` string, required
  - `status` string, required: 이 본문이 나올 때는 항상 `SUCCEEDED` 다.
  - `result` JobResultPayload, required: `GET /v1/jobs/{job_id}/result` 의 `result` 칸 - 정본 §4-3. `data` 는 인라인 결과(요약)이고 `artifacts` 는 문서 파일 목록이다(항상 배열). 이 표준 전에 저장소로 끝난 작업은 `data` 가 없고 파일 하나가 `artifacts` 한 항목으로 온다. 이 모델은 **문서 전용**이고(위 `JobSubmitResponse` 의 그 문단) 값의 강제는 DB 와 `serialize_job_result_response` 의 다층 안전망이 한다. 여기서 또 검증하면 판정이 두 벌이 된다. `result_schema` 라는 파이썬 이름에 `alias="schema"` 를 둔 까닭: 정본 칸 이름은 `schema` 인데 그 이름을 그대로 쓰면 pydantic 이 `Field name "schema" shadows an attribute in parent "BaseModel"` 경고를 낸다(직접 넣어 재서 확인했다). alias 를 쓰면 경고가 0 이고 OpenAPI 의 칸 이름은 `schema` 그대로다 - 정본과 1:1 이 유지된다.
    - `schema` string, required: `provider.action.vN` 형식으로 고정(정본 §4-3).
    - `data` object, nullable: 인라인 결과(요약). 이 표준 전 저장소 결과면 없다.
    - `artifacts` JobArtifactEntry[]: 문서 파일 목록. 파일을 내지 않는 작업이면 빈 배열이다.
      - `artifact_id` string, nullable: `art_` + 26자 ULID.
      - `name` string, required: 받을 파일명(`업무명_YYYYMMDD[_구분].확장자`).
      - `content_type` string, nullable: 예: `application/pdf`.
      - `size_bytes` integer, nullable
      - `sha256` string, nullable: 받은 파일과 대조할 해시(16진수 64자).
      - `expires_at` string, nullable: KST ISO-8601. 이 시각 뒤로는 파일을 받을 수 없다(보관 7일).
      - `expired` boolean, required: 보관 기간이 지났는가. 참이면 `download_url` 이 없다.
      - `download_url` string, nullable: 서명된 단기 URL(15분). 지나면 결과를 다시 조회하면 새로 받는다.
  - `finished_at` string, required: KST ISO-8601.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/xdata/apis/xboss-api.md) · [All operations](https://skmtc.dev/xdata/apis/xboss-api/llms.txt) · [OpenAPI document](https://skmtc.dev/xdata/apis/xboss-api/revisions/816de78950db?raw)
