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
}