Glowb Dev Docs
SaaS API전자계약 API

POST /ai/contract/{contractId}/sign

서명 이미지를 제출하여 계약을 체결합니다.

서명 제출

서명 이미지를 제출하여 계약을 체결합니다. OTP 인증 완료(OTP_VERIFIED) 후에만 가능합니다.

항목
메서드POST
경로/ai/contract/{contractId}/sign
인증Bearer Token (크리에이터)

서명 제출 시 다음 작업이 자동으로 수행됩니다:

  • 서명 이미지 S3 업로드
  • 계약서 전문 + 서명이 포함된 PDF 생성
  • PDF SHA-256 해시 계산 및 저장
  • 계약서 상태를 SIGNED로 변경
  • 신청 선정 상태(selectionStatus)를 SELECTED로 변경
  • 인플루언서에 대표 서명이 없는 경우 자동 저장

요청

POST /ai/contract/1/sign HTTP/1.1
Host: api.glowb.com
Authorization: Bearer {access_token}
Content-Type: application/json

{
  "signatureImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
}
curl -X POST "https://api.glowb.com/ai/contract/1/sign" \
  -H "Authorization: Bearer {access_token}" \
  -H "Content-Type: application/json" \
  -d '{"signatureImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."}'
// Canvas에서 서명 이미지를 Base64로 변환
const signatureImage = canvas.toDataURL('image/png');

const response = await fetch('/ai/contract/1/sign', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${accessToken}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    signatureImage,
  }),
});
const result = await response.json();

Path Parameters

Prop

Type

Request Body

Prop

Type

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "계약 체결이 완료되었습니다.",
  "data": {
    "contractId": 1,
    "applicationId": 101,
    "status": "SIGNED",
    "campaignTitle": "여름 선크림 캠페인",
    "collabNo": 123,
    "stageName": "뷰티크리에이터A",
    "realName": "홍길동",
    "businessName": "길동 미디어",
    "bankName": "신한은행",
    "bankAccountNumber": "110-123-456789",
    "accountHolderName": "홍길동",
    "signerName": "홍길동",
    "registrationNumber": "123-45-67890",
    "address": "서울특별시 강남구 테헤란로 123",
    "representative": "홍길동",
    "signatureImageUrl": "https://s3.../contract/signature/101/1_1708926645.png",
    "signedPdfUrl": "https://s3.../contract/pdf/101/1_1708926645.pdf",
    "contractDate": "2026-02-27",
    "sentAt": "2026-02-25T10:00:00",
    "signedAt": "2026-02-27T14:30:00",
    "createdAt": "2026-02-25T09:55:00"
  }
}

응답은 ContractDetailResponseDto와 동일한 구조입니다.

에러 응답

상태 오류 - OTP 미인증 (400)

{
  "status": 400,
  "code": "CONTRACT_INVALID_STATE",
  "message": "OTP 인증을 먼저 완료해주세요.",
  "data": null
}

이미 서명 완료 (400)

{
  "status": 400,
  "code": "CONTRACT_ALREADY_SIGNED",
  "message": "이미 서명이 완료된 계약서입니다.",
  "data": null
}

서명 이미지 누락 (400)

{
  "status": 400,
  "code": "VALIDATION_ERROR",
  "message": "서명 이미지는 필수입니다",
  "data": null
}

API 테스트

On this page