# 회원 API v2.0.1

{% hint style="info" %}
오프사이트 캠페인의 발송 시 사용되는 회원의 정보를 그루비에 전송하는 API 입니다.&#x20;

[회원 API](/developer-guide/api-guide/member.md) 문서를 참고해 주세요.회원 API v1 과 v2는 혼용하여 사용할 수 없습니다.
{% endhint %}

## **회원 정보 조회**

### **설명**

등록한 회원 정보를 조회합니다. 회원 정보는 회원 ID, 회원 전화번호를 쿼리 파라미터로 전달하여 조회할 수 있습니다.

### **기본 정보**

| Method | URL                                   | 인증 방식   |
| ------ | ------------------------------------- | ------- |
| GET    | <https://api.groobee.io/v2/users/sms> | API Key |

**요청 헤더**

| 이름           | 설명                             | 필수 |
| ------------ | ------------------------------ | -- |
| x-api-key    | x-api-key: ${x-api-key}        | O  |
| Content-Type | Content-Type: application/json | O  |

**쿼리 파라미터**

| 이름          | 타입     | 설명          | 필수  | 비고                     |
| ----------- | ------ | ----------- | --- | ---------------------- |
| memberId    | String | 조회 회원의 ID   | O/X | 둘 중 하나는 필수로 입력되어야 합니다. |
| phoneNumber | String | 조회 회원의 전화번호 | X/O |                        |

**응답**

응답은 그루비 API 공통응답 형식의 "processValue" 필드에 조회한 회원의 정보를 JSON 배열로 반환합니다.

| 이름          | 타입     | 설명                                                                                | 비고 |
| ----------- | ------ | --------------------------------------------------------------------------------- | -- |
| memberId    | String | 조회 회원의 ID                                                                         |    |
| phoneNumber | String | 조회 회원의 전화번호                                                                       |    |
| isReceive   | String | <p>조회한 회원의 SMS 수신 동의 여부</p><ul><li>"true": 수신 동의</li><li>"false": 수신 거부</li></ul> |    |
| name        | String | 조회 회원의 이름                                                                         |    |

{% hint style="warning" %}

* isReceive 필드에 대한 값 미전송 시 '수신 거부' 로 응답합니다.
* isReceive가 '수신 거부' 상태일 경우 브랜드 메시지(비친구 대상)와 SMS 발송만 제한되며, 그외 캠페인은 수신 거부 여부와 관계없이 발송 가능합니다.
* 회원 정보 저장/수정 시 name 필드는에 대한 값을 미전송할 경우 데이터가 없는 상태로 응답합니다.
  {% endhint %}

### **예제**

* **요청(회원 ID) 검색**

```
curl -X GET "https://api.groobee.io/v2/users/sms?memberId=${회원아이디}" \ 
        -H "x-api-key: ${x-api-key}" \
        -H "Content-Type": application/json
```

* **응답**

회원 ID로 조회 시 등록한 회원 ID의 목록이 출력됩니다.

※ 회원 API v2 에서는 phoneNumber 를 회원 정보의 유일 값으로 사용합니다.

```
{        "httpStatus": { 
            "code": "200",
            "reasonPhrase": "OK"
        },
        "processCode": "0",
        "processValue": [
            {
                "memberId": "groobee",
                "phoneNumber": "010-0000-0000",
                "isReceive": "false",
                "name": "그루비"
            },
            {
                "memberId": "groobee",
                "phoneNumber": "010-0000-0000",
                "isReceive": "false",
                "name": "그루비"
            },
            {
                "memberId": "groobee",
                "phoneNumber": "010-0000-0000",
                "isReceive": "false",
                "name": "그루비"
            }
        ]
}
```

* **요청(회원 전화번호) 검색**

```
curl -X GET "https://api.groobee.io/v2/users/sms?phoneNumber=${전화번호}" \
          -H "x-api-key: ${x-api-key}" \
          -H "Content-Type": application/json
```

* **응답**

전화번호로 조회 시 등록한 회원의 정보가 출력됩니다.

{% hint style="warning" %}
회원 API v2 에서는 phoneNumber 를 회원 정보의 유일 값으로 사용합니다.
{% endhint %}

```
{ 
        "httpStatus": {
            "code": "200",
            "reasonPhrase": "OK"
        },
        "processCode": "0",

        "processValue": [
            {
                "memberId": "plateer",
                "phoneNumber": "010-0000-0000",
                "isReceive": "false",
                "name": "플래티어"
            }
        ]
}
```

***

## **회원 정보 저장/수정**

### **설명**

