sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p2X-API-Key: sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p2GET /api/v1/classes/{classId}/missionsํ๋ผ๋ฏธํฐ | ํ์
| ์ค๋ช
| ์์ |
classId | string | ํด๋์ค ID | NP0hetJ3wyQKFtRnFeftmPiy8Dl2_2 |
ํค๋ | ๊ฐ | ํ์ |
X-API-Key | ๋ฐ๊ธ๋ฐ์ API ํค | โ
|
{
"success": true,
"data": {
"classId": "NP0hetJ3wyQKFtRnFeftmPiy8Dl2_2",
"classTotalPoints": 1820,
"missionSummary": {
"totalMissions": 4,
"achievedMissions": 2,
"pendingMissions": 2,
"achievementRate": 50,
"status": "in_progress",
"nextMission": {
"missionId": "mission_003",
"targetPoint": 2000,
"reward": "์ํ ๋ณด๊ธฐ",
"remainingPoints": 180
}
},
"missions": [
{
"missionId": "mission_001",
"targetPoint": 500,
"reward": "๊ฐ์ ๋ฐ์ด",
"achieved": true,
"achievedAt": "2026-03-20T02:10:00.000Z",
"createdAt": "2026-03-01T01:00:00.000Z",
"updatedAt": "2026-03-20T02:10:00.000Z"
},
{
"missionId": "mission_002",
"targetPoint": 1000,
"reward": "์์จ ๋์ด ์๊ฐ",
"achieved": true,
"achievedAt": "2026-03-25T02:10:00.000Z",
"createdAt": "2026-03-05T01:00:00.000Z",
"updatedAt": "2026-03-25T02:10:00.000Z"
},
{
"missionId": "mission_003",
"targetPoint": 2000,
"reward": "์ํ ๋ณด๊ธฐ",
"achieved": false,
"achievedAt": null,
"createdAt": "2026-03-10T01:00:00.000Z",
"updatedAt": null
}
]
},
"message": "ํ๊ธ ๋ฏธ์
ํํฉ ์กฐํ์ ์ฑ๊ณตํ์ต๋๋ค."
}ํ๋ | ํ์
| ์ค๋ช
|
classId | string | ํด๋์ค ID |
classTotalPoints | number | ํ๊ธ ์ ์ฒด ํ์์ ์ด ํฌ์ธํธ ํฉ๊ณ |
missionSummary | object | ๋ฏธ์
์์ฝ ์ ๋ณด |
missions | array | ๋ฏธ์
๋ชฉ๋ก |
ํ๋ | ํ์
| ์ค๋ช
|
totalMissions | number | ์ ์ฒด ๋ฏธ์
๊ฐ์ |
achievedMissions | number | ๋ฌ์ฑํ ๋ฏธ์
๊ฐ์ |
pendingMissions | number | ๋จ์ ๋ฏธ์
๊ฐ์ |
achievementRate | number | ๋ฌ์ฑ๋ฅ (0~100) |
status | string | empty, in_progress, completed |
nextMission | object or null | ๋ค์ ๋ชฉํ ๋ฏธ์
์ ๋ณด |
ํ๋ | ํ์
| ์ค๋ช
|
missionId | string | ๋ค์ ๋ฏธ์
ID |
targetPoint | number | ๋ชฉํ ํฌ์ธํธ |
reward | string | ๋ฌ์ฑ ๋ณด์ ์ค๋ช
|
remainingPoints | number | ๋ค์ ๋ชฉํ๊น์ง ๋จ์ ํฌ์ธํธ |
ํ๋ | ํ์
| ์ค๋ช
|
missionId | string | ๋ฏธ์
๋ฌธ์ ID |
targetPoint | number | ๋ชฉํ ํฌ์ธํธ |
reward | string | ๋ฌ์ฑ ๋ณด์ |
achieved | boolean | ๋ฌ์ฑ ์ฌ๋ถ |
achievedAt | string or null | ๋ฌ์ฑ ์๊ฐ |
createdAt | string or null | ์์ฑ ์๊ฐ |
updatedAt | string or null | ์์ ์๊ฐ |
{
"success": false,
"error": {
"code": "error_code",
"message": "์๋ฌ ๋ฉ์์ง",
"details": {}
}
}์ํ ์ฝ๋ | ์๋ฌ ์ฝ๋ | ์ค๋ช
| ํด๊ฒฐ ๋ฐฉ๋ฒ |
400 | invalid_class_id | ํด๋์ค ID๊ฐ ์ ๊ณต๋์ง ์์ | classId ํ์ธ |
401 | unauthorized | API ํค๊ฐ ์๊ฑฐ๋ ์ ํจํ์ง ์์ | API ํค์ ํค๋ ํ์ธ |
403 | forbidden | ํด๋น ํด๋์ค ์ ๊ทผ ๊ถํ ์์ | classId ๊ถํ ํ์ธ |
403 | insufficient_permissions | ํ๊ธ ๋ฏธ์
์กฐํ ๊ถํ์ด ์์ | readClassMissions ๊ถํ ํ์ธ |
404 | class_not_found | ํด๋์ค๋ฅผ ์ฐพ์ ์ ์์ | classId ํ์ธ |
429 | rate_limit_exceeded | ํธ์ถ ์ ํ ์ด๊ณผ | ์ ์ ํ ์ฌ์๋ |
500 | internal_error | ์๋ฒ ๋ด๋ถ ์ค๋ฅ | ์ ์ ํ ์ฌ์๋ |
{
"success": false,
"error": {
"code": "insufficient_permissions",
"message": "ํ๊ธ ๋ฏธ์
์กฐํ ๊ถํ์ด ์์ต๋๋ค.",
"details": {
"requiredPermission": "readClassMissions"
}
}
}curl -X GET \
"https://growndcard.com/api/v1/classes/NP0hetJ3wyQKFtRnFeftmPiy8Dl2_2/missions" \
-H "X-API-Key: sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p2"const fetch = require('node-fetch');
const API_KEY = 'sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p2';
const BASE_URL = 'https://growndcard.com';
const CLASS_ID = 'NP0hetJ3wyQKFtRnFeftmPiy8Dl2_2';
async function getClassMissionStatus() {
const response = await fetch(
`${BASE_URL}/api/v1/classes/${CLASS_ID}/missions`,
{
method: 'GET',
headers: {
'X-API-Key': API_KEY
}
}
);
const data = await response.json();
if (!response.ok) {
throw new Error(data.error?.message || 'API ํธ์ถ ์คํจ');
}
return data.data;
}
getClassMissionStatus()
.then(result => {
console.log('ํ๊ธ ์ด ํฌ์ธํธ:', result.classTotalPoints);
console.log('๋ฌ์ฑ๋ฅ :', result.missionSummary.achievementRate);
console.log('๋ค์ ๋ฏธ์
:', result.missionSummary.nextMission);
})
.catch(error => console.error('์๋ฌ:', error));import requests
API_KEY = 'sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p2'
BASE_URL = 'https://growndcard.com'
CLASS_ID = 'NP0hetJ3wyQKFtRnFeftmPiy8Dl2_2'
def get_class_mission_status():
response = requests.get(
f'{BASE_URL}/api/v1/classes/{CLASS_ID}/missions',
headers={
'X-API-Key': API_KEY
}
)
response.raise_for_status()
return response.json()['data']
result = get_class_mission_status()
print('ํ๊ธ ์ด ํฌ์ธํธ:', result['classTotalPoints'])
print('๋ฏธ์
๋ฌ์ฑ๋ฅ :', result['missionSummary']['achievementRate'])sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p2X-API-Key: sk_live_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p2GET /api/v1/classes/{classId}/missionsํ๋ผ๋ฏธํฐ | ํ์
| ์ค๋ช
| ์์ |
classId | string | ํด๋์ค ID | NP0hetJ3wyQKFtRnFeftmPiy8Dl2_2 |
ํค๋ | ๊ฐ | ํ์ |
X-API-Key | ๋ฐ๊ธ๋ฐ์ API ํค | โ
|
{
"success": true,
"data": {
"classId": "NP0hetJ3wyQKFtRnFeftmPiy8Dl2_2",
"classTotalPoints": 1820,
"missionSummary": {
"totalMissions": 4,
"achievedMissions": 2,
"pendingMissions": 2,
"achievementRate": 50,
"status": "in_progress",
"nextMission": {
"missionId": "mission_003",
"targetPoint": 2000,
"reward": "์ํ ๋ณด๊ธฐ",
"remainingPoints": 180
}
},
"missions": [
{
"missionId": "mission_001",
"targetPoint": 500,
"reward": "๊ฐ์ ๋ฐ์ด",
"achieved": true,
"achievedAt": "2026-03-20T02:10:00.000Z",
"createdAt": "2026-03-01T01:00:00.000Z",
"updatedAt": "2026-03-20T02:10:00.000Z"
},
{
"missionId": "mission_002",
"targetPoint": 1000,
"reward": "์์จ ๋์ด ์๊ฐ",
"achieved": true,
"achievedAt": "2026-03-25T02:10:00.000Z",
"createdAt": "2026-03-05T01:00:00.000Z",
"updatedAt": "2026-03-25T02:10:00.000Z"
},
{
"missionId": "mission_003",
"targetPoint": 2000,
"reward": "์ํ ๋ณด๊ธฐ",
"achieved": false,
"achievedAt": null,
"createdAt": "2026-03-10T01:00:00.000Z",
"updatedAt": null
}
]
},
"message": "ํ๊ธ ๋ฏธ์
ํํฉ ์กฐํ์ ์ฑ๊ณตํ์ต๋๋ค."
}ํ๋ | ํ์
| ์ค๋ช
|
classId | string | ํด๋์ค ID |
classTotalPoints | number | ํ๊ธ ์ ์ฒด ํ์์ ์ด ํฌ์ธํธ ํฉ๊ณ |
missionSummary | object | ๋ฏธ์
์์ฝ ์ ๋ณด |
missions | array | ๋ฏธ์
๋ชฉ๋ก |
ํ๋ | ํ์
| ์ค๋ช
|
totalMissions | number | ์ ์ฒด ๋ฏธ์
๊ฐ์ |
achievedMissions | number | ๋ฌ์ฑํ ๋ฏธ์
๊ฐ์ |
pendingMissions | number | ๋จ์ ๋ฏธ์
๊ฐ์ |
achievementRate | number | ๋ฌ์ฑ๋ฅ (0~100) |
status | string | empty, in_progress, completed |