{"openapi":"3.1.0","info":{"title":"Melay Internal SaaS Mail Gateway","version":"0.6.0","description":"내부 SaaS용 템플릿 메일 전송과 인증된 Gmail 수신 전달. 일반 사용자는 Melay Google 가입과 관리자 승인 후 AI 접근 토큰 하나로 /account/v1/onboarding을 호출해 프로젝트·도메인·최초 발송 키를 준비하고, DNS는 사용자가 등록합니다. 운영자의 공용 Cloudflare 연결을 사용하며 사용자 공급자 키를 받지 않습니다. 지원 도메인은 운영 계정의 zone이어야 하고, 공급자 공유와 사용자 소유권은 별개입니다. queued는 접수이며 전달 성공과 구분합니다. 호출 프로젝트의 인증코드·동의 관리는 범위 밖입니다. Melay 운영 설정은 사용자 프로젝트와 분리되며 가입자·프로젝트 0개로 시작할 수 있습니다. 가입·승인은 프로젝트를 자동 생성하지 않습니다."},"servers":[{"url":"https://melay.go100m.com","description":"Melay 서비스"},{"url":"http://127.0.0.1:8787","description":"기본 로컬 개발 서버"}],"security":[{"ProjectKey":[]}],"paths":{"/v1/emails":{"post":{"operationId":"sendEmail","summary":"프로젝트 정책에 따라 템플릿 메일 발송","description":"동일 키와 동일 요청은 기존 기록을 반환합니다. 멱등성 기록은 계속 보관합니다. 공급자 호출은 자동 재시도하지 않습니다. unknown에서 새 키를 사용하면 중복 발송될 수 있습니다. 새 전송은 사용자의 정확한 발신 도메인 DNS 증명·연결된 공급자 준비와 5분 이내 재확인을 통과해야 합니다. 같은 사용자의 프로젝트는 도메인을 공유하되 발신 주소 정책은 각각 적용합니다. 기존 멱등 기록은 현재 도메인 상태와 무관하게 재조회합니다.","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9._:-]+$"},"description":"개인정보를 포함하지 않는 논리적 발송 요청 ID. 네트워크 재시도에서도 유지합니다."},{"name":"X-Mail-Mode","in":"header","required":false,"schema":{"type":"string","enum":["mock","live"]},"description":"호출자가 기대하는 실행 모드. 서버 모드와 다르면 기록 생성·공급자 호출 전에 409 mail_mode_mismatch로 거절합니다."},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"required":["to","template","variables"],"properties":{"to":{"type":"string","format":"email","maxLength":254},"from":{"type":"string","format":"email","maxLength":254,"description":"생략하면 프로젝트의 첫 허용 발신 주소. 지정 시 허용 목록에 포함되어야 합니다."},"template":{"type":"string","const":"auth-code"},"variables":{"type":"object","additionalProperties":false,"required":["code","expiresInMinutes"],"properties":{"code":{"type":"string","pattern":"^[A-Za-z0-9]{4,10}$"},"expiresInMinutes":{"type":"integer","minimum":1,"maximum":60}}}}},{"type":"object","additionalProperties":false,"required":["to","template","variables"],"properties":{"to":{"type":"string","format":"email","maxLength":254},"from":{"type":"string","format":"email","maxLength":254,"description":"생략하면 프로젝트의 첫 허용 발신 주소. 지정 시 허용 목록에 포함되어야 합니다."},"template":{"type":"string","const":"invitation"},"variables":{"type":"object","additionalProperties":false,"required":["inviterName","inviteUrl"],"properties":{"inviterName":{"type":"string","minLength":1,"maxLength":100},"inviteUrl":{"type":"string","format":"uri","pattern":"^https://","maxLength":2048}}}}},{"type":"object","additionalProperties":false,"required":["to","template","variables"],"properties":{"to":{"type":"string","format":"email","maxLength":254},"from":{"type":"string","format":"email","maxLength":254,"description":"생략하면 프로젝트의 첫 허용 발신 주소. 지정 시 허용 목록에 포함되어야 합니다."},"template":{"type":"string","const":"notification"},"variables":{"type":"object","additionalProperties":false,"required":["title","message"],"properties":{"title":{"type":"string","minLength":1,"maxLength":160},"message":{"type":"string","minLength":1,"maxLength":4000},"actionUrl":{"type":"string","format":"uri","pattern":"^https://","maxLength":2048}}}}}]},"example":{"to":"user@example.com","template":"auth-code","variables":{"code":"123456","expiresInMinutes":10}}}}},"responses":{"200":{"description":"simulated 또는 공급자 보고 delivered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRecord"}}}},"202":{"description":"pending 또는 공급자 접수 queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRecord"}}}},"400":{"description":"잘못된 요청 또는 멱등성 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"잘못되거나 누락된 프로젝트 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"같은 멱등성 키에 다른 요청(idempotency_conflict) 또는 기대 모드와 서버 모드 불일치(mail_mode_mismatch)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"JSON 본문이 16 KiB를 초과함","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"application/json Content-Type 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"프로젝트 발송량 제한 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"내부 처리 오류. 전송 여부를 단정하지 않고 같은 키로 기록을 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"failed 또는 접수 여부가 불확실한 unknown. 기록을 반드시 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRecord"}}}},"503":{"description":"프로젝트 구성이 준비되지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scopes":["emails:send"],"security":[{"ProjectKey":[]},{"UserAccessToken":[]},{"UserSession":[]}]},"get":{"operationId":"listProjectEmails","summary":"자기 프로젝트 기록 목록","security":[{"ProjectKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"이전 nextCursor. 필터를 바꾸면 cursor를 초기화."},{"name":"status","in":"query","schema":{"enum":["pending","simulated","queued","delivered","failed","unknown"]}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPage"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}}}},"/v1/emails/{id}":{"get":{"operationId":"getEmail","summary":"자기 프로젝트의 발송 기록 조회","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^em_[a-f0-9-]{36}$"}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"현재 저장된 발송 기록. 조회 자체는 공급자 실시간 전달 확인이 아닙니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailRecord"}}}},"401":{"description":"잘못되거나 누락된 프로젝트 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"존재하지 않거나 다른 프로젝트의 발송 기록","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"내부 처리 오류. 전송 여부를 단정하지 않고 같은 키로 기록을 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"프로젝트 구성이 준비되지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"현재 저장된 기록을 반환하며 HTTP 200은 전달 성공을 의미하지 않습니다. 30초 이상 pending인 기록은 조회 시 unknown으로 전환될 수 있습니다. 공급자 전달 이벤트 동기화는 초기 범위에 포함하지 않습니다.","x-required-scopes":["emails:read"],"security":[{"ProjectKey":[]},{"UserAccessToken":[]},{"UserSession":[]}]}},"/v1/templates":{"get":{"operationId":"listTemplates","summary":"프로젝트에 허용된 템플릿 메타데이터 조회","responses":{"200":{"description":"프로젝트에 허용된 템플릿과 변수 JSON Schema","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["templates"],"properties":{"templates":{"type":"array","items":{"$ref":"#/components/schemas/TemplateMetadata"}}}}}}},"401":{"description":"잘못되거나 누락된 프로젝트 키","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"내부 처리 오류. 전송 여부를 단정하지 않고 같은 키로 기록을 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"프로젝트 구성이 준비되지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-required-scopes":["emails:read"],"security":[{"ProjectKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}]}},"/health":{"get":{"operationId":"getHealth","summary":"구성과 실행 모드 준비 상태","security":[],"description":"Cloudflare API, 실제 발송, 수신자 받은편지함을 검사하지 않습니다.","responses":{"200":{"description":"준비된 프로젝트 구성과 실행 모드. 외부 공급자 readiness를 확인하지 않습니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["service","ready","mode","domainVerification"],"properties":{"ready":{"type":"boolean","const":true},"mode":{"type":"string","enum":["mock","live"]},"service":{"type":"string","const":"Melay"},"domainVerification":{"type":"string","const":"required"}}}}}},"500":{"description":"내부 처리 오류. 전송 여부를 단정하지 않고 같은 키로 기록을 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"프로젝트 구성이 준비되지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApi","summary":"AI와 호출 프로젝트를 위한 공개 OpenAPI 계약","security":[],"responses":{"200":{"description":"현재 API의 OpenAPI 3.1 문서","content":{"application/json":{"schema":{"type":"object","required":["openapi","info","paths"],"properties":{"openapi":{"type":"string","const":"3.1.0"},"info":{"type":"object"},"paths":{"type":"object"}},"additionalProperties":true}}}}}}},"/llms.txt":{"get":{"operationId":"getAiUsage","summary":"AI를 위한 공개 평문 사용 지침","security":[],"responses":{"200":{"description":"인증, 멱등성, 실행 모드, 상태 해석과 비밀값 처리 지침","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/v1/domains":{"get":{"operationId":"listDomains","summary":"해당 사용자 도메인 목록","x-required-scopes":["domains:read"],"security":[{"ProjectKey":[]},{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"같은 ownerId 사용자에게 속한 도메인만 반환","content":{"application/json":{"schema":{"type":"object","required":["domains"],"additionalProperties":false,"properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}}}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"사용자당 최대 20개 등록 목록 전체를 반환합니다. 페이지 분할 없음.","parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}]},"post":{"operationId":"registerDomain","summary":"도메인 등록과 DNS TXT 증명 발급","x-required-scopes":["domains:write"],"security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"201":{"description":"도메인 등록 결과. 기존 동일 등록도 같은 도메인 ID를 반환합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","maxLength":253,"description":"와일드카드·URL·IP·공개 접미사만 있는 이름 불가. ASCII 소문자/Punycode 정규화"}}}}}},"description":"name만 받으며 ownerId·계정·연결은 인증 설정에서 결정합니다. 등록은 외부 DNS와 공급자 설정을 변경하지 않습니다.","parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}]}},"/v1/domains/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"get":{"operationId":"getDomain","summary":"도메인 소유권·공급자 발송 준비 조회","x-required-scopes":["domains:read"],"security":[{"ProjectKey":[]},{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}]},"delete":{"operationId":"revokeDomain","summary":"게이트웨이 발신 권한 철회","x-required-scopes":["domains:write"],"security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokedDomain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"외부 DNS나 Cloudflare 설정을 삭제하지 않습니다. 새 전송을 차단하며 이미 승인된 전송은 완료될 수 있습니다.","parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}]}},"/v1/domains/{id}/verify":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"post":{"operationId":"verifyDomain","summary":"공개 DNS와 공급자 준비 재확인","x-required-scopes":["domains:write"],"security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"외부 설정을 변경하거나 메일을 보내지 않습니다. 정상 조회 후 전파 대기는 HTTP 200 canSend:false, 조회·권한 장애는 503입니다.","parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}]}},"/v1/domains/{id}/activate":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"post":{"operationId":"activateDomain","summary":"DNS 변경 영향 확인 후 명시적 적용","x-required-scopes":["domains:write"],"security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ActivationPreview"},{"$ref":"#/components/schemas/Domain"}]}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{}},{"type":"object","additionalProperties":false,"required":["apply","confirmationToken"],"properties":{"apply":{"type":"boolean","const":true},"confirmationToken":{"type":"string","minLength":1}}}]}}}},"description":"빈 객체로 plan·confirmationToken·expiresAt를 조회한 뒤 검토한 계획만 apply:true와 확인값으로 별도 적용합니다. Cloudflare 발송 설정을 준비합니다. 신규 공급자 생성은 비어 있는 전용 DNS 위치에만 반송 MX/SPF·DKIM·DMARC를 추가할 수 있으며 기존 루트 MX·SPF·DMARC와 수신 규칙은 덮어쓰지 않습니다. 충돌은 Melay 운영 측 검토로 차단하고 추가 미등록 DNS는 사용자가 등록합니다. 공급자 공유와 도메인 소유권은 별개입니다. 공개 소유권·발송 DNS와 공급자 준비 확인 전에는 canSend를 허용하지 않습니다. 만료·재사용된 확인값은 409입니다.","parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}]}},"/admin/v1/projects":{"get":{"operationId":"listManagedProjects","summary":"전체 프로젝트 정책·키 메타데이터 조회","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedProjects"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"출처 또는 권한 거부"},"409":{"description":"설정 충돌 또는 중복"}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."},"post":{"operationId":"createManagedProject","summary":"프로젝트 생성과 일회성 키 발급","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[],"responses":{"201":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"출처 또는 권한 거부"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"}}}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."}},"/admin/v1/projects/{projectId}":{"get":{"operationId":"getManagedProject","summary":"프로젝트 조회","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"출처 또는 권한 거부"},"409":{"description":"설정 충돌 또는 중복"}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."},"patch":{"operationId":"updateManagedProject","summary":"프로젝트 정책 즉시 변경·사용 중지","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"출처 또는 권한 거부"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProject"}}}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."}},"/admin/v1/projects/{projectId}/keys":{"post":{"operationId":"issueProjectKey","summary":"새 키 원문을 이번 응답에서만 발급","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"responses":{"201":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"출처 또는 권한 거부"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"integer","minimum":1},"kind":{"enum":["send","management"]},"label":{"type":"string","minLength":1,"maxLength":80}},"required":["revision","kind","label"],"additionalProperties":false}}}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."}},"/admin/v1/projects/{projectId}/keys/{keyId}":{"delete":{"operationId":"revokeProjectKey","summary":"키 폐기 (기록 보존, 진행 중 요청 완료 가능)","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}},{"name":"keyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"출처 또는 권한 거부"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"integer","minimum":1}},"required":["revision"],"additionalProperties":false}}}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."}},"/admin/v1/projects/{projectId}/emails":{"get":{"operationId":"listManagedEmails","summary":"프로젝트별 마스킹 메타데이터·UTC 사용량 조회","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"이전 nextCursor. 필터를 바꾸면 cursor를 초기화."},{"name":"status","in":"query","schema":{"enum":["pending","simulated","queued","delivered","failed","unknown"]}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPage"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"출처 또는 권한 거부"},"409":{"description":"설정 충돌 또는 중복"}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."}},"/admin/v1/projects/{projectId}/domains":{"get":{"operationId":"operatorListDomains","summary":"해당 사용자 도메인 목록","x-required-scopes":["domains:read"],"security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"같은 ownerId 사용자에게 속한 도메인만 반환","content":{"application/json":{"schema":{"type":"object","required":["domains"],"additionalProperties":false,"properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}}}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"키 권한 또는 도메인 소유권 미확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"사용자당 최대 20개 등록 목록 전체를 반환합니다. 페이지 분할 없음. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]},"post":{"operationId":"operatorRegisterDomain","summary":"도메인 등록과 DNS TXT 증명 발급","x-required-scopes":["domains:write"],"security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"201":{"description":"도메인 등록 결과. 기존 동일 등록도 같은 도메인 ID를 반환합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"키 권한 또는 도메인 소유권 미확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","maxLength":253,"description":"와일드카드·URL·IP·공개 접미사만 있는 이름 불가. ASCII 소문자/Punycode 정규화"}}}}}},"description":"name만 받으며 ownerId·계정·연결은 인증 설정에서 결정합니다. 등록은 외부 DNS와 공급자 설정을 변경하지 않습니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/admin/v1/projects/{projectId}/domains/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"get":{"operationId":"operatorGetDomain","summary":"도메인 소유권·공급자 발송 준비 조회","x-required-scopes":["domains:read"],"security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"키 권한 또는 도메인 소유권 미확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."},"delete":{"operationId":"operatorRevokeDomain","summary":"게이트웨이 발신 권한 철회","x-required-scopes":["domains:write"],"security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokedDomain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"키 권한 또는 도메인 소유권 미확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"외부 DNS나 Cloudflare 설정을 삭제하지 않습니다. 새 전송을 차단하며 이미 승인된 전송은 완료될 수 있습니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/admin/v1/projects/{projectId}/domains/{id}/verify":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"post":{"operationId":"operatorVerifyDomain","summary":"공개 DNS와 공급자 준비 재확인","x-required-scopes":["domains:write"],"security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"키 권한 또는 도메인 소유권 미확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"외부 설정을 변경하거나 메일을 보내지 않습니다. 정상 조회 후 전파 대기는 HTTP 200 canSend:false, 조회·권한 장애는 503입니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/admin/v1/projects/{projectId}/domains/{id}/activate":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"post":{"operationId":"operatorActivateDomain","summary":"DNS 변경 영향 확인 후 명시적 적용","x-required-scopes":["domains:write"],"security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ActivationPreview"},{"$ref":"#/components/schemas/Domain"}]}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"키 권한 또는 도메인 소유권 미확인","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{}},{"type":"object","additionalProperties":false,"required":["apply","confirmationToken"],"properties":{"apply":{"type":"boolean","const":true},"confirmationToken":{"type":"string","minLength":1}}}]}}}},"description":"빈 객체로 plan·confirmationToken·expiresAt를 조회한 뒤 검토한 계획만 apply:true와 확인값으로 별도 적용합니다. Cloudflare 발송 설정을 준비합니다. 신규 공급자 생성은 비어 있는 전용 DNS 위치에만 반송 MX/SPF·DKIM·DMARC를 추가할 수 있으며 기존 루트 MX·SPF·DMARC와 수신 규칙은 덮어쓰지 않습니다. 충돌은 Melay 운영 측 검토로 차단하고 추가 미등록 DNS는 사용자가 등록합니다. 공급자 공유와 도메인 소유권은 별개입니다. 공개 소유권·발송 DNS와 공급자 준비 확인 전에는 canSend를 허용하지 않습니다. 만료·재사용된 확인값은 409입니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/admin/session":{"get":{"operationId":"getConsoleSession","summary":"운영자 세션 확인","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"인증 완료"},"401":{"description":"로그인 필요"}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."},"post":{"operationId":"loginConsole","summary":"관리자 비밀번호 또는 운영자 키로 HttpOnly 세션 생성","security":[],"parameters":[{"name":"Origin","in":"header","required":true,"schema":{"type":"string"},"description":"요청 URL과 정확히 같은 출처"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"password":{"type":"string","writeOnly":true}},"required":["password"]},{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","writeOnly":true}},"required":["token"]}]}}}},"responses":{"200":{"description":"세션 발급; Set-Cookie. 키/세션 원문은 응답 JSON에 없음"},"401":{"description":"인증 실패"},"403":{"description":"Origin 불일치"},"429":{"description":"IP당 15분 10회 로그인 한도"}},"description":"레거시 운영자 브라우저 세션입니다. GOOGLE_AUTH_ONLY=true 배포에서는 차단합니다. DB 운영자의 Google relay_user 세션을 사용합니다. ra_ Bearer API는 유지합니다.","deprecated":true},"delete":{"operationId":"logoutConsole","summary":"현재 세션 서버 폐기","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"로그아웃"}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."}},"/api":{"get":{"operationId":"getService","summary":"Melay 공개 서비스 안내와 계약 경로","security":[],"responses":{"200":{"description":"서비스명·기본 발신 도메인·문서 경로. 실제 발신 도메인 준비나 전달 성공을 의미하지 않습니다.","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["service","description","defaultSendingDomain","documentation","aiInstructions","health","console"],"properties":{"service":{"type":"string","const":"Melay"},"description":{"type":"string"},"defaultSendingDomain":{"type":"string","const":"go100m.com"},"documentation":{"type":"string","const":"/openapi.json"},"aiInstructions":{"type":"string","const":"/llms.txt"},"health":{"type":"string","const":"/health"},"console":{"type":"string","const":"/"}}}}}}}}},"/":{"get":{"operationId":"getConsolePage","summary":"로그인·운영 콘솔 HTML","security":[],"responses":{"200":{"description":"공개 UI; 데이터 API는 별도 인증","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/auth/start":{"post":{"operationId":"startRelayLogin","summary":"Melay 가입·로그인 인증 메일 요청","description":"레거시 이메일 가입용입니다. GOOGLE_AUTH_ONLY=true 배포에서는 403 auth_method_disabled로 차단합니다. Google 로그인은 /auth/google을 사용하세요.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"email":{"type":"string","format":"email","maxLength":200}},"required":["email"]}}}},"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"accepted":{"const":true},"expiresInSeconds":{"const":900}},"required":["accepted","expiresInSeconds"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"deprecated":true}},"/auth/complete":{"post":{"operationId":"completeRelayLogin","summary":"일회용 Melay 로그인 인증 완료","description":"레거시 이메일 가입용입니다. GOOGLE_AUTH_ONLY=true 배포에서는 403 auth_method_disabled로 차단합니다. Google 로그인은 /auth/google을 사용하세요.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"token":{"type":"string","pattern":"^lt_[A-Za-z0-9_-]{43}$"}},"required":["token"]}}}},"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"authenticated":{"const":true},"user":{"$ref":"#/components/schemas/UserIdentity"}},"required":["authenticated","user"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"deprecated":true}},"/account/session":{"get":{"operationId":"getRelayUserSession","summary":"사용자 세션 확인","security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"authenticated":{"const":true},"role":{"const":"user"},"mode":{"enum":["mock","live"]},"user":{"$ref":"#/components/schemas/UserIdentity"}},"required":["authenticated","role","mode","user"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"대기·거절·정지 상태에도 사용자 세션과 마스킹된 계정의 approvalStatus를 조회할 수 있습니다."},"delete":{"operationId":"logoutRelayUser","summary":"브라우저 세션 로그아웃","description":"브라우저 세션만 폐기합니다. rt_ AI access token은 별도 폐기해야 합니다.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"authenticated":{"const":false}},"required":["authenticated"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/tokens":{"get":{"operationId":"listUserAccessTokens","summary":"자기 access token 메타데이터 목록","security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"tokens":{"type":"array","items":{"$ref":"#/components/schemas/AccountToken"}}},"required":["tokens"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"issueUserAccessToken","summary":"AI용 사용자 access token 1회 발급","description":"원문은 다시 조회할 수 없습니다. 활성 토큰 최대 20개. 발급 응답 불확실 시 자동 재시도하지 않습니다.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","minLength":1,"maxLength":80}},"required":["label"]}}}},"responses":{"201":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedAccountToken"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/tokens/{tokenId}":{"delete":{"operationId":"revokeUserAccessToken","summary":"자기 access token 폐기","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"tokenId","in":"path","required":true,"schema":{"type":"string","pattern":"^token_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revoked":{"const":true}},"required":["revoked"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/projects":{"get":{"operationId":"userListManagedProjects","summary":"전체 프로젝트 정책·키 메타데이터 조회","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserManagedProjects"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}},"description":"자신의 프로젝트 목록을 반환합니다. 가입·승인·로그인으로 프로젝트를 자동 생성하지 않으므로 목록은 비어 있을 수 있습니다."},"post":{"operationId":"userCreateManagedProject","summary":"프로젝트 생성과 일회성 키 발급","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[],"responses":{"201":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateProject"}}}},"description":"승인된 사용자가 프로젝트를 명시적으로 만듭니다. allowedSenders:[]로 시작할 수 있으며 도메인 인증과 정확한 발신 주소 설정 전에는 발송할 수 없습니다."}},"/account/v1/projects/{projectId}":{"get":{"operationId":"userGetManagedProject","summary":"프로젝트 조회","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}},"description":" 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다."},"patch":{"operationId":"userUpdateManagedProject","summary":"프로젝트 정책 즉시 변경·사용 중지","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateProject"}}}},"description":" 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다."}},"/account/v1/projects/{projectId}/keys":{"post":{"operationId":"userIssueProjectKey","summary":"새 키 원문을 이번 응답에서만 발급","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"responses":{"201":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"integer","minimum":1},"kind":{"enum":["send","management"]},"label":{"type":"string","minLength":1,"maxLength":80}},"required":["revision","kind","label"],"additionalProperties":false}}}},"description":" 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다."}},"/account/v1/projects/{projectId}/keys/{keyId}":{"delete":{"operationId":"userRevokeProjectKey","summary":"키 폐기 (기록 보존, 진행 중 요청 완료 가능)","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}},{"name":"keyId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResult"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"revision":{"type":"integer","minimum":1}},"required":["revision"],"additionalProperties":false}}}},"description":" 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다."}},"/account/v1/projects/{projectId}/emails":{"get":{"operationId":"userListManagedEmails","summary":"프로젝트별 마스킹 메타데이터·UTC 사용량 조회","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"이전 nextCursor. 필터를 바꾸면 cursor를 초기화."},{"name":"status","in":"query","schema":{"enum":["pending","simulated","queued","delivered","failed","unknown"]}}],"responses":{"200":{"description":"성공","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailPage"}}}},"400":{"description":"잘못된 요청"},"401":{"description":"인증 필요"},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended"},"409":{"description":"설정 충돌 또는 중복"}},"description":" 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다."}},"/account/v1/projects/{projectId}/domains":{"get":{"operationId":"userOperatorListDomains","summary":"해당 사용자 도메인 목록","x-required-scopes":["domains:read"],"security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"같은 ownerId 사용자에게 속한 도메인만 반환","content":{"application/json":{"schema":{"type":"object","required":["domains"],"additionalProperties":false,"properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/Domain"}}}}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"사용자당 최대 20개 등록 목록 전체를 반환합니다. 페이지 분할 없음. 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]},"post":{"operationId":"userOperatorRegisterDomain","summary":"도메인 등록과 DNS TXT 증명 발급","x-required-scopes":["domains:write"],"security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"201":{"description":"도메인 등록 결과. 기존 동일 등록도 같은 도메인 ID를 반환합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["name"],"properties":{"name":{"type":"string","maxLength":253,"description":"와일드카드·URL·IP·공개 접미사만 있는 이름 불가. ASCII 소문자/Punycode 정규화"}}}}}},"description":"name만 받으며 ownerId·계정·연결은 인증 설정에서 결정합니다. 등록은 외부 DNS와 공급자 설정을 변경하지 않습니다. 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/account/v1/projects/{projectId}/domains/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"get":{"operationId":"userOperatorGetDomain","summary":"도메인 소유권·공급자 발송 준비 조회","x-required-scopes":["domains:read"],"security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}],"description":" 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다."},"delete":{"operationId":"userOperatorRevokeDomain","summary":"게이트웨이 발신 권한 철회","x-required-scopes":["domains:write"],"security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokedDomain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"외부 DNS나 Cloudflare 설정을 삭제하지 않습니다. 새 전송을 차단하며 이미 승인된 전송은 완료될 수 있습니다. 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/account/v1/projects/{projectId}/domains/{id}/verify":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"post":{"operationId":"userOperatorVerifyDomain","summary":"공개 DNS와 공급자 준비 재확인","x-required-scopes":["domains:write"],"security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Domain"}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"외부 설정을 변경하거나 메일을 보내지 않습니다. 정상 조회 후 전파 대기는 HTTP 200 canSend:false, 조회·권한 장애는 503입니다. 자기 소유 프로젝트만 접근할 수 있습니다. 소유자와 공급자 연결은 서버가 결정하며 신규 사용자는 공용 Cloudflare 연결을 사용합니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/account/v1/projects/{projectId}/domains/{id}/activate":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^dom_"}}],"post":{"operationId":"userOperatorActivateDomain","summary":"DNS 변경 영향 확인 후 명시적 적용","x-required-scopes":["domains:write"],"security":[{"UserAccessToken":[]},{"UserSession":[]}],"responses":{"200":{"description":"도메인 상태. canSend와 단계별 상태를 확인합니다.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ActivationPreview"},{"$ref":"#/components/schemas/Domain"}]}}}},"400":{"description":"엄격한 JSON·도메인·요청 형식 검증 실패","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"유효한 Bearer 키 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"해당 사용자 도메인을 찾을 수 없음. 다른 사용자 도메인도 같은 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"등록 또는 활성화 확인값 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"도메인 관리 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"DNS 조회·공급자 연결·권한 확인 장애. canSend로 성공을 추정하지 않음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{}},{"type":"object","additionalProperties":false,"required":["apply","confirmationToken"],"properties":{"apply":{"type":"boolean","const":true},"confirmationToken":{"type":"string","minLength":1}}}]}}}},"description":"빈 객체로 plan·confirmationToken·expiresAt를 조회한 뒤 검토한 계획만 apply:true와 확인값으로 별도 적용합니다. Cloudflare 발송 설정을 준비합니다. 신규 공급자 생성은 비어 있는 전용 DNS 위치에만 반송 MX/SPF·DKIM·DMARC를 추가할 수 있으며 기존 루트 MX·SPF·DMARC와 수신 규칙은 덮어쓰지 않습니다. 충돌은 Melay 운영 측 검토로 차단하고 추가 미등록 DNS는 사용자가 등록합니다. 공급자 공유와 도메인 소유권은 별개입니다. 공개 소유권·발송 DNS와 공급자 준비 확인 전에는 canSend를 허용하지 않습니다. 만료·재사용된 확인값은 409입니다.","parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"}}]}},"/v1/inbound":{"get":{"operationId":"listInboundRoutes","summary":"자기 수신 주소와 마스킹 전달 기록 조회","security":[{"ProjectKey":[]},{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"routes":{"type":"array","items":{"$ref":"#/components/schemas/InboundRoute"}},"records":{"type":"array","items":{"$ref":"#/components/schemas/InboundExecution"}}},"required":["routes","records"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"requestInboundRoute","summary":"Gmail로 전달할 수신 주소 신청","description":"공개 TXT 소유권 인증을 통과한 도메인만 신청합니다. Gmail/googlemail destination에 24시간 일회용 확인 링크를 보내며 수신자 직접 인증 전 전달을 활성화하지 않습니다. 사용자당 최대 20개 주소, 생성 요청은 시간당 5회.","security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"domainId":{"type":"string"},"localPart":{"type":"string","pattern":"^[a-z0-9][a-z0-9._+-]{0,63}$"},"destination":{"type":"string","format":"email","description":"Gmail 또는 googlemail 주소"}},"required":["domainId","localPart","destination"]}}}},"responses":{"201":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/inbound/{id}":{"get":{"operationId":"getInboundRoute","summary":"자기 수신 주소 상태 조회","security":[{"ProjectKey":[]},{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"pauseInboundForwarding","summary":"전달 일시 중지","description":"Gmail 전달을 일시 중지합니다. 기존 DNS와 수신 규칙은 보존되므로 수신 자체는 계속될 수 있으며 중지된 주소의 메일은 Worker에서 전달하지 않습니다. 메일 본문을 저장하지 않습니다.","security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/inbound/{id}/prepare":{"post":{"operationId":"prepareInboundIdentity","summary":"수신 identity·사용자 DNS 변경 안내 미리보기/적용","description":"{}로 plan과 일회용 confirmationToken을 받습니다. 검토한 apply:true 요청은 Cloudflare Gmail 목적지를 준비합니다. 공급자가 별도의 목적지 인증 메일을 보낼 수 있으며 Melay proof와 별도로 확인해야 합니다. DNS는 사용자가 등록합니다. 목적지 인증·공개 수신 DNS·Email Routing 준비가 완료된 후 계획을 다시 조회·적용하면 정확한 주소의 Worker 규칙을 활성화합니다. 기존 MX·다른 수신 규칙·catch-all을 변경하지 않습니다. operator_activation_required는 운영자 zone 준비가 필요함을 뜻합니다.","security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"apply":{"const":true},"confirmationToken":{"type":"string"}},"required":[]}}}},"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"plan":{"$ref":"#/components/schemas/InboundPlan"},"confirmationToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"required":["plan","confirmationToken","expiresAt"]},{"$ref":"#/components/schemas/InboundVerification"}]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/inbound/{id}/verify":{"post":{"operationId":"verifyInboundRoute","summary":"수신 전달 준비 재확인 및 활성화","description":"Melay Gmail proof, Cloudflare 목적지 인증, 공개 도메인 소유권·수신 DNS 및 Email Routing 준비와 수신 규칙을 조회합니다. 설정을 변경하지 않습니다. 기존 다른 공급자의 MX는 existing_mx_conflict로 차단합니다. 준비가 됐지만 규칙이 없으면 routing_rule_missing을 반환하며 계획을 새로 조회하고 명시적으로 적용해야 합니다. operator_activation_required이면 운영자의 zone 준비가 필요합니다.","security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundVerification"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/inbound/{id}/resume":{"post":{"operationId":"resumeInboundRoute","summary":"일시 중지된 전달 재개","description":"일시 중지된 전달을 dns_pending으로 돌립니다. 이어서 별도 /verify 요청으로 모든 준비 조건을 통과해야 활성화됩니다.","security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"준비 재확인 대기","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/inbound/{id}/destination-verification":{"post":{"operationId":"resendInboundDestinationProof","summary":"Gmail 수신 인증 메일 다시 요청","security":[{"ManagementKey":[]},{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}},{"name":"X-Relay-Project","in":"header","required":false,"schema":{"type":"string"},"description":"rt_ 사용자 access token에서 자신의 활성 프로젝트 선택. 생략하면 첫 활성 프로젝트를 사용합니다. mk_ 키 범위를 확대하지 않습니다."}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accepted"],"properties":{"accepted":{"const":true}}}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Melay의 24시간 일회용 Gmail proof 메일을 다시 요청합니다. Cloudflare 목적지 인증은 별개이며 /prepare 적용 시 필요한 공급자 인증 메일을 확인해야 합니다. accepted는 발송 접수이며 링크 확인을 의미하지 않습니다."}},"/auth/receive/complete":{"post":{"operationId":"confirmInboundGmail","summary":"수신자 Gmail 전달 동의 인증","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"proof":{"type":"string","pattern":"^iv_[A-Za-z0-9_-]{43}$"}},"required":["id","proof"]}}}},"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"verified":{"const":true},"route":{"$ref":"#/components/schemas/InboundRoute"}},"required":["verified","route"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/projects/{projectId}/inbound":{"get":{"operationId":"userProjectListInboundRoutes","summary":"자기 수신 주소와 마스킹 전달 기록 조회","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"routes":{"type":"array","items":{"$ref":"#/components/schemas/InboundRoute"}},"records":{"type":"array","items":{"$ref":"#/components/schemas/InboundExecution"}}},"required":["routes","records"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"userProjectRequestInboundRoute","summary":"Gmail로 전달할 수신 주소 신청","description":"공개 TXT 소유권 인증을 통과한 도메인만 신청합니다. Gmail/googlemail destination에 24시간 일회용 확인 링크를 보내며 수신자 직접 인증 전 전달을 활성화하지 않습니다. 사용자당 최대 20개 주소, 생성 요청은 시간당 5회.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"domainId":{"type":"string"},"localPart":{"type":"string","pattern":"^[a-z0-9][a-z0-9._+-]{0,63}$"},"destination":{"type":"string","format":"email","description":"Gmail 또는 googlemail 주소"}},"required":["domainId","localPart","destination"]}}}},"responses":{"201":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/projects/{projectId}/inbound":{"get":{"operationId":"adminProjectListInboundRoutes","summary":"자기 수신 주소와 마스킹 전달 기록 조회","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"routes":{"type":"array","items":{"$ref":"#/components/schemas/InboundRoute"}},"records":{"type":"array","items":{"$ref":"#/components/schemas/InboundExecution"}}},"required":["routes","records"]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."},"post":{"operationId":"adminProjectRequestInboundRoute","summary":"Gmail로 전달할 수신 주소 신청","description":"공개 TXT 소유권 인증을 통과한 도메인만 신청합니다. Gmail/googlemail destination에 24시간 일회용 확인 링크를 보내며 수신자 직접 인증 전 전달을 활성화하지 않습니다. 사용자당 최대 20개 주소, 생성 요청은 시간당 5회. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"domainId":{"type":"string"},"localPart":{"type":"string","pattern":"^[a-z0-9][a-z0-9._+-]{0,63}$"},"destination":{"type":"string","format":"email","description":"Gmail 또는 googlemail 주소"}},"required":["domainId","localPart","destination"]}}}},"responses":{"201":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/projects/{projectId}/inbound/{id}":{"get":{"operationId":"userProjectGetInboundRoute","summary":"자기 수신 주소 상태 조회","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"userProjectPauseInboundForwarding","summary":"전달 일시 중지","description":"Gmail 전달을 일시 중지합니다. 기존 DNS와 수신 규칙은 보존되므로 수신 자체는 계속될 수 있으며 중지된 주소의 메일은 Worker에서 전달하지 않습니다. 메일 본문을 저장하지 않습니다.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/projects/{projectId}/inbound/{id}":{"get":{"operationId":"adminProjectGetInboundRoute","summary":"자기 수신 주소 상태 조회","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."},"delete":{"operationId":"adminProjectPauseInboundForwarding","summary":"전달 일시 중지","description":"Gmail 전달을 일시 중지합니다. 기존 DNS와 수신 규칙은 보존되므로 수신 자체는 계속될 수 있으며 중지된 주소의 메일은 Worker에서 전달하지 않습니다. 메일 본문을 저장하지 않습니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/projects/{projectId}/inbound/{id}/prepare":{"post":{"operationId":"userProjectPrepareInboundIdentity","summary":"수신 identity·사용자 DNS 변경 안내 미리보기/적용","description":"{}로 plan과 일회용 confirmationToken을 받습니다. 검토한 apply:true 요청은 Cloudflare Gmail 목적지를 준비합니다. 공급자가 별도의 목적지 인증 메일을 보낼 수 있으며 Melay proof와 별도로 확인해야 합니다. DNS는 사용자가 등록합니다. 목적지 인증·공개 수신 DNS·Email Routing 준비가 완료된 후 계획을 다시 조회·적용하면 정확한 주소의 Worker 규칙을 활성화합니다. 기존 MX·다른 수신 규칙·catch-all을 변경하지 않습니다. operator_activation_required는 운영자 zone 준비가 필요함을 뜻합니다.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"apply":{"const":true},"confirmationToken":{"type":"string"}},"required":[]}}}},"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"plan":{"$ref":"#/components/schemas/InboundPlan"},"confirmationToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"required":["plan","confirmationToken","expiresAt"]},{"$ref":"#/components/schemas/InboundVerification"}]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/projects/{projectId}/inbound/{id}/prepare":{"post":{"operationId":"adminProjectPrepareInboundIdentity","summary":"수신 identity·사용자 DNS 변경 안내 미리보기/적용","description":"{}로 plan과 일회용 confirmationToken을 받습니다. 검토한 apply:true 요청은 Cloudflare Gmail 목적지를 준비합니다. 공급자가 별도의 목적지 인증 메일을 보낼 수 있으며 Melay proof와 별도로 확인해야 합니다. DNS는 사용자가 등록합니다. 목적지 인증·공개 수신 DNS·Email Routing 준비가 완료된 후 계획을 다시 조회·적용하면 정확한 주소의 Worker 규칙을 활성화합니다. 기존 MX·다른 수신 규칙·catch-all을 변경하지 않습니다. operator_activation_required는 운영자 zone 준비가 필요함을 뜻합니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"apply":{"const":true},"confirmationToken":{"type":"string"}},"required":[]}}}},"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"plan":{"$ref":"#/components/schemas/InboundPlan"},"confirmationToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"}},"required":["plan","confirmationToken","expiresAt"]},{"$ref":"#/components/schemas/InboundVerification"}]}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/projects/{projectId}/inbound/{id}/verify":{"post":{"operationId":"userProjectVerifyInboundRoute","summary":"수신 전달 준비 재확인 및 활성화","description":"Melay Gmail proof, Cloudflare 목적지 인증, 공개 도메인 소유권·수신 DNS 및 Email Routing 준비와 수신 규칙을 조회합니다. 설정을 변경하지 않습니다. 기존 다른 공급자의 MX는 existing_mx_conflict로 차단합니다. 준비가 됐지만 규칙이 없으면 routing_rule_missing을 반환하며 계획을 새로 조회하고 명시적으로 적용해야 합니다. operator_activation_required이면 운영자의 zone 준비가 필요합니다.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundVerification"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/projects/{projectId}/inbound/{id}/verify":{"post":{"operationId":"adminProjectVerifyInboundRoute","summary":"수신 전달 준비 재확인 및 활성화","description":"Melay Gmail proof, Cloudflare 목적지 인증, 공개 도메인 소유권·수신 DNS 및 Email Routing 준비와 수신 규칙을 조회합니다. 설정을 변경하지 않습니다. 기존 다른 공급자의 MX는 existing_mx_conflict로 차단합니다. 준비가 됐지만 규칙이 없으면 routing_rule_missing을 반환하며 계획을 새로 조회하고 명시적으로 적용해야 합니다. operator_activation_required이면 운영자의 zone 준비가 필요합니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundVerification"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/projects/{projectId}/inbound/{id}/resume":{"post":{"operationId":"userProjectResumeInboundRoute","summary":"일시 중지된 전달 재개","description":"일시 중지된 전달을 dns_pending으로 돌립니다. 이어서 별도 /verify 요청으로 모든 준비 조건을 통과해야 활성화됩니다.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"준비 재확인 대기","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/projects/{projectId}/inbound/{id}/resume":{"post":{"operationId":"adminProjectResumeInboundRoute","summary":"일시 중지된 전달 재개","description":"일시 중지된 전달을 dns_pending으로 돌립니다. 이어서 별도 /verify 요청으로 모든 준비 조건을 통과해야 활성화됩니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"준비 재확인 대기","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboundRoute"}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/projects/{projectId}/inbound/{id}/destination-verification":{"post":{"operationId":"userProjectResendInboundDestinationProof","summary":"Gmail 수신 인증 메일 다시 요청","security":[{"UserAccessToken":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accepted"],"properties":{"accepted":{"const":true}}}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 오류 또는 계정 승인 제한: account_pending, account_rejected, account_suspended","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Melay의 24시간 일회용 Gmail proof 메일을 다시 요청합니다. Cloudflare 목적지 인증은 별개이며 /prepare 적용 시 필요한 공급자 인증 메일을 확인해야 합니다. accepted는 발송 접수이며 링크 확인을 의미하지 않습니다."}},"/admin/v1/projects/{projectId}/inbound/{id}/destination-verification":{"post":{"operationId":"adminProjectResendInboundDestinationProof","summary":"Gmail 수신 인증 메일 다시 요청","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^route_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["accepted"],"properties":{"accepted":{"const":true}}}}}},"400":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"요청·인증·권한·한도 또는 공급자 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Melay의 24시간 일회용 Gmail proof 메일을 다시 요청합니다. Cloudflare 목적지 인증은 별개이며 /prepare 적용 시 필요한 공급자 인증 메일을 확인해야 합니다. accepted는 발송 접수이며 링크 확인을 의미하지 않습니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다."}},"/capabilities":{"get":{"operationId":"getProviderCapabilities","summary":"공개 가입·수신·Cloudflare 공유 연결 상태","description":"공유 공급자 연결과 수신 기능 구성 상태. zone별 Email Routing·DNS·Gmail 인증은 별도 검증하며 실제 메일 도착을 증명하지 않습니다.","security":[],"responses":{"200":{"description":"정상 응답","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["signup","receiving","dnsManagedBy","cloudflare","signupApprovalRequired"],"properties":{"signup":{"type":"boolean"},"receiving":{"type":"boolean"},"dnsManagedBy":{"const":"user"},"cloudflare":{"type":"object","additionalProperties":true,"required":["configured","sharedConnection","receivingConfigured","inboundMaxSizeBytes","receivingPermissionsReady","routingReady","status"],"properties":{"configured":{"type":"boolean"},"sharedConnection":{"const":true},"receivingConfigured":{"type":"boolean"},"inboundMaxSizeBytes":{"const":26214400},"routingReady":{"type":"boolean","description":"Operator go100m.com Email Routing is enabled and ready. Each requested route still needs its own DNS, ownership, destination and rule checks."},"status":{"type":"string"},"receivingPermissionsReady":{"type":"boolean","description":"Read-only provider permission probes succeeded; provider mutations still enforce edit permissions."}}},"signupApprovalRequired":{"const":true,"description":"New verified accounts require operator approval before using project, token, and mail APIs."}}}}}}}}},"/admin":{"get":{"operationId":"getAdminPage","summary":"비밀번호 로그인과 가입자 승인 관리자 페이지","security":[],"responses":{"200":{"description":"CSP 적용 HTML. 비밀번호·운영자 키가 포함되지 않습니다.","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/v1/users":{"get":{"operationId":"listAdminUsers","summary":"마스킹된 가입자 목록과 승인 상태별 수","description":"주소 원문·인증 proof·키는 반환하지 않습니다. counts는 필터와 관계없는 전체 수입니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"status","in":"query","schema":{"$ref":"#/components/schemas/ApprovalStatus"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":100}},{"name":"cursor","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"가입자 목록","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"users":{"type":"array","items":{"$ref":"#/components/schemas/AdminUser"}},"counts":{"type":"object","additionalProperties":false,"properties":{"pending":{"type":"integer","minimum":0},"approved":{"type":"integer","minimum":0},"rejected":{"type":"integer","minimum":0},"suspended":{"type":"integer","minimum":0}},"required":["pending","approved","rejected","suspended"]},"nextCursor":{"type":["string","null"]}},"required":["users","counts","nextCursor"]}}}},"400":{"description":"필터·페이지 입력 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"운영자 인증 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 또는 Origin 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/users/{id}/approve":{"post":{"operationId":"approveAdminUser","summary":"가입자 승인","description":"현재 revision 기준으로 계정을 승인합니다. 승인은 프로젝트를 자동 생성하지 않습니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","minimum":1}},"required":["revision"]}}}},"responses":{"200":{"description":"승인 상태 저장","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"user":{"$ref":"#/components/schemas/AdminUser"}},"required":["user"]}}}},"400":{"description":"입력 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"운영자 인증 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 또는 Origin 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"가입자 없음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"account_revision_conflict 또는 invalid_account_transition: 최신 목록·현재 상태 재조회 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/users/{id}/reject":{"post":{"operationId":"rejectAdminUser","summary":"가입자 거절","description":"현재 revision 필요. 쿠키 인증 변경에는 정확한 동일 출처 Origin이 필요합니다. 상태 변경은 기존 계정·키·도메인·기록을 보존합니다. 정지 시 새로운 프로젝트·메일 요청·수신 전달을 차단합니다. 재승인은 같은 키를 복원하며 이미 시작된 요청은 완료될 수 있습니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","minimum":1}},"required":["revision"]}}}},"responses":{"200":{"description":"거절 상태 저장","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"user":{"$ref":"#/components/schemas/AdminUser"}},"required":["user"]}}}},"400":{"description":"입력 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"운영자 인증 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 또는 Origin 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"가입자 없음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"account_revision_conflict 또는 invalid_account_transition: 최신 목록·현재 상태 재조회 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/users/{id}/suspend":{"post":{"operationId":"suspendAdminUser","summary":"가입자 정지","description":"현재 revision 필요. 쿠키 인증 변경에는 정확한 동일 출처 Origin이 필요합니다. 상태 변경은 기존 계정·키·도메인·기록을 보존합니다. 정지 시 새로운 프로젝트·메일 요청·수신 전달을 차단합니다. 재승인은 같은 키를 복원하며 이미 시작된 요청은 완료될 수 있습니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"revision":{"type":"integer","minimum":1}},"required":["revision"]}}}},"responses":{"200":{"description":"정지 상태 저장","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"user":{"$ref":"#/components/schemas/AdminUser"}},"required":["user"]}}}},"400":{"description":"입력 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"운영자 인증 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"권한 또는 Origin 오류","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"가입자 없음","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"account_revision_conflict 또는 invalid_account_transition: 최신 목록·현재 상태 재조회 필요","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/admin/v1/service":{"get":{"operationId":"getRelayServiceConfiguration","summary":"사용자 프로젝트와 분리된 Melay 운영 설정 조회","description":"서비스 URL·운영 인증메일 발신 주소·공용 공급자 구성 여부를 읽기 전용으로 조회합니다. 공급자 토큰·계정 ID·비밀번호·해시는 반환하지 않습니다. 구성 여부는 실제 발송이나 수신 도착 증거가 아닙니다. Google 사용자 세션은 DB role=operator 및 approved인 경우만 허용합니다. rt_ 토큰은 운영자 소유여도 거절합니다. GOOGLE_AUTH_ONLY 배포에서 ConsoleSession은 차단됩니다.","security":[{"OperatorKey":[]},{"ConsoleSession":[]},{"UserSession":[]}],"responses":{"200":{"description":"운영 설정","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceConfiguration"}}}},"401":{"description":"운영자 인증 필요"},"503":{"description":"구성 오류"}}}},"/auth/config":{"get":{"operationId":"getGoogleAuthConfiguration","summary":"Google 가입에 필요한 공개 Firebase 클라이언트 설정","security":[],"responses":{"200":{"description":"비밀값·운영자 식별자 없는 공개 설정","content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"firebase":{"anyOf":[{"$ref":"#/components/schemas/FirebasePublicConfiguration"},{"type":"null"}]},"legacyEmailLogin":{"type":"boolean"}},"required":["enabled","firebase","legacyEmailLogin"]}}}}}}},"/auth/google":{"post":{"operationId":"loginWithFirebaseGoogle","summary":"Firebase Google ID token을 자체 브라우저 세션으로 교환","description":"동일 출처가 필요합니다. 서버가 Google 서명·iss·aud·exp·iat·auth_time·Google 제공자·인증된 이메일을 검증합니다. 임의 역할 claim은 신뢰하지 않습니다. 일반 신규 사용자는 pending, DB 지정 운영자는 approved이며 프로젝트·키는 자동 생성하지 않습니다. Firebase UID와 이메일의 다른 계정 충돌은 거절합니다.","security":[],"parameters":[{"name":"Origin","in":"header","required":true,"schema":{"type":"string"},"description":"서비스와 정확히 동일한 출처"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"idToken":{"type":"string","maxLength":12000}},"required":["idToken"]}}}},"responses":{"200":{"description":"8시간 HttpOnly Secure SameSite=Strict relay_user 쿠키 발급","headers":{"Set-Cookie":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"authenticated":{"const":true},"user":{"$ref":"#/components/schemas/UserIdentity"}},"required":["authenticated","user"]}}}},"400":{"description":"잘못된 요청","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"잘못된 Google ID token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"출처 또는 인증 방식 거절","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"기존 계정의 Google UID·이메일 충돌","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"요청 본문 크기 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"인증 요청 한도 초과","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Google 로그인 구성 또는 공개 키 조회 불가","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/account/v1/onboarding":{"post":{"operationId":"onboardAiManagedSending","summary":"AI 토큰 하나로 프로젝트·도메인·최초 발송 키 준비 및 DNS 등록 후 이어가기","description":"승인된 사용자 범위에서 명시적으로 프로젝트를 생성합니다. 기존 프로젝트의 appName이 일치해야 합니다. allowedSenders가 비어 있으면 현재 revision으로 요청한 발신 주소 하나만 추가하고 다른 정책은 보존합니다. 발신 주소가 이미 있으면 요청 주소가 허용돼 있어야 하며 키를 임의 변경하지 않습니다. 동일 요청은 기존 프로젝트·도메인에서 이어가며 최초 발급 키를 재노출하거나 회전하지 않습니다. 소유권 TXT 확인 후 공용 Cloudflare 발송 준비를 처리합니다. 안전한 전용 예약 DNS 위치가 비어 있을 때만 신규 공급자 설정을 생성하며 기존 루트 MX·SPF·DMARC·수신 규칙은 보존합니다. 사용자 Cloudflare 자격증명·OAuth 연결이나 DNS 자동 등록은 제공하지 않습니다. Cloudflare 생성에는 DNS 쓰기 생략·CAS가 없어 외부 동시 DNS 수정까지 원자적으로 보호할 수 없습니다. 기존 _dmarc 기록이 있으면 신규 자동 생성을 차단합니다. 불확실한 공급자 쓰기를 재시도하지 않습니다. 공급자/zone/권한/충돌 문제는 Melay 운영 측에서 해결합니다. 이 API는 실제 메일을 보내지 않습니다.","security":[{"UserAccessToken":[]},{"UserSession":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiOnboardingRequest"},"example":{"projectId":"eliforp","appName":"Eliforp","domain":"eliforp.com","from":"noreply@eliforp.com"}}}},"responses":{"200":{"description":"진행 상태. dns_required이면 사용자가 반환 DNS 등록 후 동일 요청을 반복합니다. operator_required/provider_pending/blocked는 완료가 아닙니다.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiOnboardingResult"}}}},"400":{"description":"invalid_request, invalid_domain, invalid_sender: 알 수 없는 필드·형식·다른 도메인 발신 주소"},"401":{"description":"인증 필요"},"403":{"description":"account_pending/account_rejected/account_suspended 또는 동일 출처 제한"},"404":{"description":"not_found: 다른 사용자의 프로젝트"},"409":{"description":"onboarding_project_unavailable, onboarding_project_conflict 또는 동시에 생성된 프로젝트 충돌. 현재 정책을 조회하고 명시적으로 해결하며 키를 자동 회전하지 않습니다."},"429":{"description":"project_limit: 사용자 프로젝트 최대 5개"}}}}},"components":{"securitySchemes":{"ProjectKey":{"type":"http","scheme":"bearer","bearerFormat":"mk_<random>","description":"서버 전용 발송 키. emails:send, emails:read, domains:read. 도메인 변경에는 별도의 관리 키 필요."},"ManagementKey":{"type":"http","scheme":"bearer","bearerFormat":"mk_<random>","description":"사용자 도메인 관리 키. emails:read, domains:read, domains:write. emails:send는 부여하지 않습니다. 운영자만 안전하게 보관하며 ownerId·공급자 연결은 서버 설정에서 결정합니다."},"OperatorKey":{"type":"http","scheme":"bearer","description":"ra_ 운영자 키. 전체 프로젝트 관리 권한. 원문은 로컬 .secrets/relay-admin.env에 보관."},"ConsoleSession":{"type":"apiKey","in":"cookie","name":"relay_session","description":"8시간 HttpOnly 세션. 상태 변경은 같은 출처 Origin 필수."},"UserAccessToken":{"type":"http","scheme":"bearer","bearerFormat":"rt_<random>","description":"서버 전용 사용자 access token. 해당 사용자 소유 프로젝트·키·도메인·수신 전달 관리 및 메일 발송. 계정 관리용 넓은 권한이므로 호출 앱에는 좁은 mk_ 키를 권장합니다. 원문은 발급 응답에서 한 번만 반환합니다."},"UserSession":{"type":"apiKey","in":"cookie","name":"relay_user","description":"Melay 가입·로그인 인증 뒤 8시간 HttpOnly Secure SameSite=Strict 세션. 상태 변경에는 같은 출처 Origin 필수."}},"schemas":{"MailRecord":{"type":"object","additionalProperties":false,"required":["id","projectId","template","recipient","from","status","createdAt","updatedAt","errorCode","providerMessageId","replayed"],"properties":{"id":{"type":"string"},"projectId":{"type":"string"},"template":{"type":"string","enum":["auth-code","invitation","notification"]},"recipient":{"type":"string","description":"마스킹된 수신자. 원본 이메일을 반환하지 않습니다."},"from":{"type":"string","format":"email","maxLength":254},"status":{"type":"string","enum":["pending","simulated","queued","delivered","failed","unknown"]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"errorCode":{"type":["string","null"]},"providerMessageId":{"type":["string","null"]},"replayed":{"type":"boolean","description":"같은 멱등성 요청의 기존 기록을 반환한 경우 true"}}},"Error":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code"],"properties":{"code":{"type":"string"}}}},"description":"정형화된 오류 코드만 반환하며 비밀값, 수신자, 본문, 인증코드를 포함하지 않습니다."},"TemplateMetadata":{"type":"object","additionalProperties":false,"required":["id","description","variables"],"properties":{"id":{"type":"string","enum":["auth-code","invitation","notification"]},"description":{"type":"string"},"variables":{"type":"object","description":"해당 템플릿 variables 객체의 JSON Schema. type, additionalProperties, required, properties를 포함합니다.","required":["type","additionalProperties","required","properties"],"properties":{"type":{"type":"string","const":"object"},"additionalProperties":{"type":"boolean","const":false},"required":{"type":"array","items":{"type":"string"}},"properties":{"type":"object","additionalProperties":{"type":"object"}}},"additionalProperties":false}}},"DnsRecord":{"type":"object","additionalProperties":false,"required":["type","name","content"],"properties":{"type":{"type":"string","enum":["TXT","MX","CNAME"]},"name":{"type":"string"},"content":{"type":"string"},"priority":{"type":"integer","minimum":0,"maximum":65535}}},"Domain":{"type":"object","additionalProperties":false,"required":["id","name","ownerId","generation","connectionId","status","ownership","sending","canSend","lastCheckedAt","verificationValidUntil","errorCode"],"properties":{"id":{"type":"string","pattern":"^dom_"},"name":{"type":"string"},"ownerId":{"type":"string"},"generation":{"type":"integer","minimum":1},"connectionId":{"type":"string"},"status":{"type":"string","enum":["pending","verified","suspended","revoked"]},"ownership":{"type":"object","additionalProperties":false,"required":["status","record","challengeExpiresAt"],"properties":{"status":{"type":"string","enum":["pending","verified","missing","expired","error"]},"record":{"type":"object","additionalProperties":false,"required":["type","name","value"],"properties":{"type":{"type":"string","const":"TXT"},"name":{"type":"string"},"value":{"type":"string","description":"DNS에 그대로 등록할 소유권 증명값. Cloudflare 자격증명이 아닙니다."}}},"challengeExpiresAt":{"type":"string","format":"date-time"}}},"sending":{"type":"object","additionalProperties":false,"required":["provider","status","dnsRecords"],"properties":{"provider":{"type":"string","enum":["cloudflare"]},"status":{"type":"string","enum":["unconfigured","pending","ready","unavailable"]},"dnsRecords":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}}}},"canSend":{"type":"boolean"},"lastCheckedAt":{"type":["string","null"],"format":"date-time"},"verificationValidUntil":{"type":["string","null"],"format":"date-time"},"errorCode":{"type":["string","null"]}}},"ActivationPreview":{"type":"object","additionalProperties":false,"required":["plan","confirmationToken","expiresAt"],"properties":{"plan":{"type":"object","additionalProperties":false,"required":["provider","accountId","domain","zoneId","existingSendingId","actions","dnsRecords","dnsImpact","preservesRootMx","expectedDnsRecords","existingDnsRecords"],"properties":{"provider":{"type":"string","enum":["cloudflare"]},"accountId":{"type":["string","null"]},"domain":{"type":"string"},"zoneId":{"type":["string","null"]},"existingSendingId":{"type":["string","null"]},"actions":{"type":"array","items":{"type":"string"}},"dnsRecords":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"dnsImpact":{"type":"array","items":{"type":"string"}},"preservesRootMx":{"type":"boolean","const":true},"expectedDnsRecords":{"type":"array","description":"필요할 것으로 예상하는 DNS 기록의 이름·타입. 생성 전 실제 DKIM 값은 확정하지 않습니다.","items":{"type":"object","additionalProperties":false,"required":["type","name"],"properties":{"type":{"type":"string"},"name":{"type":"string"}}}},"existingDnsRecords":{"type":"array","description":"Cloudflare 공급자가 요구하는 DNS와 현재 기록을 안내합니다. DNS는 사용자가 수동으로 등록하며 Melay는 기존 DNS를 변경하지 않습니다. 목록을 공개 DNS 인증 증거로 사용하지 마세요.","items":{"type":"object","additionalProperties":false,"required":["type","name","content"],"properties":{"type":{"type":"string"},"name":{"type":"string"},"content":{"type":"string"},"priority":{"type":"number"}}}}}},"confirmationToken":{"type":"string","description":"짧은 유효기간의 설정 버전 연결 일회용 적용 확인값. Cloudflare 토큰이 아닙니다."},"expiresAt":{"type":"string","format":"date-time"}}},"RevokedDomain":{"type":"object","additionalProperties":false,"required":["id","name","ownerId","generation","connectionId","status","ownership","sending","canSend","lastCheckedAt","verificationValidUntil","errorCode","inFlightMayComplete"],"properties":{"id":{"type":"string","pattern":"^dom_"},"name":{"type":"string"},"ownerId":{"type":"string"},"generation":{"type":"integer","minimum":1},"connectionId":{"type":"string"},"status":{"type":"string","enum":["pending","verified","suspended","revoked"]},"ownership":{"type":"object","additionalProperties":false,"required":["status","record","challengeExpiresAt"],"properties":{"status":{"type":"string","enum":["pending","verified","missing","expired","error"]},"record":{"type":"object","additionalProperties":false,"required":["type","name","value"],"properties":{"type":{"type":"string","const":"TXT"},"name":{"type":"string"},"value":{"type":"string","description":"DNS에 그대로 등록할 소유권 증명값. Cloudflare 자격증명이 아닙니다."}}},"challengeExpiresAt":{"type":"string","format":"date-time"}}},"sending":{"type":"object","additionalProperties":false,"required":["provider","status","dnsRecords"],"properties":{"provider":{"type":"string","const":"cloudflare"},"status":{"type":"string","enum":["unconfigured","pending","ready","unavailable"]},"dnsRecords":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}}}},"canSend":{"type":"boolean"},"lastCheckedAt":{"type":["string","null"],"format":"date-time"},"verificationValidUntil":{"type":["string","null"],"format":"date-time"},"errorCode":{"type":["string","null"]},"inFlightMayComplete":{"type":"boolean","description":"철회 전 시작한 메일은 완료될 수 있음"}}},"KeyMetadata":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["send","management"]},"label":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"}},"required":["id","kind","label","createdAt","revokedAt"],"additionalProperties":false},"IssuedKey":{"type":"object","properties":{"id":{"type":"string"},"kind":{"enum":["send","management"]},"label":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"revokedAt":{"type":["string","null"],"format":"date-time"},"token":{"type":"string"}},"required":["id","kind","label","createdAt","revokedAt","token"],"additionalProperties":false},"ManagedProject":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"ownerId":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"providerConnectionId":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"appName":{"type":"string","minLength":1,"maxLength":100},"allowedSenders":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"string","format":"email"}},"allowedTemplates":{"type":"array","minItems":1,"maxItems":3,"items":{"enum":["auth-code","invitation","notification"]}},"dailyLimit":{"type":"integer","minimum":1,"maximum":100000},"minuteLimit":{"type":"integer","minimum":1,"maximum":1000},"disabled":{"type":"boolean"},"revision":{"type":"integer","minimum":1},"createdAt":{"type":"string","format":"date-time"},"keys":{"type":"array","items":{"$ref":"#/components/schemas/KeyMetadata"}}},"required":["id","ownerId","providerConnectionId","appName","allowedSenders","allowedTemplates","dailyLimit","minuteLimit","disabled","revision","createdAt","keys"],"additionalProperties":false},"CreateProject":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"ownerId":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"providerConnectionId":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"appName":{"type":"string","minLength":1,"maxLength":100},"allowedSenders":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"string","format":"email"}},"allowedTemplates":{"type":"array","minItems":1,"maxItems":3,"items":{"enum":["auth-code","invitation","notification"]}},"dailyLimit":{"type":"integer","minimum":1,"maximum":100000},"minuteLimit":{"type":"integer","minimum":1,"maximum":1000}},"required":["id","appName","allowedSenders","allowedTemplates","dailyLimit","minuteLimit"],"additionalProperties":false},"UpdateProject":{"type":"object","properties":{"revision":{"type":"integer","minimum":1},"appName":{"type":"string","minLength":1,"maxLength":100},"allowedSenders":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"string","format":"email"}},"allowedTemplates":{"type":"array","minItems":1,"maxItems":3,"items":{"enum":["auth-code","invitation","notification"]}},"dailyLimit":{"type":"integer","minimum":1,"maximum":100000},"minuteLimit":{"type":"integer","minimum":1,"maximum":1000},"disabled":{"type":"boolean"}},"required":["revision"],"additionalProperties":false},"ProjectResult":{"type":"object","properties":{"project":{"$ref":"#/components/schemas/ManagedProject"},"issuedKeys":{"type":"array","items":{"$ref":"#/components/schemas/IssuedKey"}}},"required":["project"],"additionalProperties":false},"EmailPage":{"type":"object","properties":{"emails":{"type":"array","items":{"$ref":"#/components/schemas/MailRecord"}},"nextCursor":{"type":["string","null"]},"usage":{"type":"object","properties":{"daily":{"type":"integer"},"minute":{"type":"integer"}},"required":["daily","minute"],"additionalProperties":false}},"required":["emails","nextCursor","usage"],"additionalProperties":false},"ManagedProjects":{"type":"object","properties":{"projects":{"type":"array","items":{"$ref":"#/components/schemas/ManagedProject"}},"mode":{"enum":["mock","live"]}},"required":["projects","mode"],"additionalProperties":false},"UserIdentity":{"type":"object","additionalProperties":false,"properties":{"ownerId":{"type":"string"},"accountId":{"type":"string"},"emailHash":{"type":"string"},"emailMasked":{"type":"string"},"approvalStatus":{"$ref":"#/components/schemas/ApprovalStatus"},"role":{"type":"string","enum":["user","operator"],"description":"서버 DB에서만 결정하는 역할. 사용자 토큰의 관리자 권한을 부여하지 않음"}},"required":["ownerId","accountId","emailHash","emailMasked","approvalStatus","role"]},"AccountToken":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^token_"},"label":{"type":"string","maxLength":80},"created":{"type":"string","format":"date-time"},"revoked":{"type":["string","null"]}},"required":["id","label","created","revoked"]},"IssuedAccountToken":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"label":{"type":"string"},"created":{"type":"string","format":"date-time"},"token":{"type":"string","pattern":"^rt_[A-Za-z0-9_-]{43}$","description":"원문은 이 응답에서 한 번만 반환됩니다. 발급 오류의 자동 재시도 금지."}},"required":["id","label","created","token"]},"InboundRoute":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","pattern":"^route_"},"ownerId":{"type":"string"},"domainId":{"type":"string"},"domainName":{"type":"string"},"connectionId":{"type":"string"},"address":{"type":"string","format":"email"},"destinationMasked":{"type":"string"},"destinationVerified":{"type":"boolean","description":"Melay의 24시간 일회용 Gmail proof 확인 여부"},"status":{"enum":["verification_pending","dns_pending","active","paused","activation_unknown"]},"createdAt":{"type":"string","format":"date-time"},"errorCode":{"type":["string","null"]},"destinationProviderVerified":{"type":"boolean","description":"Cloudflare 목적지 인증 확인 여부. Melay proof와 별개이며 확인 전에는 전달을 활성화하지 않습니다."}},"required":["id","ownerId","domainId","domainName","connectionId","address","destinationMasked","destinationVerified","status","createdAt","errorCode"]},"InboundExecution":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"route_id":{"type":"string"},"status":{"enum":["queued","failed","unknown"]},"created":{"type":"integer","description":"Unix milliseconds"},"provider_id":{"type":["string","null"]},"error_code":{"type":["string","null"]}},"required":["id","route_id","status","created","provider_id","error_code"]},"InboundPlan":{"type":"object","additionalProperties":false,"properties":{"domain":{"type":"string"},"address":{"type":"string"},"dnsRecords":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"existingMx":{"type":"array","items":{"type":"string"}},"actions":{"type":"array","items":{"type":"string"}},"changesDns":{"const":false},"preservesExistingMailSettings":{"const":true},"receivingSizeLimitBytes":{"const":26214400},"provider":{"const":"cloudflare"},"destinationProviderVerified":{"type":"boolean"},"routingEnabled":{"type":"boolean"},"errorCode":{"type":["string","null"]},"preservesCatchAll":{"const":true}},"required":["domain","address","dnsRecords","existingMx","actions","changesDns","preservesExistingMailSettings","receivingSizeLimitBytes","provider","destinationProviderVerified","routingEnabled","errorCode","preservesCatchAll"]},"InboundVerification":{"type":"object","additionalProperties":false,"properties":{"route":{"$ref":"#/components/schemas/InboundRoute"},"plan":{"$ref":"#/components/schemas/InboundPlan"}},"required":["route","plan"]},"UserCreateProject":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"appName":{"type":"string","minLength":1,"maxLength":100},"allowedSenders":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"string","format":"email"}},"allowedTemplates":{"type":"array","minItems":1,"maxItems":3,"items":{"enum":["auth-code","invitation","notification"]}},"dailyLimit":{"type":"integer","minimum":1,"maximum":500},"minuteLimit":{"type":"integer","minimum":1,"maximum":50}},"required":["id","appName","allowedSenders","allowedTemplates","dailyLimit","minuteLimit"],"additionalProperties":false},"UserUpdateProject":{"type":"object","properties":{"revision":{"type":"integer","minimum":1},"appName":{"type":"string","minLength":1,"maxLength":100},"allowedSenders":{"type":"array","minItems":0,"maxItems":20,"items":{"type":"string","format":"email"}},"allowedTemplates":{"type":"array","minItems":1,"maxItems":3,"items":{"enum":["auth-code","invitation","notification"]}},"dailyLimit":{"type":"integer","minimum":1,"maximum":500},"minuteLimit":{"type":"integer","minimum":1,"maximum":50},"disabled":{"type":"boolean"}},"required":["revision"],"additionalProperties":false},"UserManagedProjects":{"type":"object","properties":{"projects":{"type":"array","items":{"$ref":"#/components/schemas/ManagedProject"}},"mode":{"enum":["mock","live"]},"role":{"const":"user"}},"required":["projects","mode","role"],"additionalProperties":false},"ApprovalStatus":{"type":"string","enum":["pending","approved","rejected","suspended"]},"AdminUser":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string"},"ownerId":{"type":"string"},"emailMasked":{"type":"string"},"status":{"$ref":"#/components/schemas/ApprovalStatus"},"createdAt":{"type":["string","null"],"format":"date-time","description":"기존 계정의 기록 시각이 없으면 null"},"updatedAt":{"type":["string","null"],"format":"date-time","description":"기존 계정의 기록 시각이 없으면 null"},"revision":{"type":"integer","minimum":1},"role":{"type":"string","enum":["user","operator"],"description":"서버 DB에서만 결정하는 역할. 사용자 토큰의 관리자 권한을 부여하지 않음"}},"required":["id","ownerId","emailMasked","status","createdAt","updatedAt","revision","role"]},"ServiceConfiguration":{"type":"object","additionalProperties":false,"properties":{"service":{"type":"string","const":"Melay"},"serviceUrl":{"type":"string","format":"uri"},"systemSender":{"type":"string","format":"email","description":"Melay 가입·목적지 인증메일의 운영 발신 주소. 사용자 발신 권한과 별도."},"mode":{"type":"string","enum":["mock","live"]},"stateVersion":{"type":["string","null"],"description":"상태 세대; 일반 재배포에서는 유지합니다."},"cloudflare":{"type":"object","additionalProperties":false,"properties":{"sharedConnection":{"type":"boolean","const":true},"configured":{"type":"boolean"}},"required":["sharedConnection","configured"]},"signup":{"type":"object","additionalProperties":false,"properties":{"configured":{"type":"boolean"},"approvalRequired":{"type":"boolean","const":true},"automaticProjectCreation":{"type":"boolean","const":false},"googleConfigured":{"type":"boolean"},"legacyEmailLogin":{"type":"boolean"}},"required":["configured","approvalRequired","automaticProjectCreation","googleConfigured","legacyEmailLogin"]},"receiving":{"type":"object","additionalProperties":false,"properties":{"configured":{"type":"boolean"}},"required":["configured"]},"initialProjectsConfigured":{"type":"integer","minimum":0}},"required":["service","serviceUrl","systemSender","mode","stateVersion","cloudflare","signup","receiving","initialProjectsConfigured"]},"FirebasePublicConfiguration":{"type":"object","additionalProperties":false,"properties":{"apiKey":{"type":"string"},"authDomain":{"type":"string"},"projectId":{"type":"string"},"appId":{"type":"string"},"messagingSenderId":{"type":"string"},"storageBucket":{"type":"string"},"measurementId":{"type":"string"}},"required":["apiKey","authDomain","projectId","appId"]},"AiOnboardingRequest":{"type":"object","additionalProperties":false,"required":["projectId","appName","domain"],"properties":{"projectId":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,63}$"},"appName":{"type":"string","minLength":1,"maxLength":100},"domain":{"type":"string","description":"정확한 소유 도메인. 공개 TXT 소유권 확인 전 공급자를 변경하지 않습니다."},"from":{"type":"string","format":"email","description":"정확히 같은 도메인의 발신 주소. 생략 시 noreply@<domain>."}}},"AiOnboardingResult":{"type":"object","additionalProperties":false,"required":["phase","project","domain","from","requiredDns","errorCode","operations","nextActions"],"properties":{"phase":{"enum":["dns_required","ready","provider_pending","operator_required","blocked"],"description":"DNS 등록은 사용자, provider/권한/zone/충돌 문제는 Melay 운영 측 책임입니다. ready 외 상태는 발송 준비 완료가 아닙니다."},"project":{"$ref":"#/components/schemas/ManagedProject"},"domain":{"oneOf":[{"$ref":"#/components/schemas/Domain"},{"type":"null"}]},"from":{"type":"string","format":"email"},"requiredDns":{"type":"array","items":{"$ref":"#/components/schemas/DnsRecord"}},"issuedKeys":{"type":"array","items":{"$ref":"#/components/schemas/IssuedKey"},"description":"새 프로젝트 최초 생성 시 한 번만 반환. 비밀 설정에 즉시 저장하며 재호출로 복구·자동 회전하지 않습니다. DNS/공급자 후속 작업 실패 시에도 최초 키를 포함할 수 있습니다."},"keysShownOnce":{"const":true},"errorCode":{"type":["string","null"]},"operations":{"type":"object","additionalProperties":false,"required":["provider","dns","existingMailSettings"],"properties":{"provider":{"const":"melay"},"dns":{"const":"user"},"existingMailSettings":{"const":"preserved"}}},"nextActions":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["actor","action"],"properties":{"actor":{"enum":["ai","user","operator"]},"action":{"type":"string"}}}}}}}}}