SaaS APIAgency API
POST /agency/me/clients
에이전시 하위 기업 추가/삭제
하위 기업 추가/삭제
에이전시 운영자가 하위 기업 계정을 생성합니다. id는 하위 기업의 로그인 아이디이며, email과 별도로 전달해야 합니다.
기존처럼 email 값을 로그인 아이디로 사용하지 않습니다. 프론트는 id 입력값을 별도로 받아 요청 바디에 포함해야 합니다.
에이전시 운영자가 자기 에이전시에 대해 호출하는 경로와, 글로우브 운영자(어드민)가 특정 에이전시를 지정해 호출하는 경로 두 가지가 있습니다.
| 항목 | 에이전시 셀프서비스 | 어드민 |
|---|---|---|
| 메서드 | POST | POST |
| 경로 | /agency/me/clients 또는 /ai/agency/me/clients | /admin/agency/{agencyId}/clients 또는 /ai/admin/agency/{agencyId}/clients |
| 인증 | 필요 | 필요 |
| 권한 | ROLE_AGENCY | ROLE_ADMIN |
| 소속 에이전시 | 호출자 본인 에이전시 | 경로의 agencyId (없는 에이전시면 거부) |
두 경로 모두 요청 바디·응답 형식·생성 규칙(초기 상태, 알림/가격 노출 기본값, 임시 비밀번호)이 같습니다.
요청
POST /agency/me/clients HTTP/1.1
Host: api.glowb.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"id": "client_brand_001",
"name": "고객사A",
"email": "client@example.com",
"password": "initialPassword123!"
}POST /admin/agency/demo/clients HTTP/1.1
Host: api.glowb.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: application/json
{
"id": "client_brand_001",
"name": "고객사A",
"email": "client@example.com",
"password": "initialPassword123!"
}curl -X POST "https://api.glowb.com/agency/me/clients" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"id": "client_brand_001",
"name": "고객사A",
"email": "client@example.com",
"password": "initialPassword123!"
}'const response = await fetch('/agency/me/clients', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
id: 'client_brand_001',
name: '고객사A',
email: 'client@example.com',
password: 'initialPassword123!',
}),
});
const client = await response.json();Request Body
Prop
Type
삭제
하위 기업 계정을 실제 삭제합니다. 내부적으로 TB_BUSINESS를 먼저 삭제하고, 연결된 TB_MEMBER도 삭제합니다.
하위 기업에 캠페인, 크레딧 거래, 캠페인 예산 이력이 있으면 삭제할 수 없습니다. 캠페인이 있으면 먼저 다른 하위 기업으로 할당하고, 크레딧/예산 이력이 있으면 삭제 대신 비활성화 상태로 변경해야 합니다.
그 밖의 데이터(계약·알림 등)가 하위 기업을 참조하고 있어도 삭제할 수 없으며(AGENCY_CLIENT_HAS_DEPENDENCIES), 이 경우에도 비활성화 상태로 변경하세요.
| 항목 | 값 |
|---|---|
| 메서드 | DELETE |
| 경로 | /agency/me/clients/{id} 또는 /ai/agency/me/clients/{id} |
| 인증 | 필요 |
| 권한 | ROLE_AGENCY |
DELETE /agency/me/clients/client_brand_001 HTTP/1.1
Host: api.glowb.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...삭제 성공 응답 (200 OK)
{
"id": "client_brand_001",
"name": "고객사A",
"email": "client@example.com",
"status": "active"
}응답
성공 응답 (200 OK)
{
"id": "client_brand_001",
"name": "고객사A",
"email": "client@example.com",
"status": "active",
"creditBalance": 0,
"notifyAdvertiser": true,
"notifyAgency": false,
"showPrice": true
}Response Body
Prop
Type
에러 응답
| 상태 코드 | code | 설명 |
|---|---|---|
| 400 | AGENCY_CLIENT_LOGIN_ID_REQUIRED | (추가) 로그인 아이디 누락 |
| 400 | AGENCY_CLIENT_LOGIN_ID_INVALID | (추가) 로그인 아이디가 60자 초과(args.maxLength=60). 예전에는 DATABASE_ERROR로 실패했습니다 |
| 409 | AGENCY_CLIENT_LOGIN_ID_DUPLICATE | (추가) 이미 사용 중인 로그인 아이디(args.loginId) |
| 409 | AGENCY_CLIENT_CAMPAIGN_REMAINING | (삭제) 하위 기업에 연결된 캠페인이 있음. 먼저 다른 하위 기업으로 할당 |
| 409 | AGENCY_CLIENT_CREDIT_HISTORY_EXISTS | (삭제) 크레딧·예산 이력이 있음. 비활성화로 변경 |
| 409 | AGENCY_CLIENT_HAS_DEPENDENCIES | (삭제) 위 검사 밖의 데이터가 하위 기업을 참조하고 있음. 비활성화로 변경. 예전에는 DATABASE_ERROR로 실패했습니다 |
{
"status": 400,
"code": "AGENCY_CLIENT_LOGIN_ID_INVALID",
"message": "하위 기업 로그인 아이디는 60자 이하로 입력해주세요.",
"args": { "maxLength": 60 },
"data": null
}