
# 제안된 조직에 가입

`POST /fapi/v1/me/organization-suggestions/{domain_id}:join` · 환경의 로그인 호스트에서 호출

[내 조직 제안 목록](/docs/api/fapi/me/organization-suggestions/list)의 제안을 수락합니다. 인증된 사용자는 환경의 기본 멤버 역할로 제안된 조직의 멤버가 됩니다. 멤버십의 출처는 `domain_capture`이며 사용자가 행위자로 기록됩니다. `organization_membership.created` 이벤트가 전송됩니다. 동시에 두 가입 요청이 들어오면 하나만 성공합니다. 가입에는 최근 검증된 세션이 필요하지 않습니다. 기본 멤버 역할만 부여하며, 사용자가 주소를 검증한 도메인에 대해서만 가능합니다. 사용자의 `__Host-idp_session` 쿠키가 필요하며, 쿠키가 없거나 만료되었거나 취소되었으면 `401 unauthenticated`를 반환합니다. 다른 출처의 자사 앱은 대신 프런트 API 액세스 토큰(DPoP 증명과 함께 `Authorization: DPoP <token>`)을 보낼 수 있습니다. [프런트 API 액세스 토큰](/docs/api/fapi/front-api-token)을 참조하세요.

`@keenauth/js` 사용 시: `await keenauth.organizations.joinSuggestion(id)`.

## 요청

헤더:

| 헤더 | 필수 | 설명 |
| --- | --- | --- |
| `Idp-Client` | 예 | SDK 식별자입니다. |
| `Origin` | 예 | 정확히 `https://<sign-in host>`이어야 합니다. |

`domain_id`: 제안의 `id`(`odm_…`)입니다.

본문은 없습니다(빈 JSON 객체도 허용됩니다).

## 응답

`{"membership_id": "mem_…", "organization_id": "org_…"}`가 포함된 `200 OK`입니다.

## 오류

| 상태 | 코드 | 발생 조건 |
| --- | --- | --- |
| 401 | `unauthenticated` | 유효한 세션 쿠키나 프런트 API 액세스 토큰이 없습니다. |
| 403 | `origin_not_allowed` | `Origin`이 없거나 잘못되었습니다. |
| 403 | `role_not_assignable` | 기본 멤버 역할을 도메인 캡처로 부여할 수 없습니다. |
| 403 | `user_not_active` | 사용자가 활성 상태가 아닙니다. |
| 404 | `not_found` | 이 사용자에 대한 제안 도메인이 아닙니다(알 수 없거나, 형식이 잘못되었거나, `suggest` 모드가 아니거나, 해당 도메인의 검증된 주소가 없거나, 세 번 닫힌 경우). |
| 409 | `membership_already_exists` | 사용자가 이미 해당 조직의 멤버십을 가지고 있습니다. |
| 409 | `organization_disabled` | 조직이 비활성화되었거나 삭제 중입니다. |
| 409 | `membership_limit_reached` | 사용자가 멤버십 한도에 도달했습니다. |
| 409 | `organization_membership_limit_reached` | 조직이 멤버십 한도에 도달했습니다. |
| 503 | `temporarily_unavailable` | 멤버십 디렉터리가 응답하지 않았습니다. 나중에 다시 시도하세요. |

## 예제

```bash
curl -X POST https://example.keenauth.app/fapi/v1/me/organization-suggestions/odm_01j9a5c4000000000000000001:join \
  -H "Idp-Client: my-app/1.0.0 (node/22.0.0)" \
  -H "Origin: https://example.keenauth.app" \
  -b cookies.txt
```

```json
{
  "membership_id": "mem_01j9yyyyyyyyyyyyyyyyyyyyyy",
  "organization_id": "org_01j9xxxxxxxxxxxxxxxxxxxxxx"
}
```

## 개인정보

이 엔드포인트는 개인정보를 포함합니다: 조직 멤버십과 초대. [KeenAuth API의 개인정보](/docs/policies/personal-data)에서 저장되는 항목, 보관 기간, 삭제 방법을 확인하세요. 어떤 필드에도 민감정보(건강, 생체 정보, 종교, 정치적 견해, 성적 지향)를 보내지 마세요.
