API truy vấn bài hát và lịch sử

Cập nhật 2026-09-18 · nhóm Suno-API

Trang này gồm ba endpoint truy vấn miễn phí:

Khả năng Method Endpoint
Truy vấn trạng thái và kết quả của một bài hát POST /api/music/query
Truy vấn các bài hát tài khoản hiện tại đã tạo GET /api/music/songs
Truy vấn tham số được lưu khi tạo bài hát GET /api/music/songs/:song_id

Nếu bạn dùng chế độ nhận biên nhận (accept_mode=async) ở endpoint tạo nhạc, thứ bạn có là số biên nhận chứ không phải ID bài hát. Hãy theo dõi tiến độ bằng GET /api/music/requests/{request_id} rồi quay lại các endpoint trên trang này khi đã có song_id thật. Xem "Chế độ nhận biên nhận" trong API tạo nhạc chế độ đơn giản.

Xác thực và phạm vi dữ liệu

Cả ba endpoint dùng chung một khóa API để xác thực:

Authorization: Bearer YOUR_API_KEY

Lịch sử bài hát được tách riêng theo user_id mà khóa API thuộc về. Nhiều khóa API tạo dưới cùng một tài khoản chính có thể đọc lịch sử của tài khoản đó, nhưng không đọc được bài hát của người dùng khác hay tài khoản sub-site khác.

Các endpoint lịch sử chỉ trả về bài hát đã tạo thật. Không bao gồm:


1. Truy vấn trạng thái tạo nhạc

Dùng để tra trạng thái hiện tại và kết quả cuối cùng theo một hoặc nhiều ID bài hát.

Endpoint: POST /api/music/query

Tính phí: Miễn phí.

Headers

Tham số Kiểu Bắt buộc Ghi chú
Authorization string có Bearer YOUR_API_KEY
Content-Type string có application/json

Tham số body

Tham số Kiểu Bắt buộc Mặc định Ghi chú
model string không suno-v6 Phiên bản mô hình
song_ids string có - ID bài hát, nhiều ID cách nhau bằng dấu phẩy

Ví dụ request

curl -X POST https://www.suno-api.io/api/music/query \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-v6",
    "song_ids": "clip_id_1,clip_id_2"
  }'

Ví dụ response

[
  {
    "song_id": "clip_id_1",
    "song_title": "Tiêu đề bài hát",
    "status": "completed",
    "audio_url": "https://example.com/audio.mp3",
    "video_url": "https://example.com/video.mp4",
    "cover_url": "https://example.com/cover.jpg",
    "lyrics": "Nội dung lời bài hát",
    "style_tags": "Mandopop, acoustic",
    "duration": 180.5,
    "model_version": "suno-v6",
    "created_at": "2026-05-21T10:00:00Z"
  }
]

Ghi chú tương thích

Tài liệu cũ có thể ghi song_ids dưới dạng mảng. Hiện nay nên dùng chuỗi cách nhau bằng dấu phẩy, đúng như cách endpoint thực sự được gọi.

song_ids phải là ID bài hát thật. ID chỗ giữ chỗ bắt đầu bằng pending: không phải song_id cuối cùng và không dùng được ở đây; chỉ truy vấn ID chỗ giữ chỗ có thể trả về mảng rỗng [].

model, model_version hoặc model_name của nền tảng trong response có thể giữ giá trị lịch sử. Tác vụ mới nên dùng suno-v6, suno-v6-wild hoặc suno-v6-mini; từ suno-v2 đến suno-v5-5 đã ngừng hỗ trợ, và việc thấy những tên này trong lịch sử không có nghĩa là vẫn gửi được mô hình đó.

Khi tác vụ đang ở trạng thái pending, submitted hoặc processing, audio_url, video_url và cover_url có thể rỗng — đó là bình thường với tác vụ chưa xong. Đừng chỉ dựa vào địa chỉ rỗng để kết luận thất bại; hãy dựa vào status và truy vấn lại khi trạng thái đã hoàn tất. Chỉ khi trạng thái hoàn tất mà địa chỉ vẫn rỗng mới nên liên hệ hỗ trợ kèm song_id.

⚠️ Địa chỉ âm thanh chỉ sống 7 ngày — hãy chuyển file kịp thời

audio_url, video_url (và các địa chỉ media khác như WAV) do endpoint này trả về được phục vụ từ lưu trữ đối tượng của nền tảng và mặc định hết hạn sau 7 ngày: file bị thu hồi và địa chỉ cũ trả 404.

  • Trong 7 ngày đó, hãy chuyển file sang kho của bạn; đừng coi địa chỉ này là link dài hạn.
  • Địa chỉ hết hạn không cần tạo lại bài hát và không bị tính phí lần nữa: gọi lại endpoint này (POST /api/music/query) để nhận địa chỉ mới còn hiệu lực của bài hát đó.

