cURL
curl --request POST \
--url https://api.recoupable.com/api/songs \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"songs": [
{
"isrc": "<string>",
"name": "<string>",
"album": "<string>",
"notes": "<string>",
"artists": [
"<string>"
]
}
]
}
'import requests
url = "https://api.recoupable.com/api/songs"
payload = { "songs": [
{
"isrc": "<string>",
"name": "<string>",
"album": "<string>",
"notes": "<string>",
"artists": ["<string>"]
}
] }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
songs: [
{
isrc: '<string>',
name: '<string>',
album: '<string>',
notes: '<string>',
artists: ['<string>']
}
]
})
};
fetch('https://api.recoupable.com/api/songs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.recoupable.com/api/songs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'songs' => [
[
'isrc' => '<string>',
'name' => '<string>',
'album' => '<string>',
'notes' => '<string>',
'artists' => [
'<string>'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.recoupable.com/api/songs"
payload := strings.NewReader("{\n \"songs\": [\n {\n \"isrc\": \"<string>\",\n \"name\": \"<string>\",\n \"album\": \"<string>\",\n \"notes\": \"<string>\",\n \"artists\": [\n \"<string>\"\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.recoupable.com/api/songs")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"songs\": [\n {\n \"isrc\": \"<string>\",\n \"name\": \"<string>\",\n \"album\": \"<string>\",\n \"notes\": \"<string>\",\n \"artists\": [\n \"<string>\"\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.com/api/songs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"songs\": [\n {\n \"isrc\": \"<string>\",\n \"name\": \"<string>\",\n \"album\": \"<string>\",\n \"notes\": \"<string>\",\n \"artists\": [\n \"<string>\"\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"songs": [
{
"isrc": "<string>",
"name": "<string>",
"album": "<string>",
"notes": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"artists": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"timestamp": 123
}
]
}
],
"error": "<string>"
}{
"status": "error",
"error": "<string>"
}Songs & Catalogs
Create Songs
Bulk create or fetch songs by ISRC. For each song, the API attempts to look up metadata via internal search. If no data is found, optional fallback fields (name, album, notes, artists) are used.
POST
/
api
/
songs
cURL
curl --request POST \
--url https://api.recoupable.com/api/songs \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"songs": [
{
"isrc": "<string>",
"name": "<string>",
"album": "<string>",
"notes": "<string>",
"artists": [
"<string>"
]
}
]
}
'import requests
url = "https://api.recoupable.com/api/songs"
payload = { "songs": [
{
"isrc": "<string>",
"name": "<string>",
"album": "<string>",
"notes": "<string>",
"artists": ["<string>"]
}
] }
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
songs: [
{
isrc: '<string>',
name: '<string>',
album: '<string>',
notes: '<string>',
artists: ['<string>']
}
]
})
};
fetch('https://api.recoupable.com/api/songs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.recoupable.com/api/songs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'songs' => [
[
'isrc' => '<string>',
'name' => '<string>',
'album' => '<string>',
'notes' => '<string>',
'artists' => [
'<string>'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.recoupable.com/api/songs"
payload := strings.NewReader("{\n \"songs\": [\n {\n \"isrc\": \"<string>\",\n \"name\": \"<string>\",\n \"album\": \"<string>\",\n \"notes\": \"<string>\",\n \"artists\": [\n \"<string>\"\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.recoupable.com/api/songs")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"songs\": [\n {\n \"isrc\": \"<string>\",\n \"name\": \"<string>\",\n \"album\": \"<string>\",\n \"notes\": \"<string>\",\n \"artists\": [\n \"<string>\"\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.recoupable.com/api/songs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"songs\": [\n {\n \"isrc\": \"<string>\",\n \"name\": \"<string>\",\n \"album\": \"<string>\",\n \"notes\": \"<string>\",\n \"artists\": [\n \"<string>\"\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"songs": [
{
"isrc": "<string>",
"name": "<string>",
"album": "<string>",
"notes": "<string>",
"updated_at": "2023-11-07T05:31:56Z",
"artists": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"timestamp": 123
}
]
}
],
"error": "<string>"
}{
"status": "error",
"error": "<string>"
}This endpoint performs bulk create/fetch operations. For each song, the API attempts to look up metadata via internal search. If no data is found, optional fallback fields (name, album, notes, artists) are used.
Authorizations
Your Recoup API key. Learn more.
Body
application/json
Array of songs to create or fetch
Array of song inputs for bulk create/fetch
Show child attributes
Show child attributes
⌘I
