{
  "openapi": "3.1.0",
  "info": {
    "title": "rqive.studio public API",
    "version": "1.0.0",
    "summary": "Read-only catalogue and community data for the music producer rqive.",
    "description": "Public, unauthenticated, read-only JSON endpoints behind rqive.studio. Use them to list rqive's released tracks and releases with their verified Spotify, SoundCloud and Bandcamp links, or to read public likes and comments on a track. No API key is needed. Requests are rate limited per network address (about 120 reads per minute); a 429 response includes Retry-After. Writing likes, posting comments and support payments are site-only actions and are not part of this API. All endpoints are intentionally public: no authentication is used or accepted.",
    "contact": {
      "name": "rqive",
      "url": "https://www.instagram.com/therqive/"
    }
  },
  "externalDocs": {
    "description": "API overview",
    "url": "https://rqive.studio/developers.html"
  },
  "servers": [
    {
      "url": "https://rqive.studio"
    }
  ],
  "paths": {
    "/api/catalog": {
      "get": {
        "operationId": "getCatalog",
        "summary": "List rqive's tracks and releases",
        "description": "Returns the verified catalogue: the artist's platform identities, releases and every track with its title, artists, release, length, release date, cover art and links on Spotify, SoundCloud and Bandcamp. The catalogue refreshes from the platforms every ten minutes and keeps the last good data if a platform fails.",
        "responses": {
          "200": {
            "description": "The catalogue.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "artist",
                    "releases",
                    "tracks"
                  ],
                  "properties": {
                    "version": {
                      "type": "integer"
                    },
                    "verifiedAt": {
                      "type": "string",
                      "format": "date-time",
                      "description": "When the seed catalogue was last verified."
                    },
                    "checkedAt": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "format": "date-time",
                      "description": "When the platforms were last checked."
                    },
                    "stale": {
                      "type": "boolean",
                      "description": "True when the latest platform check failed and last good data is served."
                    },
                    "artist": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "instagram": {
                          "type": "string",
                          "format": "uri"
                        },
                        "spotifyId": {
                          "type": "string"
                        },
                        "soundcloudId": {
                          "type": "integer"
                        },
                        "bandcampId": {
                          "type": "integer"
                        }
                      }
                    },
                    "releases": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "title"
                        ],
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "artists": {
                            "type": "string"
                          },
                          "date": {
                            "type": "string",
                            "description": "Release date (YYYY-MM-DD)."
                          },
                          "art": {
                            "type": "string",
                            "description": "Cover art URL, absolute or relative to https://rqive.studio/."
                          },
                          "spotify": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Spotify album ID."
                          },
                          "bandcamp": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uri"
                          }
                        }
                      }
                    },
                    "tracks": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "title",
                          "artists",
                          "sources"
                        ],
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "Stable track ID, used as the comment thread."
                          },
                          "title": {
                            "type": "string"
                          },
                          "artists": {
                            "type": "string",
                            "description": "Comma-separated artist names."
                          },
                          "release": {
                            "type": "string",
                            "description": "Release title."
                          },
                          "releaseId": {
                            "type": "string"
                          },
                          "number": {
                            "type": "integer",
                            "description": "Track number on its release."
                          },
                          "ms": {
                            "type": "integer",
                            "description": "Length in milliseconds."
                          },
                          "date": {
                            "type": "string",
                            "description": "Release date."
                          },
                          "art": {
                            "type": "string",
                            "description": "Cover art URL."
                          },
                          "explicit": {
                            "type": "boolean"
                          },
                          "sources": {
                            "type": "object",
                            "description": "Links on each platform the track is on.",
                            "properties": {
                              "spotify": {
                                "type": "object",
                                "required": [
                                  "url"
                                ],
                                "properties": {
                                  "id": {
                                    "type": [
                                      "string",
                                      "integer"
                                    ],
                                    "description": "The platform's track ID."
                                  },
                                  "url": {
                                    "type": "string",
                                    "format": "uri",
                                    "description": "Public track page."
                                  },
                                  "embeddable": {
                                    "type": "boolean"
                                  }
                                }
                              },
                              "soundcloud": {
                                "type": "object",
                                "required": [
                                  "url"
                                ],
                                "properties": {
                                  "id": {
                                    "type": [
                                      "string",
                                      "integer"
                                    ],
                                    "description": "The platform's track ID."
                                  },
                                  "url": {
                                    "type": "string",
                                    "format": "uri",
                                    "description": "Public track page."
                                  },
                                  "embeddable": {
                                    "type": "boolean"
                                  }
                                }
                              },
                              "bandcamp": {
                                "type": "object",
                                "required": [
                                  "url"
                                ],
                                "properties": {
                                  "id": {
                                    "type": [
                                      "string",
                                      "integer"
                                    ],
                                    "description": "The platform's track ID."
                                  },
                                  "url": {
                                    "type": "string",
                                    "format": "uri",
                                    "description": "Public track page."
                                  },
                                  "embeddable": {
                                    "type": "boolean"
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this network address. Wait for the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Short error message."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [],
        "parameters": []
      }
    },
    "/api/status": {
      "get": {
        "operationId": "getServiceStatus",
        "summary": "Check which site services are available",
        "description": "Reports whether optional one-time support payments and shared likes/comments are currently available, with the accepted support amount range in AUD.",
        "responses": {
          "200": {
            "description": "Service availability.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "payments",
                    "social"
                  ],
                  "properties": {
                    "payments": {
                      "type": "object",
                      "properties": {
                        "enabled": {
                          "type": "boolean",
                          "description": "Whether optional one-time support is available."
                        },
                        "mode": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "enum": [
                            "live",
                            "test",
                            null
                          ]
                        },
                        "currency": {
                          "type": "string",
                          "const": "AUD"
                        },
                        "min": {
                          "type": "number",
                          "description": "Smallest support amount."
                        },
                        "max": {
                          "type": "number",
                          "description": "Largest support amount."
                        }
                      }
                    },
                    "social": {
                      "type": "boolean",
                      "description": "Whether shared likes and comments are available."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this network address. Wait for the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Short error message."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [],
        "parameters": []
      }
    },
    "/api/social/likes": {
      "get": {
        "operationId": "getLikeCounts",
        "summary": "Get like counts for every track",
        "description": "Returns the public like count for each track ID that has at least one like. Track IDs match the id field of tracks in getCatalog.",
        "responses": {
          "200": {
            "description": "Like counts by track ID.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "counts"
                  ],
                  "properties": {
                    "counts": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      },
                      "description": "Like count by track ID."
                    },
                    "mine": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Used by the site's player; empty for API callers."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this network address. Wait for the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Short error message."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The service is temporarily unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Short error message."
                    }
                  }
                }
              }
            }
          }
        },
        "security": [],
        "parameters": []
      }
    },
    "/api/social/comments": {
      "get": {
        "operationId": "listTrackComments",
        "summary": "List public comments on a track",
        "description": "Returns up to 100 visible comments on one track, newest first. Use a track id from getCatalog as the thread.",
        "parameters": [
          {
            "name": "thread",
            "in": "query",
            "required": true,
            "description": "Track ID from getCatalog, for example 100-days-2.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9._:-]{1,80}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Visible comments, newest first.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "name",
                      "body",
                      "created_at"
                    ],
                    "properties": {
                      "name": {
                        "type": "string",
                        "description": "Display name chosen by the commenter."
                      },
                      "body": {
                        "type": "string",
                        "description": "Comment text (plain text, up to 500 characters)."
                      },
                      "created_at": {
                        "type": "string",
                        "description": "UTC time the comment was posted."
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request was invalid.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Short error message."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this network address. Wait for the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Short error message."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The service is temporarily unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "description": "Short error message."
                    }
                  }
                }
              }
            }
          }
        },
        "security": []
      }
    }
  },
  "components": {
    "responses": {
      "BadRequest": {
        "description": "The request was invalid.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Too many requests from this network address. Wait for the number of seconds in Retry-After.",
        "headers": {
          "Retry-After": {
            "description": "Seconds to wait.",
            "schema": {
              "type": "integer"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unavailable": {
        "description": "The service is temporarily unavailable.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Error": {
        "description": "Any other error, with a short message.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Short error message."
          }
        }
      },
      "Catalog": {
        "type": "object",
        "required": [
          "artist",
          "releases",
          "tracks"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "verifiedAt": {
            "type": "string",
            "format": "date-time",
            "description": "When the seed catalogue was last verified."
          },
          "checkedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the platforms were last checked."
          },
          "stale": {
            "type": "boolean",
            "description": "True when the latest platform check failed and last good data is served."
          },
          "artist": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "instagram": {
                "type": "string",
                "format": "uri"
              },
              "spotifyId": {
                "type": "string"
              },
              "soundcloudId": {
                "type": "integer"
              },
              "bandcampId": {
                "type": "integer"
              }
            }
          },
          "releases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Release"
            }
          },
          "tracks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Track"
            }
          }
        }
      },
      "Release": {
        "type": "object",
        "required": [
          "id",
          "title"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "artists": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "description": "Release date (YYYY-MM-DD)."
          },
          "art": {
            "type": "string",
            "description": "Cover art URL, absolute or relative to https://rqive.studio/."
          },
          "spotify": {
            "type": [
              "string",
              "null"
            ],
            "description": "Spotify album ID."
          },
          "bandcamp": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          }
        }
      },
      "Track": {
        "type": "object",
        "required": [
          "id",
          "title",
          "artists",
          "sources"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable track ID, used as the comment thread."
          },
          "title": {
            "type": "string"
          },
          "artists": {
            "type": "string",
            "description": "Comma-separated artist names."
          },
          "release": {
            "type": "string",
            "description": "Release title."
          },
          "releaseId": {
            "type": "string"
          },
          "number": {
            "type": "integer",
            "description": "Track number on its release."
          },
          "ms": {
            "type": "integer",
            "description": "Length in milliseconds."
          },
          "date": {
            "type": "string",
            "description": "Release date."
          },
          "art": {
            "type": "string",
            "description": "Cover art URL."
          },
          "explicit": {
            "type": "boolean"
          },
          "sources": {
            "type": "object",
            "description": "Links on each platform the track is on.",
            "properties": {
              "spotify": {
                "$ref": "#/components/schemas/Source"
              },
              "soundcloud": {
                "$ref": "#/components/schemas/Source"
              },
              "bandcamp": {
                "$ref": "#/components/schemas/Source"
              }
            }
          }
        }
      },
      "Source": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "id": {
            "type": [
              "string",
              "integer"
            ],
            "description": "The platform's track ID."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Public track page."
          },
          "embeddable": {
            "type": "boolean"
          }
        }
      },
      "Status": {
        "type": "object",
        "required": [
          "payments",
          "social"
        ],
        "properties": {
          "payments": {
            "type": "object",
            "properties": {
              "enabled": {
                "type": "boolean",
                "description": "Whether optional one-time support is available."
              },
              "mode": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "live",
                  "test",
                  null
                ]
              },
              "currency": {
                "type": "string",
                "const": "AUD"
              },
              "min": {
                "type": "number",
                "description": "Smallest support amount."
              },
              "max": {
                "type": "number",
                "description": "Largest support amount."
              }
            }
          },
          "social": {
            "type": "boolean",
            "description": "Whether shared likes and comments are available."
          }
        }
      },
      "Likes": {
        "type": "object",
        "required": [
          "counts"
        ],
        "properties": {
          "counts": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Like count by track ID."
          },
          "mine": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Used by the site's player; empty for API callers."
          }
        }
      },
      "Comment": {
        "type": "object",
        "required": [
          "name",
          "body",
          "created_at"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Display name chosen by the commenter."
          },
          "body": {
            "type": "string",
            "description": "Comment text (plain text, up to 500 characters)."
          },
          "created_at": {
            "type": "string",
            "description": "UTC time the comment was posted."
          }
        }
      }
    }
  },
  "security": []
}