2. Truy vấn lịch sử bài hát của tài khoản

Liệt kê các bài hát do tài khoản chính của khóa API hiện tại tạo ra. Phù hợp để dựng danh sách bài hát, bộ chọn hoặc trang lịch sử của riêng bạn.

Endpoint: GET /api/music/songs

Tính phí: Miễn phí.

Tham số query

Tham số Kiểu Bắt buộc Mặc định Ghi chú
p integer không 1 Số trang, bắt đầu từ 1
page_size integer không 20 Số mục mỗi trang, tối đa 100
q string không - Tìm gần đúng theo tiêu đề, hoặc tìm chính xác theo ID bài hát đầy đủ
status string không - Lọc chính xác theo trạng thái, ví dụ completed, playable

Kết quả sắp xếp giảm dần theo created_at và ID bản ghi nội bộ, nên thứ tự phân trang luôn ổn định.

Cách tìm lại một lượt gửi bị timeout: các endpoint tạo nhạc không trả về phản hồi trung gian trước khi tiếp nhận. Nếu client timeout hoặc mất kết nối lúc gửi, đơn đó có thể đã được tiếp nhận và đang tạo. Hãy xem endpoint này (mới nhất trước): bài hát đã được tiếp nhận sẽ xuất hiện bình thường trong danh sách. Chỉ gửi lại sau khi đã xác nhận thật sự không có, để tránh trả tiền hai lần. Xem "Thời gian chờ và thiết lập timeout" trong Tổng quan API mới.

Ví dụ request

curl "https://www.suno-api.io/api/music/songs?p=1&page_size=20&status=completed" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ví dụ response

{
  "success": true,
  "message": "",
  "data": {
    "page": 1,
    "page_size": 20,
    "total": 42,
    "items": [
      {
        "song_id": "8e31b3c0-example-song-id",
        "title": "Thành phố trong đêm",
        "status": "completed",
        "generation_type": "custom_generate",
        "model": "suno-v6",
        "duration": 187.42,
        "audio_url": "https://example.com/audio.mp3",
        "image_url": "https://example.com/cover.jpg",
        "created_at": 1784000000,
        "completed_at": 1784000120
      }
    ]
  }
}

Các trường trả về

Trường Kiểu Ghi chú
song_id string ID bài hát thật, dùng được cho truy vấn chi tiết
title string Tiêu đề hiện tại, người dùng có thể đã đổi tên
status string Trạng thái hiện tại
generation_type string Kiểu tạo nhạc
model string Mô hình tạo nhạc
duration number Thời lượng âm thanh tính bằng giây
audio_url string Địa chỉ âm thanh; có thể rỗng khi chưa xong
image_url string Địa chỉ ảnh bìa; có thể rỗng
created_at integer Thời điểm tạo, timestamp Unix theo giây
completed_at integer Thời điểm hoàn tất, timestamp Unix theo giây; có thể không có khi chưa xong

Endpoint danh sách không trả về prompt, trường tính phí, thông tin tài khoản hay phản hồi thô. Khi cần prompt và tham số tạo nhạc, hãy gọi endpoint chi tiết bài hát.


3. Truy vấn tham số tạo nhạc

Tra prompt, phong cách, mô hình và bài hát nguồn mà nền tảng đã lưu khi tạo bài hát đó.

Endpoint: GET /api/music/songs/:song_id

Tính phí: Miễn phí.

Chỉ đọc được bài hát thuộc tài khoản chính của khóa API hiện tại. Bài hát của người dùng khác hoặc tài khoản sub-site khác đều được xử lý như "không tìm thấy bài hát".

Tham số đường dẫn

Tham số Kiểu Bắt buộc Ghi chú
song_id string có ID bài hát thật

Ví dụ request

curl "https://www.suno-api.io/api/music/songs/8e31b3c0-example-song-id" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ví dụ response

