Attribution
Always display the provider. When source is Spicy Lyrics, also link the uploader and the maker. Those fields are absent for other sources; do not render empty attribution.
Using this API requires displaying attribution. What you display is
conditional on the source field, so this cannot be hardcoded.
The rule
Always display the provider name. When
sourceisspicy_lyrics, also link the uploader and the maker. Those fields are absent for other sources; do not render empty attribution.
That is the whole rule. The rest of this page is why, and what it looks like.
This is a binding condition, not a convention: section 6 of the Terms of Service makes this page part of the terms you accept when you create an account. Community syncs reach you under a licence from the people who made them, and credit is what they asked for in return.
Why it is conditional
Community syncs are made by people. The uploader and the maker are credited because they did the work — that credit is the point, not a formality. Those fields therefore exist only on community responses. Commercial sources have a provider and nothing else to credit.
A consumer who hardcodes attribution rendering gets it wrong in one of two directions, and both are bad:
- Render uploader and maker unconditionally, and every non-community response shows an empty or broken credit line.
- Render only the provider, and the people who made the sync you are showing get no credit at all.
Response shape per source
source: "spicy_lyrics"
{
"Body": {
"Type": "Syllable",
"SongWriters": [
"Stefani Joanne Angelina Germanotta",
"Nādir Ḵayyāṭ"
],
"StartTime": 7.357,
"Content": [...],
"EndTime": 234.731,
"id": "1QV6tiMFM6fSOKOGLMHYYg",
"UploadAttribution": {
"Uploader": {
"id": "790942393255329803",
"username": "spikerko",
"avatar": "https://cdn.discordapp.com/avatars/790942393255329803/bb0b32161c04dc75bd06a39f13718a44.webp?size=256",
"hasProfileBanner": true,
"url": "https://spicylyrics.org/uid/790942393255329803"
},
"Maker": {
"id": "816650334255579137",
"username": "gc",
"avatar": "https://cdn.discordapp.com/avatars/816650334255579137/03ec15a143788b3ba3f2549982c2b0ab.webp?size=256",
"hasProfileBanner": false,
"url": "https://spicylyrics.org/uid/816650334255579137"
}
},
"source": "spicy_lyrics"
},
"Status": 200,
"Type": "object"
}Display: the provider, and the uploader, and the maker. Link them where
a url is given.
source: "apple_music"
{
"Body": {
"Type": "Syllable",
"SongWriters": [
"Amala Zandile Dlamini",
"Andrew Wells",
"Anthony Rossomando",
"Rachel Keen"
],
"StartTime": 1.358,
"Content": [...],
"EndTime": 228.888,
"id": "7KNmIjcmGJIBrhP2s5Vioe",
"source": "apple_music"
},
"Status": 200,
"Type": "object"
}Display: the provider only.
source: "spotify"
{
"Body": {
"Type": "Line",
"StartTime": 10.81,
"EndTime": 183.44,
"id": "2WKGGQ6UmyUZGZgRJyEROB",
"Content": [...],
"source": "spotify"
},
"Status": 200,
"Type": "object"
}Display: the provider only.
Where it has to appear
Wherever the lyrics appear. If lyrics are on screen, the attribution for that response is on screen too (e.g. at the bottom), not on an about page, not in a tooltip nobody opens. It can be small and quiet. It cannot be absent.
Sync sources
One endpoint returns the best available sync, chosen by a documented hierarchy. The source field tells you which one answered, and that decides your attribution.
Keys
If your code runs on a server you control, use the secret key. If it ships to users, use a client key with an origin allowlist.