Kaito Music API là một RESTful API cung cấp các chức năng:
- Quản lý bài hát (upload, edit, delete, search)
- Quản lý tài khoản người dùng
- Quản lý comment
- Quản lý playlist
- Quản lý yêu thích
- Lịch sử phát nhạc
Live Demo: https://kaito-music.vercel.app
GitHub: https://github.com/phuockaito/kaito-music.cf
Hầu hết các API yêu cầu authentication thông qua JWT token.
- Đăng ký/Đăng nhập để nhận
accessToken - Gửi token trong header của mỗi request:
Authorization: Bearer {accessToken}Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
- Access Token: 30 ngày
- Refresh Token: 30 ngày
https://api-kaito-music.vercel.app/api
# hoặc
https://v2-api-kaito-music.vercel.app/api
POST /api/account/register
Content-Type: application/jsonRequest Body:
{
"userName": "username",
"email": "user@example.com",
"password": "password123"
}Response:
{
"accessToken": "jwt_token_here",
"data": {
"_id": "user_id",
"user_name": "username",
"email": "user@example.com",
"image": "avatar_url",
"sum_comment": 0,
"sum_list_music": 0,
"sum_upload": 0,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
}Validation:
- Email phải hợp lệ
- Username: 1-30 ký tự
- Password: tối thiểu 8 ký tự
Ví dụ với cURL:
curl -X POST https://api-kaito-music.vercel.app/api/account/register \
-H "Content-Type: application/json" \
-d '{
"userName": "testuser",
"email": "test@example.com",
"password": "password123"
}'POST /api/account/login
Content-Type: application/jsonRequest Body:
{
"email": "user@example.com",
"password": "password123"
}Response: Tương tự như đăng ký
Ví dụ với cURL:
curl -X POST https://api-kaito-music.vercel.app/api/account/login \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"password": "password123"
}'POST /api/account/google-login
Content-Type: application/jsonRequest Body:
{
"token": "google_access_token"
}Ví dụ với cURL:
curl -X POST https://api-kaito-music.vercel.app/api/account/google-login \
-H "Content-Type: application/json" \
-d '{
"token": "ya29.a0AfH6SMC..."
}'GET /api/account/profile
Authorization: Bearer {accessToken}Response:
{
"accessToken": "new_jwt_token",
"data": {
"_id": "user_id",
"user_name": "username",
"email": "user@example.com",
"image": "avatar_url",
"sum_comment": 5,
"sum_list_music": 3,
"sum_upload": 10,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
}Ví dụ với cURL:
curl -X GET https://api-kaito-music.vercel.app/api/account/profile \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"GET /api/account/listResponse:
[
{
"_id": "user_id",
"user_name": "username",
"email": "user@example.com",
"image": "avatar_url",
...
}
]GET /api/account/get-music-authorization-token?_page=1&_limit=20
Authorization: Bearer {accessToken}Query Parameters:
_page: Số trang (mặc định: 1)_limit: Số kết quả mỗi trang (mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 50
},
"data": [...]
}POST /api/music/create
Authorization: Bearer {accessToken}
Content-Type: multipart/form-dataRequest Body (Form Data):
src_music: File (audio file - required)image_music: File (image file - required)name_music: String (required)name_singer: String (required)category: String (required)subscribe: String (optional)link_mv: String (optional, YouTube URL)
Response:
{
"message": "Create music success",
"data": {
"_id": "music_id",
"name_music": "Song Name",
"name_singer": "Singer Name",
"category": "Pop",
"src_music": "audio_url",
"image_music": "image_url",
...
}
}Ví dụ với JavaScript (FormData):
const formData = new FormData();
formData.append("src_music", audioFile);
formData.append("image_music", imageFile);
formData.append("name_music", "Song Name");
formData.append("name_singer", "Singer Name");
formData.append("category", "Pop");
formData.append("link_mv", "https://youtube.com/watch?v=...");
const response = await fetch(
"https://api-kaito-music.vercel.app/api/music/create",
{
method: "POST",
headers: {
Authorization: `Bearer ${accessToken}`,
},
body: formData,
}
);PUT /api/music/edit
Authorization: Bearer {accessToken}
Content-Type: multipart/form-dataRequest Body (Form Data):
_id: String (required)src_music: File (optional)image_music: File (optional)name_music: String (optional)name_singer: String (optional)category: String (optional)subscribe: String (optional)link_mv: String (optional)
GET /api/music/get-by-id?_id={music_id}Query Parameters:
_id: ID của bài hát (required)
Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/get-by-id?_id=507f1f77bcf86cd799439011"GET /api/music/get-singer-name?_singer={singer_name}&_page=1&_limit=20Query Parameters:
_singer: Tên ca sĩ (required)_page: Số trang (optional, mặc định: 1)_limit: Số kết quả mỗi trang (optional, mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 50
},
"data": [
{
"_id": "music_id",
"name_music": "Song Name",
"name_singer": "Singer Name",
...
}
]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/get-singer-name?_singer=Taylor%20Swift&_page=1&_limit=10"GET /api/music/get-music-name?_name={music_name}Query Parameters:
_name: Tên bài hát (required)
Response:
{
"message": "success",
"data": {
"_id": "music_id",
"name_music": "Song Name",
"name_singer": "Singer Name",
...
}
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/get-music-name?_name=Shape%20Of%20You"GET /api/music/get-category?category={category_name}&_page=1&_limit=20Query Parameters:
category: Tên danh mục (required)_page: Số trang (optional, mặc định: 1)_limit: Số kết quả mỗi trang (optional, mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 50
},
"data": [...]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/get-category?category=Pop&_page=1&_limit=10"GET /api/music/new-music?_page=1&_limit=20Query Parameters:
_page: Số trang (optional, mặc định: 1)_limit: Số kết quả mỗi trang (optional, mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 100
},
"data": [...]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/new-music?_page=1&_limit=10"GET /api/music/trending?_page=1&_limit=20Query Parameters:
_page: Số trang (optional, mặc định: 1)_limit: Số kết quả mỗi trang (optional, mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 100
},
"data": [...]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/trending?_page=1&_limit=10"GET /api/music/favorite?_page=1&_limit=20Query Parameters:
_page: Số trang (optional, mặc định: 1)_limit: Số kết quả mỗi trang (optional, mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 100
},
"data": [...]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/favorite?_page=1&_limit=10"GET /api/music/top-views?_type=million&_page=1&_limit=20Query Parameters:
_type: Loại top (optional, mặc định: "million")million: Top bài hát có lượt xem từ 1 triệu đến 999 triệubillion: Top bài hát có lượt xem từ 1 tỷ trở lên
_page: Số trang (optional, mặc định: 1)_limit: Số kết quả mỗi trang (optional, mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 50
},
"data": [...]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/top-views?_type=million&_page=1&_limit=10"GET /api/music/top-favorite?_type=million&_page=1&_limit=20Query Parameters:
_type: Loại top (optional, mặc định: "million")million: Top bài hát có lượt yêu thích từ 1 triệu đến 999 triệubillion: Top bài hát có lượt yêu thích từ 1 tỷ trở lên
_page: Số trang (optional, mặc định: 1)_limit: Số kết quả mỗi trang (optional, mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 50
},
"data": [...]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/music/top-favorite?_type=million&_page=1&_limit=10"GET /api/music/get-upload
Authorization: Bearer {accessToken}GET /api/music/get-upload/search?query={search_term}
Authorization: Bearer {accessToken}Query Parameters:
query: Từ khóa tìm kiếm (required)
DELETE /api/music/delete-by-id?_id={music_id}
Authorization: Bearer {accessToken}Ví dụ:
curl -X DELETE "https://api-kaito-music.vercel.app/api/music/delete-by-id?_id=507f1f77bcf86cd799439011" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"GET /api/search?query={search_term}&_page=1&_limit=20Query Parameters:
query: Từ khóa tìm kiếm (tìm theo tên bài hát, ca sĩ, category, subscribe)_page: Số trang (mặc định: 1)_limit: Số kết quả mỗi trang (mặc định: 20)
Response:
{
"pagination": {
"_limit": 20,
"_page": 1,
"_total": 100
},
"data": [
{
"_id": "music_id",
"name_music": "Song Name",
"name_singer": "Singer Name",
"category": "Pop",
...
}
]
}Ví dụ:
curl -X GET "https://api-kaito-music.vercel.app/api/search?query=nhac&_page=1&_limit=10"POST /api/comment/create
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"id_music": "music_id",
"content": "Comment content",
"id_reply": "comment_id" // optional, để reply comment
}Response:
{
"message": "comment created",
"data": {
"_id": "comment_id",
"id_music": "music_id",
"id_account": "user_id",
"content": "Comment content",
"createdAt": "2024-01-01T00:00:00.000Z",
...
}
}Ví dụ:
curl -X POST https://api-kaito-music.vercel.app/api/comment/create \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id_music": "507f1f77bcf86cd799439011",
"content": "Great song!"
}'GET /api/comment/get-by-id-music?id_music={music_id}Query Parameters:
id_music: ID của bài hát (required)
GET /api/comment/get-list-comment-authorization-tokenPUT /api/comment/update-comment-by-id
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"_id": "comment_id",
"content": "Updated comment content"
}DELETE /api/comment/delete-by-id?_id={comment_id}
Authorization: Bearer {accessToken}GET /api/list-music/get-list
Authorization: Bearer {accessToken}Response:
[
{
"_id": "playlist_id",
"name_list_music": "My Playlist",
"id_account": "user_id",
"list_music": [...],
...
}
]POST /api/list-music/create
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"name_list_music": "Playlist Name"
}Ví dụ:
curl -X POST https://api-kaito-music.vercel.app/api/list-music/create \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name_list_music": "My Favorite Songs"
}'GET /api/list-music/get-by-id?_id={playlist_id}
Authorization: Bearer {accessToken}PUT /api/list-music/add-list-music
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"_id": "playlist_id",
"id_music": "music_id"
}DELETE /api/list-music/delete-music
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"_id": "playlist_id",
"id_music": "music_id"
}DELETE /api/list-music/delete-list-music?_id={playlist_id}
Authorization: Bearer {accessToken}PUT /api/list-music/update-name-list-music
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"_id": "playlist_id",
"name_list_music": "New Playlist Name"
}POST /api/favorite/create
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"idMusic": "music_id"
}Response:
{
"message": "Create favorite success",
"data": {
"_id": "music_id",
"name_music": "Song Name",
"favorite": 10,
...
}
}Ví dụ:
curl -X POST https://api-kaito-music.vercel.app/api/favorite/create \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"idMusic": "507f1f77bcf86cd799439011"
}'GET /api/favorite/get-authorization-token
Authorization: Bearer {accessToken}GET /api/favorite/account
Authorization: Bearer {accessToken}GET /api/favorite/listDELETE /api/favorite/delete-by-id?_id={favorite_id}
Authorization: Bearer {accessToken}POST /api/play-history/create
Authorization: Bearer {accessToken}
Content-Type: application/jsonRequest Body:
{
"id_music": "music_id"
}Ví dụ:
curl -X POST https://api-kaito-music.vercel.app/api/play-history/create \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id_music": "507f1f77bcf86cd799439011"
}'GET /api/play-history/get-by-token
Authorization: Bearer {accessToken}Response:
[
{
"_id": "history_id",
"id_music": "music_id",
"id_account": "user_id",
"music": {...},
"createdAt": "2024-01-01T00:00:00.000Z",
...
}
]// Đăng nhập
const login = async (email, password) => {
const response = await fetch(
"https://api-kaito-music.vercel.app/api/account/login",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ email, password }),
}
);
const data = await response.json();
localStorage.setItem("accessToken", data.accessToken);
return data;
};
// Lấy profile
const getProfile = async () => {
const token = localStorage.getItem("accessToken");
const response = await fetch(
"https://api-kaito-music.vercel.app/api/account/profile",
{
headers: {
Authorization: `Bearer ${token}`,
},
}
);
return await response.json();
};
// Tìm kiếm bài hát
const searchMusic = async (query, page = 1, limit = 20) => {
const response = await fetch(
`https://api-kaito-music.vercel.app/api/search?query=${encodeURIComponent(
query
)}&_page=${page}&_limit=${limit}`
);
return await response.json();
};
// Upload bài hát
const uploadMusic = async (formData) => {
const token = localStorage.getItem("accessToken");
const response = await fetch(
"https://api-kaito-music.vercel.app/api/music/create",
{
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
body: formData,
}
);
return await response.json();
};import axios from "axios";
const api = axios.create({
baseURL: "https://api-kaito-music.vercel.app/api",
});
// Thêm token vào mọi request
api.interceptors.request.use((config) => {
const token = localStorage.getItem("accessToken");
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// Đăng nhập
const login = async (email, password) => {
const { data } = await api.post("/account/login", { email, password });
localStorage.setItem("accessToken", data.accessToken);
return data;
};
// Upload bài hát
const uploadMusic = async (formData) => {
const { data } = await api.post("/music/create", formData, {
headers: {
"Content-Type": "multipart/form-data",
},
});
return data;
};
// Tạo comment
const createComment = async (idMusic, content) => {
const { data } = await api.post("/comment/create", {
id_music: idMusic,
content: content,
});
return data;
};- Tất cả các file upload sẽ được lưu trên Cloudinary
- JWT token có thời hạn 30 ngày
- API hỗ trợ CORS cho tất cả các origin
- Response được nén bằng compression middleware
- Database sử dụng MongoDB với Mongoose ODM
- File upload hỗ trợ định dạng: jpeg, jpg, png, mpeg, gif
400: Bad Request - Dữ liệu không hợp lệ401: Unauthorized - Token không hợp lệ hoặc thiếu404: Not Found - Không tìm thấy resource500: Internal Server Error - Lỗi server
ISC
Phuoc Kaito
- GitHub: @phuockaito
- Facebook: PhuocKaito1410