{
  "success": true,
  "message": "",
  "data": {
    "song_id": "8e31b3c0-example-song-id",
    "title": "Thành phố trong đêm",
    "status": "completed",
    "generation_type": "custom_generate",
    "model": "suno-v6",
    "duration": 187.42,
    "audio_url": "https://example.com/audio.mp3",
    "image_url": "https://example.com/cover.jpg",
    "video_url": "",
    "wav_url": "",
    "created_at": 1784000000,
    "completed_at": 1784000120,
    "client_request_id": "example-request-id",
    "client_request_index": 0,
    "parameters": {
      "prompt": "phố phường sau mưa, lời bài hát về cuộc gặp lại",
      "style_tags": "Mandopop, acoustic, warm vocal",
      "title": "Thành phố trong đêm",
      "model": "suno-v6",
      "generation_type": "custom_generate",
      "source_song_id": "",
      "source_audio_url": "",
      "custom_mode": null,
      "instrumental": null,
      "negative_tags": null,
      "vocal_gender": null,
      "lyrics_mode": null,
      "wait_audio": null,
      "style_weight": null,
      "weirdness_constraint": null
    },
    "parameter_retention": {
      "core_parameters_available": true,
      "extended_parameters_available": false,
      "sources": [
        "suno_tasks"
      ],
      "unavailable_fields": [
        "custom_mode",
        "instrumental",
        "negative_tags",
        "vocal_gender",
        "lyrics_mode",
        "wait_audio",
        "style_weight",
        "weirdness_constraint"
      ]
    }
  }
}

Các trường parameters

Trường Kiểu Ghi chú
prompt string Prompt tạo nhạc hoặc lời bài hát
style_tags string Thẻ phong cách
title string Tiêu đề tạo nhạc được lưu; tác vụ lịch sử thông thường có thể chỉ giữ tiêu đề hiện tại
model string Mô hình tạo nhạc
generation_type string Kiểu tạo nhạc
source_song_id string ID bài hát nguồn của tác vụ cover, kéo dài và tương tự
source_audio_url string Địa chỉ âm thanh nguồn
custom_mode boolean/null Có dùng chế độ tùy chỉnh không; null khi không được lưu
instrumental boolean/null Bài hát có phải nhạc không lời không; dữ liệu lịch sử hiện có thường không lưu riêng
negative_tags string/null Phong cách loại trừ
vocal_gender string/null Thiết lập giới tính giọng hát
lyrics_mode string/null Chế độ lời; dữ liệu lịch sử hiện có thường không lưu
wait_audio boolean/null Có chờ âm thanh đầy đủ không; dữ liệu lịch sử hiện có thường không lưu
style_weight number/null Trọng số phong cách
weirdness_constraint number/null Tham số sáng tạo / độ lạ

Trường prompt_view (xem prompt, thêm ngày 2026-09-28)

prompt_view là cấu trúc đã chuẩn hóa dành riêng cho "xem prompt": nó tổ chức dữ liệu thành các phần cố định theo kiểu tạo nhạc, để client không phải tự quyết định hiển thị trường nào. Đây là trường thuần bổ sung — các trường cũ (parameters, parameter_retention) giữ nguyên tên và ý nghĩa, và client không phân tích trường mới hoàn toàn không bị ảnh hưởng.

