Glowb Dev Docs
Admin APIDM 자동화

잡 상세 조회

수집 진행 상태와 결과 엑셀 다운로드 링크를 조회합니다. 폴링에 사용합니다.

잡 상세 조회

잡 하나의 진행 상태와 결과 다운로드 링크를 조회합니다. 수집 API 호출 후 폴링하는 용도입니다.

HTTP 요청

GET /ai/admin/dm-automation/jobs/{jobId}
Authorization: Bearer {access_token}

Path Parameters

파라미터타입필수설명
jobIdLong수집 API가 반환한 잡 번호

응답

성공 응답 — 진행 중

{
  "status": 200,
  "code": null,
  "message": "조회 성공",
  "data": {
    "jobId": 42,
    "jobType": "COLLECT",
    "status": "RUNNING",
    "requestedBy": "admin01",
    "inputFileName": "계정목록.xlsx",
    "resultFileName": null,
    "downloadUrl": null,
    "rowCount": null,
    "errorCount": null,
    "errorMessage": null,
    "createdAt": "2026-07-23T14:02:11",
    "completedAt": null
  }
}

성공 응답 — 완료

{
  "status": 200,
  "code": null,
  "message": "조회 성공",
  "data": {
    "jobId": 42,
    "jobType": "COLLECT",
    "status": "COMPLETED",
    "requestedBy": "admin01",
    "inputFileName": "계정목록.xlsx",
    "resultFileName": "dm_collect_result.xlsx",
    "downloadUrl": "https://storage.googleapis.com/glowb-input/dm-automation/COLLECT/9f2c7b1e4a5d4c8e9b0a1f2e3d4c5b6a/result_dm_collect_result.xlsx",
    "rowCount": 218,
    "errorCount": 3,
    "errorMessage": null,
    "createdAt": "2026-07-23T14:02:11",
    "completedAt": "2026-07-23T14:05:47"
  }
}

성공 응답 — 실패

{
  "status": 200,
  "code": null,
  "message": "조회 성공",
  "data": {
    "jobId": 43,
    "jobType": "COLLECT",
    "status": "FAILED",
    "requestedBy": "admin01",
    "inputFileName": "계정목록.xlsx",
    "resultFileName": null,
    "downloadUrl": null,
    "rowCount": null,
    "errorCount": null,
    "errorMessage": "ValueError: 처리할 Instagram 계정 URL이 없습니다.",
    "createdAt": "2026-07-23T14:10:02",
    "completedAt": "2026-07-23T16:22:41"
  }
}

응답 필드

필드타입설명
jobIdLong잡 번호
jobTypeStringCOLLECT / GENERATE_MESSAGE
statusStringQUEUED / RUNNING / COMPLETED / FAILED
requestedByString요청한 관리자 ID
inputFileNameString업로드한 원본 파일명
resultFileNameString결과 파일명. COMPLETED가 아니면 null
downloadUrlString결과 엑셀 공개 URL. COMPLETED가 아니면 null
rowCountInteger처리 행 수. COMPLETED가 아니면 null
errorCountInteger실패 행 수. COMPLETED가 아니면 null
errorMessageString실패 사유. 파이썬 워커의 예외 메시지("ValueError: ..." 형태) 또는 등록 단계 에러가 담김 (2000자 절단)
createdAtLocalDateTime잡 생성 시각
completedAtLocalDateTime종료 시각. 진행 중이면 null

rowCounterrorCount는 파이썬이 해당 응답 헤더를 주지 않으면 COMPLETED 상태에서도 null일 수 있습니다. "보고되지 않음"과 "0건"을 구분하기 위해 0으로 대체하지 않습니다.

폴링 예시

async function pollJob(jobId) {
  while (true) {
    const res = await fetch(`/ai/admin/dm-automation/jobs/${jobId}`, {
      headers: { Authorization: `Bearer ${token}` },
    });
    const body = await res.json();

    // HTTP 상태가 아니라 본문 status로 판별
    if (body.status !== 200) throw new Error(body.message);

    const job = body.data;
    if (job.status === 'COMPLETED') return job;
    if (job.status === 'FAILED') throw new Error(job.errorMessage);

    await new Promise((r) => setTimeout(r, 30000));
  }
}

수집은 수 시간이 걸릴 수 있습니다 (수천수만 계정이면 2시간 이상). 짧은 간격으로 무한 폴링을 걸지 말고 넉넉한 간격(예: 30초1분)으로, UI는 실시간 대기보다 "진행 중 목록에서 나중에 확인"하는 흐름을 권장합니다.

파이썬 워커가 완료되면 콜백으로 잡 상태를 갱신하므로, 워커가 살아 있는 한 결국 COMPLETED / FAILED로 바뀝니다. 다만 워커가 재배포로 죽으면 그 잡은 콜백을 못 보내 RUNNING으로 남습니다 — 프론트에서 아주 오래된 RUNNING (예: 하루 이상)은 사용자에게 재실행을 안내하는 편이 안전합니다.

에러 응답

HTTP 상태는 항상 200이며, 아래 코드는 응답 본문의 status 값입니다.

본문 statuscode설명
404INVALID_DATA존재하지 않는 잡 번호
401-인증 실패
403-ADMIN 권한 필요

API 테스트

On this page