Skip to main content
Artists represent the creators and performers in your music catalog. Each artist can be associated with multiple releases and tracks, allowing you to organize your music library by performer.

Overview

The artist management system enables you to:

Create artists

Add new artists to your catalog with names and status

Track releases

Link artists to their releases and manage collaborations

Manage status

Control artist visibility with active/inactive status

User ownership

Associate artists with specific user accounts

Artist entity structure

The Artist entity contains the following fields:
@Entity('artists')
export class Artist extends AbstractEntity {
  // NAME
  @Column({ name: 'name', nullable: false })
  name!: string;

  // STATUS
  @Column({
    name: 'status',
    nullable: false,
    type: 'enum',
    enum: ['active', 'inactive'],
    default: 'active',
  })
  status!: string;

  // USER ID
  @Column({ name: 'user_id', nullable: false })
  userId!: string;

  // Relations
  @ManyToOne(() => User, (user) => user.artists)
  user!: User;

  @OneToMany(() => ReleaseArtist, (releaseArtist) => releaseArtist.artist)
  releases: ReleaseArtist[];
}

Core fields

FieldTypeRequiredDescription
idUUIDYesUnique identifier (inherited from AbstractEntity)
namestringYesArtist’s display name
statusenumYesEither active or inactive (default: active)
userIdUUIDYesReference to the owning user
createdAttimestampYesRecord creation time (inherited)
updatedAttimestampYesLast update time (inherited)

Relationships

Each artist belongs to a single user. When the user is deleted, all their artists are cascade deleted.
@ManyToOne(() => User, (user) => user.artists, {
  onDelete: 'CASCADE',
  onUpdate: 'CASCADE',
})
Artists connect to releases through the ReleaseArtist join entity, enabling many-to-many relationships for collaborations.
@OneToMany(() => ReleaseArtist, (releaseArtist) => releaseArtist.artist)
releases: ReleaseArtist[];

Common operations

Create an artist

Create a new artist in your catalog:
POST /artists

{
  "name": "John Doe",
  "status": "active" // optional, defaults to 'active'
}
The userId is automatically set from the authenticated user’s context. You don’t need to provide it in the request body.

Fetch artists

Retrieve artists with pagination and optional filtering:
GET /artists?page=0&size=10&labelId=<uuid>
Query parameters:
  • page - Page number (default: 0)
  • size - Items per page (default: 10)
  • labelId - Optional filter by label
Regular users can only see their own artists with active status.
// Automatically filtered by:
{
  userId: user.id,
  status: 'active'
}

Get artist by ID

Retrieve a specific artist’s details:
GET /artists/:id
Non-admin users cannot access artists with inactive status, even if they own them. This request will return a 403 Forbidden error.

Update an artist

Modify an existing artist’s information:
PATCH /artists/:id

{
  "name": "Jane Smith",
  "status": "inactive"
}
Both fields are optional. Only provided fields will be updated.

Delete an artist

Remove an artist from the catalog:
DELETE /artists/:id
Deleting an artist will cascade delete all associated ReleaseArtist records due to the relationship configuration.

Status management

Artists can have one of two statuses:

Active

Artist is visible and accessible to all users. This is the default status.

Inactive

Artist is hidden from regular users. Only admins can view and manage inactive artists.
You can use the inactive status to:
  • Temporarily hide artists without deleting them
  • Archive retired or discontinued artists
  • Manage artists pending approval or review

Use cases

Solo artist catalog

Create a single artist for your personal music:
const artist = await fetch('/artists', {
  method: 'POST',
  body: JSON.stringify({
    name: 'DJ Producer'
  })
});

Collaboration management

Link multiple artists to a single release:
// Create release
const release = await createRelease({
  title: 'Collaboration EP',
  // ... other fields
});

// Link artists via ReleaseArtist entity
await createReleaseArtist({
  releaseId: release.id,
  artistId: artist1.id
});

await createReleaseArtist({
  releaseId: release.id,
  artistId: artist2.id
});

Label roster management

Filter artists by label to view your roster:
GET /artists?labelId=<label-uuid>&size=50

Releases

Link artists to albums and singles

Labels

Manage artist rosters under labels

Roles & Permissions

Control artist management access

Build docs developers (and LLMs) love