{"openapi":"3.0.1","info":{"title":"얼마싸인 Open API","description":"얼마싸인 Open API"},"servers":[{"url":"https://olmasign.com"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"API설명","description":"\r\n# API 사용\r\n얼마싸인 API 이용을 원하시면 아래 링크를 통해 문의해주세요. \r\n얼마싸인 [**고객문의 >**](https://olmasign.com/wm/signbill/product/customer.do)\r\n\r\n## API KEY 발급\r\nolmasign.com 서비스에 로그인 후 상단 메뉴\r\n`API` -> `OPEN API` -> `사전 준비` -> `3.인증 ID 및 KEY 전송`\r\n이메일 전송을 클릭하면 발급 받을 수 있습니다.\r\n\r\n---\r\n\r\n## 액세스 토큰\r\nAPI KEY 발급에서 설명드린대로 API ID, KEY 발급 후 `액세스 토큰 요청 API`를 호출하여 토큰을 발급받을 수 있습니다.\r\n\r\n📤 **REQUEST**\r\n\r\n```cmd\r\ncurl -X \"GET\" \\\r\n \"https://olmasign.com/openapi/v1/token\" \\\r\n -H \"x-api-id: fAfbp7ka2O\" \\\r\n -H \"x-api-key: CpQKhFvZNlFMhYRc1UG1lA==\"\r\n```\r\n\r\n> ⚠️ **액세스 토큰 만료시간** \r\n> 발급받은 액세스 토큰의 만료일은 `30일`이며, 만료되면 다시 발급받아야 합니다.\r\n\r\n📤 **RESPONSE**\r\n\r\n응답 content type은 `application/json` 입니다. \r\n`accessToken` 키의 값이 액세스 토큰입니다.\r\n\r\n```json\r\n{\r\n \"accessToken\": \"eyJ0eXAiOiJKV1QiLCJiOiJIUzUxMiJ9.eyJhcGlVcjp7InNxVXNlciI6MTQ3OTksImlkVXNlciI6ImpkaSIsImNkQ29tcGFueSI6IjEwMDAifSwicm9sZSI6IlJPTEVfT1BFTkFQSSIsImlhdCI6MTc0NzkwMTU1OSwiZXhwIjoxNzUwNTc5OTU5fQ.2Rqi1HExjNj9NFdLCDJy2oT9RIWemeeKDoK1bbhwHQg26WQUEbXn8rHi9v_QCxyn1YRpE1doI_1xlihbw\",\r\n \"expiresAt\": \"2025-06-22T08:12:39.000+00:00\"\r\n}\r\n```\r\n\r\n---\r\n## API 요청\r\n\r\n발급받은 액세스 토큰을 사용해서 API를 호출합니다.\r\n\r\n전자계약 API 연동 제품별 구분이 필요한 경우, header에 `product_name` 추가해서 요청 바랍니다.\r\n전자계약 발송 History이력에 추가됩니다. `(default: olmasign)`\r\n\r\n📤 **REQUEST (회사 정보 조회)**\r\n\r\n```cmd\r\ncurl -X \"GET\" \\\r\n \"https://olmasign.com/openapi/v1/companys\" \\\r\n -H \"product_name: olmasign\"\r\n -H \"Authorization: Bearer eyJ0eXAiOiJKV1QiLCJiOiJIUzUxMiJ9.eyJhcGlVcjp7InNxVXNlciI6MTQ3OTksImlkVXNlciI6ImpkaSIsImNkQ29tcGFueSI6IjEwMDAifSwicm9sZSI6IlJPTEVfT1BFTkFQSSIsImlhdCI6MTc0NzkwMTU1OSwiZXhwIjoxNzUwNTc5OTU5fQ.2Rqi1HExjNj9NFdLCDJy2oT9RIWemeeKDoK1bbhwHQg26WQUEbXn8rHi9v_QCxyn1YRpE1doI_1xlihbw\"\r\n```\r\n\r\n---\r\n# HTTPS 프로토콜을 확인해주세요\r\n\r\n웹훅 전송 URL, 임베디드 redirect URL 등록시 \r\nURL은 반드시 HTTPS 프로토콜(SSL/TLS 기반) 을 사용해야 하며, HTTP는 지원되지 않습니다. \r\nSSL 인증서가 없거나 유효하지 않은 경우 웹훅 전송, 임베디드 redirect URL 이 정상적으로 동작하지 않을수 있습니다.\r\n\r\n- 테스트를 위해선 `ngrok` 같은 터널링 서비스를 사용하시면 됩니다.\r\n\r\n---\r\n\r\n# 에러코드 안내\r\n\r\n- 일부 에러 메시지 내용은 커스텀 되어 보여질수 있습니다.\r\n### 📥 일반 에러 응답 예시\r\n\r\n
\r\n{\r\n \"errorCode\": \"{CODE}\",\r\n \"message\": \"{ERROR_CODE}\",\r\n \"description\" : \"{DESCRIPTION}\"\r\n}\r\n
\r\n\r\n### 📥 Validated 에러 응답 예시\r\n\r\n{\r\n \"errorCode\": 501,\r\n \"message\": \"BAD_REQUEST\",\r\n \"description\": \"Request body is invalid\",\r\n \"errors\": [\r\n {\r\n \"field\": \"{FIELD}\",\r\n \"rejectedValue\": \"{REJECT_VALUE}\",\r\n \"defaultMessage\": \"{DEFAULT_MESSAGE}\"\r\n }\r\n ]\r\n}\r\n
\r\n\r\n\r\n\r\n## 일반 에러\r\n| 코드 | HTTP 상태 | 에러 코드 | 메시지 |\r\n|-----|-----------------------------|-------------------------------|---------------------------------------|\r\n| 401 | UNAUTHORIZED (401) | UNAUTHORIZED | Unauthorized |\r\n| 403 | FORBIDDEN (403) | FORBIDDEN | Forbidden |\r\n| 404 | NOT_FOUND (404) | API_NOT_FOUND | API를 찾을수 없습니다. |\r\n| 405 | METHOD_NOT_ALLOWED (405) | METHOD_NOT_ALLOWED | Method Not Allowed |\r\n| 409 | CONFLICT (409) | CONFLICT | Conflict |\r\n| 500 | INTERNAL_SERVER_ERROR (500) | INTERNAL_SERVER_ERROR | 내부 서버 오류 |\r\n| 501 | BAD_REQUEST (400) | BAD_REQUEST | Request body is invalid |\r\n| 502 | BAD_REQUEST (400) | BAD_PARAMETER_REQUEST | Request Parameter is invalid |\r\n| 503 | BAD_REQUEST (400) | BAD_JSON_REQUEST | Request Json is invalid |\r\n| 504 | BAD_REQUEST (400) | BAD_MEDIATYPE_REQUEST | Request MediaType is invalid |\r\n| 505 | BAD_REQUEST (400) | BAD_PATHVARIABLE_REQUEST | Request PathVariable is invalid |\r\n| 510 | CONFLICT (409) | EXISTS_NAME | 이미 존재하는 이름입니다. |\r\n| 511 | INTERNAL_SERVER_ERROR (500) | UNDEFINED_ERROR | 정의되지 않은 내부 서버 오류 |\r\n| 512 | NOT_FOUND (404) | NO_FOLDER | 폴더가 존재하지 않습니다. |\r\n| 513 | BAD_REQUEST (400) | NO_DATA_INVALID | 요청한 데이터를 다시 확인 바랍니다. |\r\n| 514 | BAD_REQUEST (400) | NO_UID_INVALID | 요청한 고유키를 다시 확인 바랍니다. |\r\n| 515 | CONFLICT (409) | NO_EXCEL_DOWN | 엑셀 다운로드 실패 하였습니다. |\r\n| 516 | BAD_REQUEST (400) | BAD_REQUEST_EXTENSION | 잘못된 확장자 입니다. |\r\n| 517 | CONFLICT (409) | NO_EXCEL_UPLOAD | 올바른 엑셀을 등록해 주세요. |\r\n| 518 | BAD_REQUEST (400) | CHECK_QUERY_PARAM | CHECK_QUERY_PARAM. |\r\n| 519 | NOT_FOUND (404) | NOT_FOUND_PRODUCT | 제품 정보를 불러오는데 실패했습니다. |\r\n| 520 | PAYMENT_REQUIRED (402) | INSUFFICIENT_DEDUCTION_AMOUNT | 잔여 포인트&건수가 부족합니다. 충전 후 사용 바랍니다. |\r\n| 521 | CONFLICT (409) | FAIL_DEDUCTION | 포인트를 차감하는데 실패했습니다. |\r\n| 522 | CONFLICT (409) | FAIL_DEDUCTION_POINT | 차감하는데 실패했습니다. |\r\n| 523 | CONFLICT (409) | FAIL_DEDUCTION_COUNT | 건 수를 차감하는데 실패했습니다. |\r\n| 524 | PAYMENT_REQUIRED (402) | NOT_PREMIUM_RATEPLAN | PREMIUM 요금제만 사용이 가능합니다. 요금제를 확인 바랍니다. |\r\n| 525 | BAD_REQUEST (400) | DATA_DUPLICATE | 요청한 중복 데이터를 다시 확인 바랍니다. |\r\n| 524 | PAYMENT_REQUIRED (402) | NOT_API_RATEPLAN | API 요금제만 사용이 가능합니다. 요금제를 확인 바랍니다. |\r\n| 525 | CONFLICT (409) | NOT_CONNECT_BACKOFFICE | 제품 정보를 연결하는데 실패했습니다. |\r\n| 526 | CONFLICT (409) | UNUSABLE_PDF | 사용할 수 없는 PDF 입니다. |\r\n---\r\n## 회사 에러\r\n| 코드 | HTTP 상태 | 에러 코드 | 메시지 |\r\n|------|-----------------|------------------------------------|----------------------------------------------------------------|\r\n| 1000 | NOT_FOUND (404) | COMPANY_NOT_FOUND | 회사 정보를 찾을 수 없습니다. |\r\n| 1001 | NOT_FOUND (404) | TEAM_NOT_FOUND | 팀 정보를 찾을 수 없습니다. |\r\n| 1002 | NOT_FOUND (404) | COMPANY_CUSTOM_EMAIL_NOT_FOUND | 이메일 맞춤설정을 찾을 수 없습니다. |\r\n| 1003 | CONFLICT (409) | COMPANY_CUSTOM_EMAIL_NOT_FOUND | 이메일 맞춤설정 로고 업로드가 불가능 합니다. |\r\n| 1004 | CONFLICT (409) | CUSTOM_EMAIL_LOGO_UPLOAD_SIZE_FAIL | 이메일 맞춤설정 로고 파일은 최대 가로 210px, 세로 70px 까지만 업로드 가능합니다. |\r\n| 1005 | CONFLICT (409) | CUSTOM_EMAIL_LINK_FAIL | 이메일 맞춤설정 로고 링크는 'https://' 혹은 'http://' 를 제외한 올바른 형식으로 입력해주세요. |\r\n| 1006 | CONFLICT (409) | CUSTOM_EMAIL_HEX_CODE_FAIL | 이메일 맞춤설정 hex 코드는 '#000000' 형태로 입력해주세요. |\r\n---\r\n\r\n## 사용자 에러\r\n\r\n| 코드 | HTTP 상태 | 에러 코드 | 메시지 |\r\n|------|--------------------|-------------------|---------------------|\r\n| 1100 | NOT_FOUND (404) | USER_NOT_FOUND | 사용자 정보를 찾을 수 없습니다. |\r\n| 1101 | CONFLICT (409) | NO_DELETE_MASTER | 최초 가입자는 삭제할 수 없습니다. |\r\n| 1102 | NOT_FOUND (404) | COMPANY_NOT_FOUND | 그룹 정보를 찾을 수 없습니다. |\r\n| 1103 | NOT_FOUND (404) | ADDRESS_NOT_FOUND | 주소록 정보를 찾을 수 없습니다. |\r\n| 1104 | UNAUTHORIZED (401) | INVALID_ID_KEY | 잘못된 ID, KEY 입니다. |\r\n---\r\n## 계약 에러\r\n\r\n| 코드 | HTTP 상태 | 에러 코드 | 메시지 |\r\n|------|-------------------|-----------------------------------|----------------------------|\r\n| 1200 | NOT_FOUND (404) | CONTRACT_NOT_FOUND | 문서가 존재하지 않습니다. |\r\n| 1201 | CONFLICT (409) | CONTRACT_NOT_CANCEL | 계약을 취소할 수 없습니다. |\r\n| 1202 | CONFLICT (409) | CONTRACT_NOT_PROCESSING | 계약 진행 상태가 아닙니다. |\r\n| 1203 | CONFLICT (409) | APPROVAL_NO_WAITE | 결제 대기자가 없습니다. |\r\n| 1204 | BAD_REQUEST (400) | BAD_EXTERNAL_UPLOAD_REQUEST | 개별 업로드시 파일과 문서정보는 1:1. |\r\n| 1205 | BAD_REQUEST (400) | BAD_EXTERNAL_UPLOAD_MERGE_REQUEST | 병합시 파일과 문서정보는 N:1. |\r\n| 1206 | CONFLICT (409) | CONTRACT_ATTACH_UPLOAD_FAIL | 첨부파일 업로드가 불가능 합니다. |\r\n| 1207 | BAD_REQUEST (400) | NECESSARY_SIGNER | 서명자는 필수 입니다. |\r\n| 1208 | CONFLICT (409) | NO_SIGN_LIMIT | 서명 유효기간을 설정할 수 없습니다. |\r\n| 1209 | NOT_FOUND (404) | CONTRACT_CONTRACTOR_NOT_FOUND | 계약에 포함된 해당 수신자를 찾을 수 없습니다. |\r\n| 1210 | CONFLICT (409) | FAIL_REQUEST_SIGN | 계약 서명 요청에 실패하였습니다. |\r\n| 1211 | NOT_FOUND (404) | USER_AND_FOLDER_NOT_FOUND | 사용자 또는 내 폴더함이 없습니다. |\r\n| 1212 | CONFLICT (409) | CONTRACT_PROCESSING | 계약 진행 상태 입니다. |\r\n| 1213 | BAD_REQUEST (400) | SEND_CONTRACT_ALLOW_CONFIRM | 문서확인 상태의 문서만 전송 할수 있습니다 |\r\n---\r\n## 템플릿 에러\r\n\r\n| 코드 | HTTP 상태 | 에러 코드 | 메시지 |\r\n|------|-----------------|-------------------------------|---------------------------------|\r\n| 1300 | NOT_FOUND (404) | TEMPLATE_NOT_FOUND | 템플릿이 존재하지 않습니다. |\r\n| 1301 | NOT_FOUND (404) | TEMPLATE_CONTRACTOR_NOT_FOUND | 템플릿에 포함된 해당 수신자를 찾을 수 없습니다. |\r\n| 1302 | NOT_FOUND (404) | TEMPLATE_ATTACH_NOT_FOUND | 템플릿에 포함된 해당 첨부파일을 찾을 수 없습니다. |\r\n| 1303 | NOT_FOUND (404) | TEMPLATE_FILE_REQ_NOT_FOUND | 템플릿에 포함된 해당 첨부파일 요청을 찾을 수 없습니다. |\r\n| 1310 | CONFLICT (409) | TEMPLATE_ATTACH_UPLOAD_FAIL | 첨부파일 업로드가 불가능 합니다. |\r\n---\r\n\r\n## 대량전송 에러\r\n\r\n| 코드 | HTTP 상태 | 에러 코드 | 메시지 |\r\n|------|-----------------|----------------------------|-------------------------------|\r\n| 1400 | NOT_FOUND (404) | BULK_CONTRACT_NOT_FOUND | 대량전송 문서가 존재하지 않습니다. |\r\n| 1401 | CONFLICT (409) | BULK_NOT_TRANSFER_STATE | 대량 전송이 완료되었거나 시작할 수 없는 상태입니다. |\r\n| 1402 | CONFLICT (409) | FAIL_REQUEST_BULK_SIGN | 대량계약 서명 요청에 실패하였습니다. |\r\n| 1403 | CONFLICT (409) | BULK_CONTRACTS_NOT_DELETED | 진행중인 계약건이 있어 삭제가 불가능합니다. |\r\n| 1404 | CONFLICT (409) | BULK_EXCEL_NOT_UPLOAD | 준비중, 전송 대기 상태만 업로드 가능합니다. |\r\n---\r\n\r\n## SSL / TLS 검증 에러\r\n\r\n| 코드 | HTTP 상태 | 에러 코드 | 메시지 |\r\n|------|----------------|---------------------|---------------------------|\r\n| 1700 | CONFLICT (409) | INVALID_CERTIFICATE | 유효하지 않은 인증서 입니다. |\r\n| 1701 | CONFLICT (409) | NOT_YET_CERTIFICATE | 인증서의 유효기간이 아직 시작되지 않았습니다. |\r\n| 1702 | CONFLICT (409) | EXPIRED_CERTIFICATE | 만료된 인증서 입니다. |\r\n| 1703 | CONFLICT (409) | INVALID_URL | 잘못된 프로토콜 또는 잘못된 URL 입니다. |\r\n---\r\n# 웹훅 기능 설명\r\n\r\n웹훅은 특정 이벤트 발생 시 실시간으로 외부 시스템에 HTTP `POST` 요청을 보내는 자동화된 알림 기능입니다. \r\n사용자는 웹훅 URL(엔드포인트)을 사전에 등록해두고, 지정된 이벤트 발생 시 해당 URL로 이벤트 관련 데이터를 전달받을 수 있습니다.\r\n\r\n---\r\n\r\n### 여러 하위 회사를 관리하는 본사 계정 구조에서 웹훅 이벤트 동작 방식\r\n1. 하위 회사의 API 토큰을 기준으로 이벤트를 조회합니다.\r\n2. 해당 토큰으로 조회된 이벤트가 없을 경우, 상위(부모) 회사로 이벤트를 재조회합니다.\r\n---\r\n\r\n## 요청 커스텀 헤더\r\n\r\n웹훅 전송 시, 클라이언트 시스템에서 요구하는 인증 또는 식별 정보를 포함할 수 있도록, \r\n커스텀 HTTP 헤더를 설정할 수 있습니다. \r\n설정된 헤더는 웹훅 요청 시 함께 전송되며, \r\n클라이언트 시스템에서 이를 기반으로 요청의 유효성을 검증할 수 있습니다.\r\n\r\n### 웹훅 등록 예시\r\n\r\n\r\n{\r\n \"uri\": \"https://client.example.com/webhook\", \r\n \"headers\": [ \r\n {\r\n \"key\" : \"Authorization\", \r\n \"value\" : \"Bearer ******\"\r\n }, \r\n {\r\n \"key\" : \"X-API-Key\", \r\n \"value\" : \"client-key-xyz\"\r\n }, \r\n {\r\n \"key\" : \"X-Custom-Header\", \r\n \"value\" : \"custom-value\"\r\n } \r\n ],\r\n \"eventType\" : \"SIGNED_CONTRACT\",\r\n \"name\" : \"{NAME}\",\r\n \"activationStatus\" : \"ACTIVE\"\r\n}\r\n
\r\n\r\n## 웹훅 이벤트 목록\r\n\r\n| 이벤트 타입 | 설명 |\r\n|----------------------------|------------------------------|\r\n| `BEFORE_SENDING_CONTRACT` | 계약 전송 이전 |\r\n| `AFTER_SENDING_CONTRACT` | 계약 전송 이후 |\r\n| `SIGNED_CONTRACT` | 서명자 서명 완료 이후 |\r\n| `SIGNED_ALL_CONTRACT` | 모든 서명 완료 이후 |\r\n| `REJECTED_SIGN` | 서명 거절 이후 |\r\n| `CANCELED_CONTRACT` | 계약 취소 이후 |\r\n| `APPROVE_CONTRACT` | 결재자 승인 완료 이후 |\r\n| `APPROVE_ALL_CONTRACT` | 모든 결재자 승인 완료 이후 |\r\n| `COMPANION_CONTRACT` | 결재 반려 이후 |\r\n| `BEFORE_SENDING_BULK` | 대량 전송 이전 |\r\n| `AFTER_SENDING_BULK` | 대량 전송 이후 |\r\n\r\n---\r\n## 공통 요청 정보\r\n\r\n- `eventType` → 웹훅 이벤트\r\n- `master` → 최초 가입자 정보\r\n- `documentId` → 문서 ID (UUID)\r\n- `triggerBy` → 이벤트를 발동시킨 사용자 정보\r\n\r\n### 📤 요청 예시\r\n\r\n\r\n{\r\n \"eventType\": \"SIGNED_ALL_CONTRACT\",\r\n \"master\": {\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n \"id\": \"{ID}\"\r\n },\r\n \"documentId\": \"3c3e3b1d-e5d9-48b8-923b-d9514f7608f1\",\r\n \"triggerBy\": {\r\n \"name\": \"{NAME}\",\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n }\r\n}\r\n
\r\n\r\n---\r\n\r\n## BEFORE_SENDING_CONTRACT (계약 전송 이전)\r\n\r\n**설명** \r\n계약 전송 직전에 호출되는 이벤트로, 계약 건수 차감 전에 실행됩니다. \r\n웹훅 수신 서버의 응답에 따라 계약 전송 여부가 결정됩니다.\r\n\r\n이벤트는 얼마싸인 화면에서만 작동하며 \r\n전자계약 전송하는 API(`템플릿으로 계약 생성`, `검토 확인 계약서 전송`)를 사용할 경우 동작하지 않습니다.\r\n\r\n**동작 방식**\r\n- `isValid: true` → 계약 전송 허용 (건수 차감 O)\r\n- `isValid: false` → 계약 전송 차단 (건수 차감 X)\r\n- `message`: `isValid: false`일 경우 사용자에게 표시할 메시지\r\n\r\n### 📤 요청 예시\r\n\r\n\r\n{\r\n \"eventType\": \"BEFORE_SENDING_CONTRACT\",\r\n \"master\": {\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n \"id\": \"{ID}\"\r\n },\r\n \"documentId\": \"3c3e3b1d-e5d9-48b8-923b-d9514f7608f1\",\r\n \"triggerBy\": {\r\n \"name\": \"{NAME}\",\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n }\r\n}\r\n
\r\n\r\n### 📥 응답 예시\r\n\r\n\r\n{\r\n \"isValid\": true,\r\n \"message\": \"\"\r\n}\r\n
\r\n\r\n\r\n{\r\n \"isValid\": false,\r\n \"message\": \"포인트가 부족하여 계약을 전송할 수 없습니다.\"\r\n}\r\n
\r\n\r\n---\r\n\r\n## BEFORE_SENDING_BULK (대량 전송 이전)\r\n\r\n**설명** \r\n대량 계약 전송 전에 호출되며, 전체 문서 건수 정보가 함께 전달됩니다.\r\n\r\n**동작 방식**\r\n- `isValid`: 전송 가능 여부\r\n- `message`: 실패 시 사용자 안내 메시지\r\n- `documentCount`: 전송될 문서 수\r\n- `documentIds`: 전송 대상 문서 ID 리스트\r\n\r\n### 📤 요청 예시\r\n\r\n\r\n{\r\n \"eventType\": \"BEFORE_SENDING_BULK\",\r\n \"master\": {\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n \"id\": \"{ID}\"\r\n },\r\n \"documentCount\": {DOCUMENT_COUNT},\r\n \"documentIds\": [\r\n \"3c3e3b1d-e5d9-48b8-923b-d9514f7608f1\", \r\n \"3c3e3b1d-e5d9-48b8-923b-d9514f7608f2\"],\r\n \"triggerBy\": {\r\n \"name\": \"{NAME}\",\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n }\r\n}\r\n
\r\n\r\n### 📥 응답 예시\r\n\r\n\r\n{\r\n \"isValid\": true,\r\n \"message\": \"\"\r\n}\r\n
\r\n\r\n---\r\n\r\n## AFTER_SENDING_BULK (대량 전송 이후)\r\n**설명** \r\n대량 계약 전송 이후에 호출되며, 전체 문서 건수, 전송 성공 건수, 전송 실패 건수가 함께 전달됩니다.\r\n\r\n**동작 방식**\r\n- `documentCount`: 전송될 문서 건수\r\n- `documentIds`: 전송 대상 문서 ID 리스트\r\n- `successCount` : 전송 성공 문서 건수\r\n- `failCount` : 전송 실패 문서 건수\r\n### 📤 요청 예시\r\n\r\n\r\n{\r\n \"eventType\": \"AFTER_SENDING_BULK\",\r\n \"master\": {\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n \"id\": \"{ID}\"\r\n },\r\n \"documentCount\": {DOCUMENT_COUNT},\r\n \"successCount\": {SUCCESS_COUNT},\r\n \"failCount\": {FAIL_COUNT},\r\n \"documentIds\": [\"3c3e3b1d-e5d9-48b8-923b-d9514f7608f1\", \"3c3e3b1d-e5d9-48b8-923b-d9514f7608f2\"],\r\n \"triggerBy\": {\r\n \"name\": \"{NAME}\",\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n }\r\n}\r\n
\r\n\r\n---\r\n\r\n## 기타 이벤트 요청 예시\r\n\r\n- `AFTER_SENDING_CONTRACT`\r\n- `SIGNED_CONTRACT`\r\n- `SIGNED_ALL_CONTRACT`\r\n- `REJECTED_SIGN`\r\n- `CANCELED_CONTRACT`\r\n- `APPROVE_CONTRACT`\r\n- `APPROVE_ALL_CONTRACT`\r\n- `COMPANION_CONTRACT`\r\n\r\n### 📤 요청 예시\r\n\r\n\r\n{\r\n \"eventType\": \"SIGNED_ALL_CONTRACT\",\r\n \"master\": {\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n \"id\": \"{ID}\"\r\n },\r\n \"documentId\": \"3c3e3b1d-e5d9-48b8-923b-d9514f7608f1\",\r\n \"triggerBy\": {\r\n \"name\": \"{NAME}\",\r\n \"email\": \"{EMAIL}\",\r\n \"cell\": \"{CELL}\",\r\n }\r\n}\r\n
\r\n\r\n## 웹훅 성공, 실패, 재시도 정책\r\n\r\n웹훅 이벤트가 외부 시스템으로 전송될 때, 수신 서버의 응답 상태에 따라 성공 여부가 판단됩니다.\r\n\r\n---\r\n\r\n### 📦 성공 응답\r\n\r\n- **2xx** 응답 코드일 경우: \r\n → 웹훅 전송이 **정상적으로 완료**된 것으로 간주됩니다.\r\n\r\n---\r\n\r\n### ❌ 실패 응답\r\n\r\n- **2xx가 아닌 모든 응답 코드** \r\n → 실패로 간주되며, 재시도 조건에 해당하지 않으면 재요청되지 않습니다.\r\n\r\n---\r\n\r\n### 🔁 재시도 정책\r\n\r\n웹훅 요청이 실패했을 때, 아래 조건에 따라 자동 재시도가 이루어집니다.\r\n\r\n| 항목 | 설정 값 |\r\n|----------------|---------------------------|\r\n| **재시도 조건** | `Connection timeout` 발생 시에만 |\r\n| **재시도 횟수** | 최대 5회 |\r\n| **재시도 간격** | 3초 간격 |\r\n| **연결 타임아웃** | 3초 |\r\n| **응답 타임아웃** | 7초 |\r\n\r\n> ⚠️ 4xx, 5xx 응답과 같이 서버가 응답을 반환한 경우에는 **재시도되지 않습니다.** \r\n> 재시도는 오직 **연결이 불가능한 경우(Connection timeout)** 에만 수행됩니다.\r\n\r\n---\r\n# 임베디드 기능 설명\r\n임베디드(Embedded) 기능은 쉽게 말하면 얼마싸인 기능을 다른 웹사이트나 프로그램 안에 직접 넣을 수 있게 해주는 것입니다.\r\n\r\n즉, 사용자가 얼마싸인 홈페이지에 별도로 방문하지 않고, 당신의 서비스 안에서 바로 계약을 진행하거나 문서에 서명할 수 있게 해줍니다.\r\n\r\n---\r\n\r\n\r\n## Redirect URL 기능\r\n\r\n`redirectUrl`은 **임베디드 작업 완료 후 사용자를 지정된 웹 페이지로 자동 이동(리다이렉트)** 시키는 기능입니다. \r\n예를 들어, 계약서 작성이 완료되었거나 템플릿 생성이 끝났을 때, 사전에 등록한 URL로 사용자를 이동시킬 수 있습니다.\r\n\r\n### ✅ 주요 특징\r\n\r\n- 특정 이벤트 발생 시 자동으로 지정 URL로 이동\r\n- URL 쿼리 파라미터로 이벤트 정보와 문서 ID 제공\r\n- 필요 시 사용자 정의 데이터도 함께 전달 가능\r\n\r\n---\r\n\r\n## redirect 이벤트 예시\r\n\r\n아래는 다양한 임베디드 상황에서 발생할 수 있는 리디렉션 이벤트들과 그 URL 예시입니다:\r\n\r\n| 이벤트 설명 | Redirect URL 예시 |\r\n|---------------------------------------|-------------------|\r\n| 계약서 문서 확인 완료 | `https://your-domain.com/redirect?documentId=UUID&eventType=contract_preview` |\r\n| 계약서 문서 수정 완료 | `https://your-domain.com/redirect?documentId=UUID&eventType=contract_edit` |\r\n| 템플릿 문서 수정 완료 | `https://your-domain.com/redirect?documentId=UUID&eventType=template_edit` |\r\n| 계약서 서명 요청 시작 | `https://your-domain.com/redirect?documentId=UUID&eventType=contract_start` |\r\n| 대량전송 템플릿 문서 확인 완료 | `https://your-domain.com/redirect?documentId=UUID&eventType=bulk_template_confrim` |\r\n\r\n> ℹ`documentId`와 `eventType`은 쿼리 파라미터로 자동 포함되어 전달되며, 이를 통해 문서 후처리나 사용자 안내가 가능합니다.\r\n\r\n---\r\n\r\n## 활용 팁\r\n\r\n- `redirectUrl`에 커스텀 파라미터(예: 사용자 ID, 세션 정보 등)를 추가하면 후처리에 유용합니다.\r\n- 프론트엔드에서 이벤트 발생 후 URL 분석을 통해 로직 분기 처리가 가능합니다.\r\n- 모바일 환경에서도 동일한 방식으로 작동하므로 모바일 최적화된 리디렉트 페이지를 준비해두면 좋습니다.\r\n\r\n---\r\n"},{"name":"인증","description":"인증 토큰 API"},{"name":"사용자","description":"사용자 API"},{"name":"회사","description":"회사 API"},{"name":"템플릿","description":"템플릿 API"},{"name":"계약","description":"계약 API"},{"name":"대량전송","description":"대량전송 API"},{"name":"임베디드","description":"응답 linkUrl은 접속 가능한 URL이 전달됩니다.해당 URL은 2시간동안 접속 가능합니다."},{"name":"웹훅","description":"웹훅 API"}],"paths":{"/openapi/v1/token":{"get":{"tags":["인증"],"summary":"액세스 토큰 요청","description":"액세스 토큰을 요청합니다.","operationId":"createOpenAPIToken","parameters":[{"name":"x-api-id","in":"header","required":true,"schema":{"type":"string"}},{"name":"x-api-key","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"401":{"description":"Unauthorized"},"404":{"description":"Not Found"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/token"}}}},"400":{"description":"Bad Request"}},"security":[]}},"/openapi/v1/bulk/templates":{"get":{"tags":["대량전송"],"summary":"대량전송 템플릿 조회","description":"대량전송 가능한 수신자1인 템플릿을 조회합니다","operationId":"getTemplates","parameters":[{"name":"memberId","in":"query","description":"사용자 ID","required":false,"schema":{"type":"string","description":"사용자 ID","nullable":true}},{"name":"title","in":"query","description":"템플릿 제목","required":false,"schema":{"type":"string","description":"템플릿 제목","nullable":true}},{"name":"folderId","in":"query","description":"폴더 ID (My 템플릿 : 1)","required":false,"schema":{"title":"Use With memberId","type":"string","description":"폴더 ID (My 템플릿 : 1)","nullable":true}},{"name":"signerCount","in":"query","description":"서명자 수","required":false,"schema":{"type":"integer","description":"서명자 수","nullable":true}},{"name":"startDate","in":"query","description":"시작 일자 (yyyy-MM-dd)","required":false,"schema":{"type":"string","description":"시작 일자 (yyyy-MM-dd)","format":"date","nullable":true,"example":"2020-01-01"},"example":"2020-01-01"},{"name":"endDate","in":"query","description":"종료 일자 (yyyy-MM-dd)","required":false,"schema":{"type":"string","description":"종료 일자 (yyyy-MM-dd)","format":"date","nullable":true}},{"name":"page","in":"query","description":"조회 할 페이지 번호","required":false,"schema":{"minimum":1,"type":"integer","description":"조회 할 페이지 번호","format":"int32","default":1}},{"name":"rows","in":"query","description":"페이지에서 가져올 문서 개수","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer","description":"페이지에서 가져올 문서 개수","default":10}}],"responses":{"404":{"description":"Not Found"},"400":{"description":"Bad Request"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResTemplatePageDTO_Default"}}}}}}},"/openapi/v1/bulk/contracts/{bulkContractId}":{"get":{"tags":["대량전송"],"summary":"대량전송 상세 조회","description":"대량전송 계약서를 상세 조회 합니다.","operationId":"getBulkContractDetail","parameters":[{"name":"bulkContractId","in":"path","description":"대량전송 ID","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","description":"대량 전송 서명자 페이지 번호","required":false,"schema":{"maximum":2147483647,"minimum":1,"type":"integer","description":"대량 전송 서명자 페이지 번호","format":"int32","default":1}},{"name":"rows","in":"query","description":"대량 전송 서명자 개수","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer","description":"대량 전송 서명자 개수","default":10}}],"responses":{"404":{"description":"Not Found"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResBulkContractDetailDTO"}}}},"400":{"description":"Bad Request"}}},"post":{"tags":["대량전송"],"summary":"검토 완료 대량전송 전송시작","description":"검토 완료된 대량전송을 시작합니다.","operationId":"sendBulkContract","parameters":[{"name":"bulkContractId","in":"path","description":"대량전송 ID","required":true,"schema":{"type":"string","description":"대량전송 ID","format":"uuid"}}],"responses":{"404":{"description":"Not Found"},"400":{"description":"Bad Request"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResBulkContractTransferDTO"}}}}}}},"/openapi/v1/bulk/contracts":{"get":{"tags":["대량전송"],"summary":"대량전송 조회","description":"대량전송 리스트를 조회합니다.","operationId":"getBulkContracts","parameters":[{"name":"title","in":"query","description":"대량전송 제목","required":false,"schema":{"type":"string","description":"대량전송 제목","nullable":true}},{"name":"memberId","in":"query","description":"사용자 ID","required":false,"schema":{"type":"string","description":"사용자 ID","nullable":true}},{"name":"startDate","in":"query","description":"시작 일자 (yyyy-MM-dd)","required":false,"schema":{"type":"string","description":"시작 일자 (yyyy-MM-dd)","format":"date","nullable":true,"example":"2020-01-01"},"example":"2020-01-01"},{"name":"endDate","in":"query","description":"종료 일자 (yyyy-MM-dd)","required":false,"schema":{"type":"string","description":"종료 일자 (yyyy-MM-dd)","format":"date","nullable":true}},{"name":"page","in":"query","description":"조회 할 페이지 번호","required":false,"schema":{"minimum":1,"type":"integer","description":"조회 할 페이지 번호","format":"int32","default":1}},{"name":"rows","in":"query","description":"페이지에서 가져올 문서 개수","required":false,"schema":{"maximum":100,"minimum":1,"type":"integer","description":"페이지에서 가져올 문서 개수","default":10}}],"responses":{"404":{"description":"Not Found"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResBulkContractPageDTO"}}}},"400":{"description":"Bad Request"}}}},"/openapi/v1/bulk/contracts/{bulkContractId}/excel":{"get":{"tags":["대량전송"],"summary":"대량전송 엑셀 다운로드","description":"대량전송 샘플 엑셀 파일을 다운로드 합니다.","operationId":"bulkContractExcelSampleDown","parameters":[{"name":"bulkContractId","in":"path","description":"대량전송 ID","required":true,"schema":{"type":"string","description":"대량전송 ID","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/downloads_Default"}}}},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}},"post":{"tags":["대량전송"],"summary":"대량전송 엑셀 업로드","description":"대량전송 엑셀을 업로드 합니다.","operationId":"bulkContractExcelupload","parameters":[{"name":"bulkContractId","in":"path","description":"대량전송 ID","required":true,"schema":{"type":"string","description":"대량전송 ID","format":"uuid"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"required":["file"],"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}},"required":true},"responses":{"201":{"description":"Created"},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}}},"/openapi/v1/bulk/contracts/{bulkContractId}/limit":{"patch":{"tags":["대량전송"],"summary":"대량전송 서명 유효기간 설정","description":"유효기간을 일괄 적용합니다. (기본 15일, 전송완료 상태 불가)","operationId":"setBulkContractSignLimit","parameters":[{"name":"bulkContractId","in":"path","description":"대량전송 ID","required":true,"schema":{"type":"string","description":"대량전송 ID","format":"uuid"}},{"name":"limit","in":"query","description":"서명 유효기간 (yyyy-MM-dd)","required":true,"schema":{"type":"string","description":"서명 유효기간 (yyyy-MM-dd)","format":"date"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResBulkContractDTO"}}}},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}}},"/openapi/v1/companys/teams":{"get":{"tags":["회사"],"summary":"팀 폴더 조회","description":"회사에 등록된 팀 정보를 조회 합니다.","operationId":"getTeams","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTeamFolder_Detail"}}}},"404":{"description":"팀 정보를 찾을 수 없습니다."}}},"post":{"tags":["회사"],"summary":"팀 폴더 생성","description":"팀 폴더 하위 팀으로 생성됩니다.","operationId":"createTeams","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiReqCreateTeamDTO_Default"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTeamFolder_Default"}}}},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}},"patch":{"tags":["회사"],"summary":"팀 폴더명 변경","description":"팀 폴더 명을 변경합니다.","operationId":"renameTeam","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiReqRenameTeamDTO_Default"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTeamFolder_Default"}}}},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}}},"/openapi/v1/companys/teams/{teamId}/users":{"get":{"tags":["회사"],"summary":"팀 사용자 조회","description":"회사 팀에 등록된 사용자를 조회 합니다.","operationId":"getUsersFromTeam","parameters":[{"name":"teamId","in":"path","description":"팀 ID 입력","required":true,"schema":{"minimum":1,"type":"integer","format":"int32"}}],"responses":{"404":{"description":"Not Found"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResTeamDTO"}}}},"400":{"description":"Bad Request"}}}},"/openapi/v1/companys":{"get":{"tags":["회사"],"summary":"회사 정보 조회","description":"회사 정보를 조회합니다.","operationId":"getCompany","responses":{"404":{"description":"Not Found"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResCompanyDTO"}}}}}}},"/openapi/v1/companys/teams/{teamId}":{"delete":{"tags":["회사"],"summary":"팀 폴더 삭제","description":"팀 폴더를 삭제합니다.","operationId":"deleteTeams","parameters":[{"name":"teamId","in":"path","description":"팀 ID 입력","required":true,"schema":{"minimum":1,"type":"integer","format":"int32"}}],"responses":{"204":{"description":"OK","content":{"application/json":{}}},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}}},"/openapi/v1/companys/teams/members":{"post":{"tags":["회사"],"summary":"팀 사용자 초대","description":"이메일로 팀원을 초대합니다.","operationId":"inviteTeamMember","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiReqTeamMemberDTO"}}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResTeamMemberDTO"}}}},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}},"delete":{"tags":["회사"],"summary":"팀원 삭제","description":"팀원의 고유키로 삭제합니다.","operationId":"deleteTeamMembers","parameters":[{"name":"uid","in":"query","description":"고유 식별자","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"OK"},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}}},"/openapi/v1/companys/point":{"get":{"tags":["회사"],"summary":"잔여 포인트(건수) 조회","description":"잔여 포인트(건수)를 조회합니다.","operationId":"getPoint","responses":{"404":{"description":"Not Found"},"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResPointDTO"}}}}}}},"/openapi/v1/companys/teams/{teamId}/{memberId}":{"patch":{"tags":["회사"],"summary":"팀원 이동","description":"팀원을 다른 팀으로 이동합니다.","operationId":"moveMemberTeam","parameters":[{"name":"teamId","in":"path","description":"폴더 아이디","required":true,"schema":{"minimum":1,"type":"integer","format":"int32"}},{"name":"memberId","in":"path","description":"사용자 ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResTeamMemberDTO"}}}},"404":{"description":"Not Found"},"400":{"description":"Bad Request"}}}},"/openapi/v1/companys/custom/email":{"get":{"tags":["회사"],"summary":"이메일 맞춤설정 조회","description":"이메일 맞춤설정을 조회합니다.","operationId":"getCustomEmail","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResCustomEmailDTO"}}}},"404":{"description":"Not Found"}}},"put":{"tags":["회사"],"summary":"이메일 맞춤설정 변경","description":"이메일 맞춤설정을 변경합니다.","operationId":"updateCustomEmail","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiReqCustomEmailDTO"}}},"required":true},"responses":{"204":{"description":"OK","content":{"application/json":{}}},"404":{"description":"Not Found"}}}},"/openapi/v1/companys/custom/email/logo":{"put":{"tags":["회사"],"summary":"이메일 맞춤설정 로고 변경","description":"이메일 맞춤설정 로고를 변경합니다.","operationId":"updateCustomEmailLogo","requestBody":{"content":{"multipart/form-data":{"schema":{"required":["logo"],"type":"object","properties":{"logo":{"type":"string","description":"Contents-Type: 'multipart/form-data' 형태로 요청해주세요.