회원 정보를 저장/수정 합니다. ‘저장/수정' 시 등록된 회원의 정보가 없으면 등록되고, 회원의 정보가 있으면 '전화번호’를 기준으로 회원의 정보가 변경됩니다.

{% hint style="warning" %}
회원 정보 저장 시 API v2 에서는 전화번호 중복 입력을 확인합니다.\
전송하는 정보에 전화번호가 중복되면 중복된 정보를 제외하고 입력됩니다.
{% endhint %}

### **기본 정보**

| Method | URL                                   | 인증 방식   |
| ------ | ------------------------------------- | ------- |
| POST   | <https://api.groobee.io/v2/users/sms> | API Key |

**요청 헤더**

| 이름           | 설명                             | 필수 |
| ------------ | ------------------------------ | -- |
| x-api-key    | x-api-key: ${x-api-key}        | O  |
| Content-Type | Content-Type: application/json | O  |

**요청 본문**

{% hint style="danger" %}
요청 본문으로 전송할 수 있는 최대 데이터 행은 1,000 개 입니다.\
1,000 개가 넘으면 오류를 반환합니다.
{% endhint %}

| 이름          | 타입     | 설명                     | 필수 | 비고                                                                            |
| ----------- | ------ | ---------------------- | -- | ----------------------------------------------------------------------------- |
| memberId    | String | 저장/수정 회원의 ID           | O  | -                                                                             |
| phoneNumber | String | 저장/수정 회원의 전화번호         | O  | 전화번호 형식: 휴대폰 번호 (구분기호 "-" 만 허용)                                               |
| isReceive   | String | 저장/수정 회원의 SMS 수신 동의 여부 | X  | <ul><li>“true": 수신 동의</li><li>"false": 수신 거부</li><li>기본 값 : "false"</li></ul> |
| name        | String | 저장/수정 회원의 이름           | X  | 제한 길이 20자                                                                     |

**응답**

회원 정보 '저장/수정' 응답은 성공/실패 시 모두 정상 응답하며 입력받은 회원 정보의 오류가 있으면 정상 데이터는 처리하고 오류 데이터 행을 오류코드와 함께 반환합니다.

| 이름             | 타입     | 설명                     | 비고                                                                                                                                                                  |
| -------------- | ------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| memberId       | String | 저장/수정 회원의 ID           | -                                                                                                                                                                   |
| phoneNumber    | String | 저장/수정 회원의 전화번호         | 전화번호 형식: 휴대폰 번호 (구분기호 "-" 만 허용)                                                                                                                                     |
| isReceive      | String | 저장/수정 회원의 SMS 수신 동의 여부 | <ul><li>“true": 수신 동의</li><li>"false": 수신 거부</li></ul>                                                                                                              |
| name           | String | 저장/수정 회원의 이름           |                                                                                                                                                                     |
| failureCode    | String | 입력한 행의 실패코드            | <ul><li>"F00" : 회원 ID가 없고 전화번호 형식 불일치</li><li>"F01" : 회원 ID가 없음</li><li>"F02" : 전화번호 형식 불일치</li><li>"F03" : 이름 길이 초과(제한 20자)</li><li>"F11" : 전화번호 중복 행 존재</li></ul> |
| failureMessage | String | 실패 코드에 대한 세부내용         |                                                                                                                                                                     |

{% hint style="warning" %}

* isReceive 필드에 대한 값 미전송 시 '수신 거부' 로 응답합니다.
* isReceive가 '수신 거부' 상태일 경우 브랜드 메시지(비친구 대상)와 SMS 발송만 제한되며, 그외 캠페인은 수신 거부 여부와 관계없이 발송 가능합니다.
* 회원 정보 저장/수정 시 name 필드는에 대한 값을 미전송할 경우 데이터가 없는 상태로 응답합니다.
  {% endhint %}

### **예제**

* **요청(회원 ID) 검색**

```
  curl -X POST "https://api.groobee.io/v2/users/sms" \ 
          -H "x-api-key: ${x-api-key}" \
          -H "Content-Type": application/json \
          -d '[
                {
                    "memberId": "groobee", 
                    "phoneNumber": "010-0000-0000", 
                    "isReceive": "true",
                    "name": "그루비"
              },
              {
                    "memberId": "plateer", 
                    "phoneNumber": "010-0000-0000", 
                    "isReceive": "true",
                    "name": "플래티어"
              }
            ]
```

* **응답(성공)**

```
{ 
      "httpStatus": { 
        "code": "200",
        "reasonPhrase": "OK"
      },
      "processCode": "0", 
      "processValue": [
      ]
}
```

* **응답(실패)**