"prompt_view": {
  "type": "custom_generate",
  "type_label": "Chế độ chuyên nghiệp",
  "generation": {
    "model": "suno-v6", "max_mode": false, "duration": 182.4,
    "title": "Bốn giờ sáng#701f37", "title_base": "Bốn giờ sáng", "title_suffix": "701f37",
    "created_at": 1790421721
  },
  "inputs": {
    "user_text": "……", "user_text_kind": "lyrics",
    "user_style": "điện tử guochao, sub bass sâu, synth retro",
    "style_tags": "điện tử guochao, sub bass sâu, synth retro",
    "style_source": "user", "lyrics": "……",
    "negative_tags": "", "is_instrumental": false
  },
  "extended": {
    "vocal_gender": "m", "style_weight": 0.5, "audio_weight": 0.85,
    "weirdness_constraint": 0.5, "variety": 2, "lyrics_mode": "manual",
    "custom_mode": true
  },
  "reference": { "voice_name": "sv_40_34", "source_song_id": "", "source_title": "" },
  "retention": {
    "recorded_since": "2026-09-28", "missing_reason": "",
    "not_applicable_fields": ["audio_weight"]
  }
}
Trường Kiểu Ghi chú
type / type_label string Kiểu tạo nhạc gốc / nhãn hiển thị (tạo đơn giản, chế độ chuyên nghiệp, chế độ hiệu ứng âm thanh, tạo bằng giọng đã nhân bản…)
generation.model string Mô hình đã dùng
generation.max_mode bool Có bật Max Mode không
generation.duration number Thời lượng âm thanh (giây)
generation.title string Tiêu đề nguyên như đã lưu (có thể kèm hậu tố)
generation.title_base string Tiêu đề hiển thị đã bỏ hậu tố #xxxxxx ở cuối
generation.title_suffix string Chính hậu tố (không gồm #); rỗng khi không có
inputs.user_text string Nội dung người dùng nhập (mô tả hoặc lời, tùy kiểu)
inputs.user_text_kind string lyrics / description / cover_requirements
inputs.user_style string Phong cách do người dùng tự nhập (chế độ chuyên nghiệp, giọng, hiệu ứng)
inputs.style_tags string Phong cách cuối cùng được áp dụng
inputs.style_source string user = người dùng nhập; suno_derived = Suno suy ra từ mô tả
inputs.lyrics string Nội dung lời; rỗng khi không có, nhạc không lời là [Instrumental]
inputs.negative_tags string Phong cách loại trừ
inputs.is_instrumental bool Có phải nhạc không lời không
extended.* — Tham số mở rộng, xem bên dưới; trường không được lưu sẽ không xuất hiện
reference.voice_name string Tên giọng (chỉ có ở kiểu giọng; persona id nội bộ không trả về)
reference.source_song_id / source_title string Bài hát nguồn của tác vụ cover, kéo dài và tương tự
retention.recorded_since string Ngày bắt đầu lưu tham số mở rộng (2026-09-28)
retention.missing_reason string Vì sao không có tham số mở rộng; dữ liệu lịch sử là not_recorded_before_20260928
retention.not_applicable_fields string[] Tham số mà kiểu tạo nhạc đó vốn không cần (đừng hiển thị là "thiếu tham số")

Các trường có thể xuất hiện trong extended: vocal_gender, style_weight, audio_weight, weirdness_constraint, variety, lyrics_mode, custom_mode, cùng nhóm hiệu ứng âm thanh sound_type / sound_bpm / sound_key / sound_loop. Giá trị rỗng luôn không được trả về.

Ba quy tắc hiển thị (hãy làm theo, đừng tự suy đoán):

  1. Phân biệt nguồn phong cách: khi style_source=suno_derived, hiển thị là "phong cách (Suno suy ra từ mô tả của bạn)", đừng viết "phong cách bạn nhập";
  2. Prompt nội bộ không xuất hiện: kiểu cover bằng giọng chỉ trả về 【yêu cầu phong cách】/【yêu cầu cover】 do người dùng nhập; đoạn cấu trúc cố định chúng tôi ghép cho mô hình không xuất hiện ở bất kỳ trường nào (dữ liệu lịch sử cũng đã được làm sạch tương tự);
  3. Không đoán tham số không được lưu: nếu không có trong extended thì lúc đó không ghi lại — dùng retention để giải thích cho người dùng.

Ghi chú về lưu tham số

parameter_retention dùng để phân biệt "truyền rõ ràng giá trị rỗng" với "trường chưa từng được lưu trong lịch sử":

Bài hát lịch sử thông thường thường lưu prompt, phong cách, tiêu đề hiện tại, mô hình, kiểu tạo nhạc và bài hát nguồn, nhưng không lưu riêng toàn bộ tham số nâng cao. Nền tảng không bao giờ đoán giá trị thiếu từ generation_type.

Một số tác vụ nhạc mở rộng còn lưu prompt gốc, phong cách, tiêu đề, mô hình, cùng custom_mode, negative_tags, vocal_gender, style_weight và weirdness_constraint. Dù có bản ghi mở rộng, instrumental, lyrics_mode và wait_audio vẫn có thể không khôi phục được.

Tiêu đề bài hát có thể bị người dùng đổi sau đó. Khi tác vụ lịch sử thông thường không lưu riêng tiêu đề gốc, parameters.title có thể là tiêu đề hiện tại; khi có bản ghi tác vụ mở rộng, hệ thống ưu tiên tiêu đề tạo nhạc gốc được lưu ở đó.

Không tồn tại hoặc không có quyền

Lỗi nghiệp vụ dùng phong bì phản hồi thống nhất. Khi bài hát không tồn tại hoặc không thuộc tài khoản hiện tại:

{
  "success": false,
  "message": "song not found"
}

Lỗi nghiệp vụ này hiện trả về HTTP 200, nên hãy đánh giá kết quả qua trường success. Khóa API thiếu, không hợp lệ, hết hạn hoặc bị vô hiệu hóa sẽ trả về HTTP 401.

Ghi chú bảo mật

Các endpoint lịch sử và chi tiết không bao giờ trả về:

Tiếp theoAPI lời bài hát có mốc thời gian

Lấy khóa API

Tạo khóa API trong bảng điều khiển sau khi đăng ký. Mỗi lần tạo tốn 0,6 ¥ và trả về 2 bản nhạc, tải xuống không giới hạn và không cần số điện thoại.

Lấy khóa API Quay lại tổng quan