데이터 오류가 있을 경우 실패 응답에 실패한 데이터 및 오류코드를 함께 응답합니다.

```
{
      "httpStatus":
          { "code": "200",
          "reasonPhrase": "OK"
      },
        "processCode": "0", 
        "processValue": [
            {
                "memberId": "",
                "phoneNumber": "010-0000-0000", 
                "isReceive": "true",
                "name": "그루비",
                "failureCode": "F01",
                "failureMessage": "memberId가 유효하지 않습니다"
            }      ]}
```

***

## **회원 정보 삭제**

### **설명**

회원 정보를 삭제합니다.

* 입력된 회원의 ID를 기준으로 요청한 회원의 정보를 모두 삭제합니다.
* POST 요청으로 수행되며, 쿼리 파라미터 'delete' 를 인자로 추가합니다.
* 삭제 시 입력되었던 회원의 정보는 복구할 수 없습니다.

### **기본 정보**

| Method | URL                                          | 인증 방식   |
| ------ | -------------------------------------------- | ------- |
| POST   | <https://api.groobee.io/v2/users/sms?delete> | API Key |

**요청 헤더**

| 이름           | 설명                             | 필수 |
| ------------ | ------------------------------ | -- |
| x-api-key    | x-api-key: ${x-api-key}        | O  |
| Content-Type | Content-Type: application/json | O  |

**쿼리 파라미터**

| 이름     | 타입 | 설명         | 필수 | 비고                    |
| ------ | -- | ---------- | -- | --------------------- |
| delete | -  | 삭제 명령 파라미터 | O  | 파라미터 값(value)이 없어도 동작 |

**요청 본문**

| 이름          | 타입     | 설명          | 필수 | 비고 |
| ----------- | ------ | ----------- | -- | -- |
| phoneNumber | String | 삭제할 회원의 아이디 | O  |    |

**응답**

회원정보 '삭제' 응답은 성공/실패 시 모두 정상 응답하며 입력받은 회원 정보의 오류가 있으면 정상 데이터는 처리하고 오류데이터 행을 오류코드와 함께 반환합니다.

| 이름          | 타입     | 설명           | 비고                               |
| ----------- | ------ | ------------ | -------------------------------- |
| memberId    | String | 삭제할 회원의 아이디  |                                  |
| failureCode | String | 입력한 행의 실패 코드 | "F02" : 전화번호가 누락 되었거나 형식에 맞지 않음. |

### **예제**

* **요청**

```
  curl -X POST "https://api.groobee.io/v2/users/sms" \ 
        -H "x-api-key: ${x-api-key}" \
        -H "Content-Type": application/json \
        -d '[
            {
              "phoneNumber": "010-0000-0000",
            },
            {
              "phoneNumber": "010-0000-0000",
            }
          ]
```

<br>

* **응답(성공)**

```
{
      "httpStatus": 
          { "code": "200",
          "reasonPhrase": "OK"
      },
      "processCode": "0", 
      "processValue": [
    ]
}
```

* **응답(실패)**

데이터 오류가 있을 경우 실패 응답에 실패한 데이터 및 오류코드를 함께 응답합니다.

```
{
      "httpStatus": 
          { "code": "200",
            "reasonPhrase": "OK"
      },
      "processCode": "0", 
      "processValue": [
          {
            "phoneNumber": "", 
            "failureCode": "F02",
            "failureMessage": "phoneNumber가 유효하지 않습니다"
          }
    ]
}
```

***

## **공통 사항**

### **processCode 코드값**

| 코드 값  | 상태 | 설명                         |
| ----- | -- | -------------------------- |
| 0     | 성공 | -                          |
| -1000 | 실패 | 요청 시 Header에 x-api-key 미존재 |
| -1001 | 실패 | 고객사 미존재                    |
| -1002 | 실패 | 고객사 미승인 상태 (승인 필요)         |
| -1003 | 실패 | 고객사 계약기간 만료                |
| -1004 | 실패 | 데이터 초과                     |
| -9997 | 실패 | 데이터가 올바르지 않습니다.            |
| -9998 | 실패 | http 관련 에러                 |
| -9999 | 실패 | 요청 API 서버 에러               |

| 코드 값  | 상태 | 설명                  |
| ----- | -- | ------------------- |
| -1005 | 실패 | 진행 중인 프로세스 있음       |
| -1006 | 실패 | 회원 ID가 올바르지 않습니다.   |
| -1007 | 실패 | 회원 전화번호가 올바르지 않습니다. |
| -1013 | 실패 | 회원 이름 길이 초과(20자 이하) |

<br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.groobee.ai/developer-guide/api-guide/member/v2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
