Skip to content

Artist Source of Truth Registry

Related documentation: Artist Endpoint Map (product flows) · Artist Module Backend API · Promoters API · Data Ownership

Last verified: 2026-07-31
Scope: Backend-Kisum-Promoters, Frontend-Kisum-Promoters, Backend-Kisum-Artists, Frontend-Kisum-Artists

This is the canonical dot-connector for artist-related APIs after the 2026-06 directory migration. For every artist-facing route it records:

  1. Who owns the data (source of truth)
  2. Which Promoters handler resolves it
  3. Which upstream is called (if any)
  4. Which Mongo / external stores are touched
  5. Which frontend file(s) call the route
  6. Which UI screen consumes the response

Use this page when debugging wrong data, planning migrations, or adding new artist endpoints.

Backend-Kisum-AI’s mcp-kisum-artists is now an official machine consumer of this source of truth. It calls GET /api/v1/artists, artist detail, platform-accounts, and provider-refs with X-Internal-API-Key. It exposes four MCP tools and never connects directly to PostgreSQL. Its canonical artistId is the Artists numeric ID; external platform IDs remain separate.


ConcernSource of truthPromoters access pattern
Directory / profile shell — list, search, GET :id, name, image, country, genres (display), biography (read via network), platform external ids (Spotify, etc.)Backend-Kisum-Artists PostgresMachine BFF: artists-directory.upstream.js or /api/artists-network/* transparent proxy
Analytics / enrichment — stats, demographics, chart presence, predictions, trend, historical, Soundcharts/Viberate/Songstats pipelines, Kworb chart rowsMongo analytics stores (data_analyst.artist_data, Kworb charts.*, historical collections) + external music APIsResolve artist identity + Spotify id from Artists Postgres first (resolveArtistSpotifyFromMaster / resolveArtistMaster); then read analytics Mongo / external APIs. Do not use Mongo artists_v2 as artist master data.
Discography / Spotify album+track payloadsSpotify / MusicData (album lists, album detail, track enrich)Spotify artist id from Artists Postgres artist_platform_accounts; album/track bodies from Spotify or MusicData
Booking / marketplace / roster / team / relationships / touringBackend-Kisum-Artists Postgres (workflow + intelligence modules)/api/artists-network/*/api/v1/* transparent proxy
  • Profile + platform ids upstream: GET /api/artists, /search, /:id, event lineup display (resolveLineupArtists), and Spotify/platform external ids come from Artists Postgres — never from Mongo artist docs.
  • Booking/event identity: marketplace officialArtistId and all new Promoters Event lineup writes use numeric PostgreSQL artists.id; they are never Mongo ObjectIds.
  • Analytics Mongo is not artist master: getStatsById, getDemographicsById, predictions, trend, historical may still touch analytics Mongo collections, but must not treat Mongo artists_v2 as the source of name/image/platforms/slug.
  • Discography / top-tracks: resolve via resolveArtistSpotifyFromMaster (Artists Postgres); album/track payloads from Spotify/MusicData; Kworb rows (if any) are analytics only.
  • Event lineup stats use analytics paths keyed by resolved artist id — not Mongo as directory SoT.
  • Browser never calls Backend-Kisum-Artists internal routes directly (except Frontend-Kisum-Artists agency app with Bearer to Artists public API).

flowchart TB
  subgraph FE_Promoters["Frontend-Kisum-Promoters"]
    Legacy["/api/artists/*\n(data.ts)"]
    Network["/api/artists-network/*\n(artists-network/api.ts)"]
    Events["/api/events/*\n(lineup)"]
  end

  subgraph FE_Artists["Frontend-Kisum-Artists"]
    Direct["ARTISTS_API_BASE_URL\n/api/v1/*"]
  end

  subgraph Promoters["Backend-Kisum-Promoters :3099"]
    ArtistsRoute["artists.route.js"]
    ArtistsV2["artists-v2.route.js"]
    NetworkRoute["artists-network.route.js"]
    EventsQuery["events.query.js"]
    UpstreamDir["artists-directory.upstream.js"]
    ArtistsQuery["artists.query.js"]
  end

  subgraph ArtistsSvc["Backend-Kisum-Artists :3831"]
    PG["Postgres artist master\n+ booking/marketplace"]
  end

  subgraph Mongo["Mongo kisum_data"]
    ArtistsV2Col["artists_v2"]
    ArtistData["data_analyst.artist_data"]
    Charts["charts.*"]
  end

  subgraph External["External APIs"]
    Spotify["Spotify / MusicData"]
    SC["Soundcharts"]
    VB["Viberate"]
    SS["Songstats"]
    DFS["DataForSEO"]
    BIT["Bandsintown"]
    SLF["Setlist.fm"]
    N8N["n8n market-analysis"]
  end

  Legacy --> ArtistsRoute
  Network --> NetworkRoute
  Events --> EventsQuery
  Direct --> ArtistsSvc

  ArtistsRoute -->|"list/search/getById"| UpstreamDir
  UpstreamDir --> ArtistsSvc
  ArtistsRoute -->|"stats/demographics/..."| ArtistsQuery
  ArtistsQuery --> ArtistsV2Col
  ArtistsQuery --> ArtistData
  ArtistsQuery --> Charts
  ArtistsQuery --> External

  NetworkRoute -->|"X-Internal-API-Key + Bearer + x-org"| ArtistsSvc
  EventsQuery -->|"display"| UpstreamDir
  EventsQuery -->|"stats/predictions"| ArtistsQuery

StoreDatabase / serviceCollection / tableOwns
Artist directory masterBackend-Kisum-Artists Postgresartists, artist_profiles, artist_genres, artist_platform_accounts, artist_provider_refs, artist_team_assignments, company_needs_agent_artists, company_people, companies/peopleCanonical artist identity, profile, bio, genres, platform links, staff-linked representation, booking graph
Analytics artist documentMongo kisum_dataartists_v2Legacy enrichment doc: data_platforms, platforms, streamingPlatforms, socials, ranks, Soundcharts/Viberate UUIDs
Aggregated statsMongo data_analystartist_dataPrecomputed stats snapshots used by getStatsById / refresh pipelines
Historical seriesMongo kisum_dataartist_historical (via artistHistoricalModel)Cached fanbase/stream historical per channel
Genre taxonomy (legacy list)Mongo kisum_dataothers doc id: 'genres'GET /api/artists/genres filter dropdown
Chart presenceMongo Kworbcharts.* collectionsChart ranking presence
Promoter CRMMongo kisum_dataevents, offers, availsTenant-scoped business data; still reference artist ids from Mongo _id in many paths

FunctionFilePurposeSoT
listArtistsFromUpstream / searchArtistsFromUpstream / getArtistByIdFromUpstreamartists/artists-directory.upstream.jsMachine GET to Artists /api/v1/artists*Artists Postgres
resolveArtistMasterartists/queries/artists.query.jsSingle artist profile for display; maps legacy shapeArtists Postgres
resolveLineupArtistsartists/queries/artists.query.jsBatch upstream for event lineup name/image/countryArtists Postgres
getArtistFromMongoartists/queries/artists.query.jsLookup artists_v2 by numeric id, gid, or Mongo _idMongo
getArtistsFromMongoByRefsartists/queries/artists.query.jsBatch Mongo for predictionsMongo
artistsClient.requestservices/artists.client.jsHTTP to ARTISTS_INTERNAL_BASE_URL with X-Internal-API-KeyArtists service

Env (Promoters):

VariableRequired forNotes
ARTISTS_INTERNAL_BASE_URLDirectory + network BFFe.g. http://artists.local.kisum.io:3831
ARTISTS_INTERNAL_API_KEYAll Artists machine callsMust match Artists deployment
ARTISTS_API_TIMEOUT_MSOptionalDefault 30000

Directory routes return 503 when Artists env is unset.


Section A — Backend-Kisum-Promoters legacy /api/artists/*

Section titled “Section A — Backend-Kisum-Promoters legacy /api/artists/*”

Route file: artists/artists.route.js
Handler: artists/artists.controller.jsArtistsQuery / ArtistsCommand
Auth: Authorization Bearer + x-org (tenant). Most routes: optionalRequirePermissions([]). Writes: PERMISSIONS.ARTIST.EDIT.

#MethodPromoters pathQuery methodSource of truthUpstream / storesExternal APIsFrontend caller(s)UI / flow
1POST/api/artists/migratemigrateArtistsImagePathPromoters ops (image path fix)Mongo artists_v2 writesInternal/admin onlyMigration utility
2GET/api/artistsgetlistArtistsFromUpstreamArtists PostgresGET /api/v1/artists via machine BFFlibs/data.tsfetchArtists; hooks/use-artists.ts; combobox-artists.tsx; artists/page listArtist directory list, comboboxes, event create
3GET/api/artists/searchsearchsearchArtistsFromUpstreamArtists PostgresGET /api/v1/artists?q=libs/data.tssearchArtists; combobox-artists.tsxTypeahead search
4GET/api/artists/genresgetGenresMongo otherskisum_data.others where id: 'genres'libs/data.tsgetArtistGenres; combobox-artist-genres.tsxGenre filter dropdowns
5GET/api/artists/:id/trendgetTrendByIdDataForSEO (artist name from Mongo)getArtistFromMongo for nameGoogle Trends via DataForSEOlibs/data.tsgetArtistTrend*; some paths via Amplify ROUTER_URLAnalytics → trend charts
6GET/api/artists/:id/datagetDataByIdMongo analytics bundlegetArtistFromMongo + artist_dataVarious per fieldLegacy integrationsCountry-scoped data bundle
7GET/api/artists/:id/data-v2getDataByIdV2Mongo analytics bundleSame as dataVariousLegacyv2 data bundle
8GET/api/artists/:id/statsgetStatsByIdMongo artist_data + refreshgetArtistFromMongo; may refresh via Soundcharts/Viberate/SongstatsSpotify, SC, VB, SSlibs/data.tsgetArtistStats; artist-overview-audience.tsx; artist-analytics-statistic.tsx; getArtistDetailOverview uses /api/artist/:id/stats (typo path — verify proxy)Overview audience, analytics stats
9GET/api/artists/:id/card-statsgetCardStatsMongogetArtistFromMongo; may update socialslibs/data.tsgetArtistCardStats; artist-hero.tsxHero card metrics
10GET/api/artists/:id/demographicsgetDemographicsByIdMongo + platform APIsgetArtistFromMongo; data_platforms enrichment writesSoundcharts/Viberate/Songstats per channellibs/data.tsgetArtistDemographics_v2; artist-analytics-demographics.tsx; demographics *.tsx per platform; Next route app/api/artists/[id]/demographicsDemographics tabs
11GET/api/artists/:id/setlistfmgetSetlistfmByIdMongo + Setlist.fmgetArtistFromMongoSetlist.fm APILegacy setlist componentsSetlists
12GET/api/artists/:id/prediction/:countryCodegetPredictionByIdAndCountryCodeMongogetArtistFromMongoInternal prediction modelslibs/data.tsgetArtistPredictionPrediction by country
13GET/api/artists/:id/bandsintown/eventsgetBandsInTownEventsByIdMongo + BandsintowngetArtistFromMongoBandsintownlibs/data.tsgetArtistBandsintownEvents; artist-overview-upcoming-shows.tsx; artist-shows.tsxUpcoming shows
14GET/api/artists/:id/bandsintowngetBandsInTownByIdMongo + BandsintowngetArtistFromMongoBandsintownlibs/data.tsBandsintown profile
15GET/api/artists/:id/historicalgetHistoricalMongo artist_historical + Viberate/SoundchartsgetArtistFromMongo; cache collectionViberate, Soundchartslibs/data.tsgetArtistHistoricalHistorical fanbase charts
16GET/api/artists/:id/discography/:albumIdgetDiscographyAlbumByIdArtists Postgres + MusicData / SpotifyresolveArtistSpotifyFromMaster for Spotify id (slug/id/uuid); album from MusicData/SpotifyMusicData /spotify/albums/:id or local Spotifyartist-discography.tsxAlbum detail
17GET/api/artists/:id/discographygetDiscographyByIdArtists Postgres + Spotify / MusicDataresolveArtistSpotifyFromMaster for Spotify id; albums/tracks from Spotify (or MusicData when ?ids=)Spotify / MusicData /spotify/*libs/data.tsgetArtistDiscography*; artist-discography.tsx; artist-overview-latest-release.tsxDiscography list
18GET/api/artists/:id/top-tracksgetTopTracksByIdArtists Postgres + Kworb charts + Spotify / MusicDataresolveArtistSpotifyFromMaster; Kworb charts.* by Spotify id; enrich via Spotify/MusicDataKworb Mongo + Spotify / MusicDatalibs/data.tsgetArtistTopTracks; artist-overview-top-tracks.tsxTop tracks
19GET/api/artists/:id/top-songs-regionalgetRegionalTopSongsByIdMongo + analytics APIsgetArtistFromMongoSongstats / Soundchartslibs/data.ts; artist-regional-top-songs.shared.tsxRegional top songs
20GET/api/artists/:id/chart-presencegetChartPresenceByIdMongo Kworb charts.*getArtistFromMongoKworb chart DBlibs/data.tsgetArtistChartPresence; artist-overview-chart-presence.tsxChart presence
21GET/api/artists/:id/top-countriesgetTopCountriesByIdMongo (may write soundcharts_uuid)getArtistFromMongo; optional Mongo updateSoundchartslibs/data.tsgetArtistTopCountries; artist-overview-top-countries.tsxTop countries
22GET/api/artists/:id/charts/song/ranks/:platformgetChartSongRanksByIdSoundcharts (proxy)getArtistFromMongo; resolve/persist soundcharts_uuidSoundcharts GET /v2/artist/{uuid}/charts/song/ranks/{platform}(pending frontend)Chart song entries / peaks
23GET/api/artists/:id/eventsgetEventByArtistIdPromoters events collectionMongo events where artist in lineupEvent-artist cross viewsArtist’s events
24GET/api/artists/:id/performancegetPerformanceByIdMongo analyticsgetArtistFromMongoPerformance analyticsPerformance tab
25GET/api/artists/:id/contactsgetContactsByIdMongo artists_v2.teamAggregation on team.agencies / management peoplesLegacy contacts (prefer network team)Contacts drawer
26GET/api/artists/:idgetByIdresolveArtistMasterArtists PostgresGET /api/v1/artists/:id?include=profile,genres,platforms,providerslibs/data.tsgetArtist; legacy paths; Note: detail shell prefers artists-networkArtist detail fallback
27POST/api/artists/:id/prediction-v2getPredictionByIdV2MongogetArtistFromMongoInternal modelslibs/data.tsPrediction v2
28POST/api/artists/:id/prediction-v3getPredictionByIdV3MongogetArtistFromMongoInternal modelslibs/data.ts; app/api/artists/[id]/prediction-v3; Amplify ROUTER_URLartist-analytics-prediction.tsx
29POST/api/artists/market-analysisgetMarketAnalysisn8n workflowBody from Mongo-enriched contextn8n webhooklibs/data.tsgetArtistMarketAnalysis; artist-analytics-prediction.tsxMarket analysis AI
30POST/api/artists/:id/biocreateBio (command)Mongo bio write (legacy)Approval workflow in PromotersLegacy bio submitPrefer PUT /api/artists-network/artists/:id/profile

getArtistFromMongo accepts:

  • Numeric Kisum id (artists_v2.id)
  • Legacy Mongo gid string
  • Mongo _id ObjectId

resolveArtistMaster / upstream accept:

  • Bigint id, UUID, slug, or legacy gid (Artists service resolves)

Route file: artists/artists-v2.route.js

MethodPathHandlerSoTNotes
GET/api/v2/artistsArtistsQuery.getArtists PostgresSame as GET /api/artists
GET/api/v2/artists/:idArtistsQuery.getByIdArtists PostgresSame as GET /api/artists/:id

No Mongo layer models on live v2 list/detail path.


Section C — Backend-Kisum-Promoters /api/artists-network/*

Section titled “Section C — Backend-Kisum-Promoters /api/artists-network/*”

Route file: artists-network/artists-network.route.js
Proxy: artists-network/artists-network.controller.jsservices/artists.client.js
SoT: Backend-Kisum-Artists Postgres (all transparent proxies unless noted)
Auth: JWT + x-org + permission keys (promoter.artist, promoter.artist_offer, etc.)
Upstream headers: X-Internal-API-Key, forwarded Authorization, x-org

#MethodPromoters BFF pathArtists upstreamPermissionFE function (artists-network/api.ts)UI screen(s)
1GET/marketplace/artist-availabilities/api/v1/marketplace/artist-availabilitiesVIEW_AVAILsearchMarketplaceAvailsbooking/marketplace/page.tsx
2GET/marketplace/artists/api/v1/marketplace/artistsVIEW_ARTIST(marketplace browse)Marketplace
3GET/marketplace/agencies/api/v1/marketplace/agenciesVIEW_ARTISTlistMarketplaceAgenciesMarketplace agencies
4GET/companies/:id/api/v1/companies/:idVIEW_ARTISTgetArtistsCompanyAgency/company detail
5GET/companies/:id/roster/api/v1/companies/:id/rosterVIEW_ARTISTlistArtistsCompanyRosterRoster views
6GET/companies/:id/people/api/v1/companies/:id/peopleVIEW_ARTISTlistArtistsCompanyPeopleStaff/people
7GET/people/:id/api/v1/people/:idVIEW_ARTISTgetArtistsPersonPerson detail
8GET/people/:id/companies/api/v1/people/:id/companiesVIEW_ARTISTlistArtistsPersonCompaniesPerson ↔ companies
9GET/artists/api/v1/artistsVIEW_ARTISTlistArtistsDirectoryDirectory (network shape)
10GET/artists/:id/api/v1/artists/:idVIEW_ARTISTgetArtistsArtistBase shell
11GET/artists/:id/profile/api/v1/artists/:id/profileVIEW_ARTISTfetchArtistProfileRowartist-detail-context.tsx, artist-biography.tsx
12PUT/artists/:id/profile/api/v1/artists/:id/profileEDIT_ARTIST(profile edit)Bio edit
13POST/artists/:id/profile/ensure-short-bioBFF-only (Gemini → PUT profile)EDIT_ARTISTensureArtistsArtistShortBioartist-biography.tsx
14POST/artists/:id/profile/ensure-bio-formattedBFF-only (Gemini → PUT profile)EDIT_ARTISTensureArtistsArtistBioFormattedartist-biography.tsx
15GET/artists/:id/genres/api/v1/artists/:id/genresVIEW_ARTISTfetchArtistSubresourceRowsDetail tabs
16GET/artists/:id/subgenres/api/v1/artists/:id/subgenresVIEW_ARTISTfetchArtistSubresourceRowsDetail tabs
17GET/artists/:id/platform-accounts/api/v1/artists/:id/platform-accountsVIEW_ARTISTfetchArtistSubresourceRowsPlatforms
18GET/artists/:id/provider-refs/api/v1/artists/:id/provider-refsVIEW_ARTISTfetchArtistSubresourceRowsProvider refs
19GET/artists/:id/team/api/v1/artists/:id/teamVIEW_ARTISTgetArtistsArtistContactsContacts / team
20GET/artists/:id/roster/api/v1/artists/:id/rosterVIEW_ARTISTfetchArtistSubresourceRowsRoster links
21GET/promoters/:id/dashboard/api/v1/promoters/:id/dashboardVIEW_ARTISTgetPromoterDashboarddashboard-booking-network.tsx
22GET/promoters/:id/shortlists/api/v1/promoters/:id/shortlistsVIEW_ARTISTlistPromoterShortlistsbooking/shortlists/page.tsx
23POST/promoters/:id/shortlists/api/v1/promoters/:id/shortlistsEDIT_OFFERcreatePromoterShortlistcreate-shortlist-dialog.tsx
23aGET/promoters/:id/shortlists/:shortlistIdsameVIEW_ARTISTgetPromoterShortlistbooking/shortlists/[id]/page.tsx
23bDELETE/promoters/:id/shortlists/:shortlistIdsameEDIT_OFFERdeletePromoterShortlistshortlist detail
24POST/promoters/:id/shortlists/:shortlistId/artistssameEDIT_OFFERaddArtistToShortlistadd-artist-to-shortlist-dialog.tsx
24aDELETE/promoters/:id/shortlists/:shortlistId/artists/:artistIdsameEDIT_OFFERremoveArtistFromShortlistshortlist detail
25GET/promoters/:id/booking-history/api/v1/promoters/:id/booking-historyVIEW_OFFERDashboard/history
26GET/promoters/:id/inquiries/api/v1/promoters/:id/inquiriesVIEW_OFFERInquiries
27GET/promoters/:id/offers/api/v1/promoters/:id/offersVIEW_OFFERLegacy offers list
28GET/booking-requests/api/v1/booking-requestsVIEW_OFFERlistBookingRequestsbooking/requests/page.tsx
29POST/booking-requests/api/v1/booking-requestsEDIT_OFFERcreateBookingRequestsend-booking-request-sheet.tsx
30GET/booking-requests/:requestId/api/v1/booking-requests/:requestIdVIEW_OFFERgetBookingRequestbooking/requests/[id]/page.tsx
31PATCH/booking-requests/:requestId/api/v1/booking-requests/:requestIdEDIT_OFFERpatchBookingRequestRequest edit
32POST/booking-requests/:requestId/withdraw/api/v1/booking-requests/:requestId/withdrawEDIT_OFFERwithdrawBookingRequestwithdraw-request-dialog.tsx
33POST/booking-requests/:requestId/convert-to-offer/api/v1/booking-requests/:requestId/convert-to-offerEDIT_OFFERconvertBookingRequestToOfferconvert-to-offer-dialog.tsx
34GET/booking-offers/api/v1/booking-offersVIEW_OFFERlistBookingOffersbooking/offers/page.tsx
35POST/booking-offers/api/v1/booking-offersEDIT_OFFERCreate offer
36GET/booking-offers/:offerId/api/v1/booking-offers/:offerIdVIEW_OFFERgetBookingOfferbooking/offers/[id]/page.tsx
37POST/booking-offers/:offerId/counter/api/v1/booking-offers/:offerId/counterEDIT_OFFERcounterBookingOffercounter-offer-dialog.tsx
38POST/booking-offers/:offerId/accept/api/v1/booking-offers/:offerId/acceptEDIT_OFFERacceptBookingOfferaccept-offer-dialog.tsx
39POST/booking-offers/:offerId/decline/api/v1/booking-offers/:offerId/declineEDIT_OFFERdeclineBookingOfferdecline-offer-dialog.tsx
40POST/booking-offers/:offerId/cancel/api/v1/booking-offers/:offerId/cancelEDIT_OFFERcancelBookingOffercancel-offer-dialog.tsx
41GET/booking-offers/:offerId/holds/api/v1/booking-offers/:offerId/holdsVIEW_OFFERlistOfferHoldsoffer-holds-panel.tsx
42POST/booking-offers/:offerId/holds/api/v1/booking-offers/:offerId/holdsEDIT_OFFERcreateOfferHoldHolds panel
43PATCH/booking-offers/:offerId/holds/:holdId/api/v1/booking-offers/:offerId/holds/:holdIdEDIT_OFFERreleaseOfferHold (release action)Holds panel
44GET/bookings/api/v1/bookingsVIEW_OFFERbooking/confirmed/page.tsx
45GET/bookings/:bookingId/api/v1/bookings/:bookingIdVIEW_OFFERgetBookingbooking/confirmed/[id]/page.tsx
46GET/bookings/:bookingId/activity/api/v1/bookings/:bookingId/activityVIEW_OFFERlistBookingActivitybooking-activity-timeline.tsx
47POST/bookings/:bookingId/activity/api/v1/bookings/:bookingId/activityEDIT_OFFERpostBookingActivityActivity timeline
48GET/bookings/:bookingId/finance-status/api/v1/bookings/:bookingId/finance-statusVIEW_DEALgetBookingFinanceStatusbooking-finance-tab.tsx
49GET/bookings/:bookingId/payment-schedule/api/v1/bookings/:bookingId/payment-scheduleVIEW_DEALgetBookingPaymentScheduleFinance tab
50GET/bookings/:bookingId/deposit-status/api/v1/bookings/:bookingId/deposit-statusVIEW_DEALgetBookingDepositStatusFinance tab
51POST/bookings/:bookingId/finance-handoff/api/v1/bookings/:bookingId/finance-handoffEDIT_OFFERpostBookingFinanceHandofffinance-handoff-dialog.tsx
52–61GET/POST/relationships/*/api/v1/relationships/*VIEW_ARTIST / EDIT_OFFERlistRelationships, getRelationship*, etc.booking/relationships/*
62–69GET/POST/artists/:id/tour-plans, /tour-plans/*, /bookings/:id/logistics*/api/v1/*VIEW_LOGISTICS / EDIT_LOGISTICSlogistics helpers in api.tsbooking-logistics-tab.tsx, touring

Finance note: Booking finance visibility routes read Artists-computed handoff status; money truth remains Backend-Kisum-Finance.


Section D — Events cross-cutting (artist data)

Section titled “Section D — Events cross-cutting (artist data)”

File: events/queries/events.query.js

Event endpointArtist concernResolverSoT
GET /api/events/:id/lineupLineup display (name, image, country)resolveLineupArtistsArtists Postgres
SameLineup stats per artistgetStatsById(..., null)Mongo artist_data
Event predictions / financial artist bundleArtist enrichment for predictiongetArtistsFromMongoByRefsMongo artists_v2
Offer flow artist displaySingle artist shellresolveArtistMasterArtists Postgres

Frontend: libs/data.tsgetEventLineup; useEventArtists.ts (main + public events).


Section E — Other Promoters modules still on Mongo artists_v2

Section titled “Section E — Other Promoters modules still on Mongo artists_v2”

These modules have not been migrated to Artists upstream for artist master reads:

ModuleFile(s)Usage
Availsavails/*Artist refs on avail rows; marketplace browse moved to network
Offeroffer/commands/offer.command.jsartistsModel.find for offer artist snapshot
Agenciesagencies/queries/agencies.query.jsRoster artist details from Mongo + artist_data
Rankingsrankings queriesRank sort from Mongo
Setlistfmsetlist moduleArtist lookup
Kisum AIkisumAi/*Artist context for AI
Artist utilsutils/artist-stats-refresh.utils.jsMongo updateOne for platform UUID normalization

Rule: New features should use Artists Postgres for identity and Mongo only for analytics enrichment.


Section F — Backend-Kisum-Artists canonical API

Section titled “Section F — Backend-Kisum-Artists canonical API”

Base: /api/v1 (Fiber)
Auth: Bearer JWT (+ tenant context per route); internal machine routes use service keys as configured.

F.1 — CRUD entities (internal/artists/routes/routes.go)

Section titled “F.1 — CRUD entities (internal/artists/routes/routes.go)”
ResourceListGetCreateUpdateDelete
/artists
/companies
/people
/genres, /subgenres, /regions, /countries, /states, /cities, /platforms, /provider-sources
PathMethodsPostgres tables (conceptual)
/artists/:id/profileGET, PUTartist_profiles
/artists/:id/genresGET, PUTartist_genres
/artists/:id/subgenresGET, PUTsubgenres link
/artists/:id/platform-accountsGET, PUTplatform accounts
/artists/:id/provider-refsGET, PUTexternal provider refs
/artists/:id/teamGET, PUTteam members
/artists/:id/rosterGET, PUTroster links

F.3 — Workflow / marketplace / booking (workflow, intelligence, touring, contracts, provisioning modules)

Section titled “F.3 — Workflow / marketplace / booking (workflow, intelligence, touring, contracts, provisioning modules)”

Registered in internal/artists/module.go:

  • Marketplace: /marketplace/artist-availabilities, /marketplace/artists, /marketplace/agencies
  • Booking: /booking-requests, /booking-offers, /bookings (+ activity, holds, finance visibility)
  • Promoter: /promoters/:id/dashboard, shortlists, booking-history
  • Relationships, touring, logistics, contracts — see OpenAPI internal/openapi/spec.go

SoT for all F.3 routes: Artists Postgres (+ Finance handoff references only).


Section G — Frontend-Kisum-Promoters caller matrix (by screen)

Section titled “Section G — Frontend-Kisum-Promoters caller matrix (by screen)”
UI route / componentAPI surfaceSoT consumed
/artists listGET /api/artistsArtists Postgres (legacy envelope)
/artists/[id] layout shellartists-network → profile, genres, platforms, teamArtists Postgres
/artists/[id] overview audienceGET /api/artists/:id/statsMongo analytics
/artists/[id] heroGET /api/artists/:id/card-statsMongo
/artists/[id] demographics *GET /api/artists/:id/demographicsMongo + APIs
/artists/[id] discography/discography, /top-tracksArtists Postgres (Spotify id) + Spotify/MusicData (+ Kworb for top-tracks)
/artists/[id] chart presence/chart-presenceMongo Kworb
/artists/[id] top countries/top-countriesMongo
/artists/[id] regional songs/top-songs-regionalMongo
/artists/[id] shows/bandsintown/eventsMongo + BIT
/artists/[id] analytics prediction/trend, /prediction-v3, /market-analysisMongo + DataForSEO + n8n
/artists/[id] biographyartists-network profile + ensure-bioArtists Postgres
/booking/*/api/artists-network/*Artists Postgres
/events/[id] lineupGET /api/events/:id/lineupMixed: display=Artists, stats=Mongo
combobox-artistsfetchArtists, searchArtistsArtists Postgres
form-event / EventCreateDrawerfetchArtistsArtists Postgres

Some analytics calls bypass direct Promoters URL:

Next/Amplify pathProxies toNotes
app/api/artists/[id]/demographics/route.tsxPromoters /api/artists/:id/demographicsMay use ROUTER_URL
app/api/artists/[id]/prediction-v3/route.tsxPromoters POST .../prediction-v3Lambda router
libs/data.ts trend/demographics${ROUTER_URL}/api/artists/...Legacy Amplify path for cache

Section H — Frontend-Kisum-Artists (agency app)

Section titled “Section H — Frontend-Kisum-Artists (agency app)”

API client: src/lib/api-client.tsARTISTS_API_BASE_URL + /api/v1/*
Service: src/services/artists/api.ts (2000+ lines — full Artists surface)

PatternSoT
Direct Bearer to Artists public APIArtists Postgres (no Promoters BFF)
Agency roster, booking, contracts, touringSame as Section F

Promoters browser app must not copy this pattern — it uses Promoters BFF only.


ConcernPath
Legacy artist routesBackend-Kisum-Promoters/artists/artists.route.js
v2 artist routesBackend-Kisum-Promoters/artists/artists-v2.route.js
Network BFF routesBackend-Kisum-Promoters/artists-network/artists-network.route.js
Query / resolver logicBackend-Kisum-Promoters/artists/queries/artists.query.js
Directory upstreamBackend-Kisum-Promoters/artists/artists-directory.upstream.js
Legacy shape mapperBackend-Kisum-Promoters/artists/artists-directory.mapper.js
Artists HTTP clientBackend-Kisum-Promoters/services/artists.client.js
Event lineupBackend-Kisum-Promoters/events/queries/events.query.js
FE legacy APIFrontend-Kisum-Promoters/src/libs/data.ts
FE network APIFrontend-Kisum-Promoters/src/services/apis/artists-network/api.ts
Artists Go routesBackend-Kisum-Artists/internal/artists/routes/routes.go
Artists module mountBackend-Kisum-Artists/internal/artists/module.go

GapStatus
iso2 query filter on GET /api/artistsMapped (2026-07-10) — Promoters forwards iso2 to Artists; Artists filters artists.country_id via countries.iso2 (comma-separated OK)
genres query filter on GET /api/artistsNot fully mapped to Artists upstream list params
GET /api/artists/:id/contactsMongo team aggregation; prefer artists-network/.../team
Offer/avails/agencies/rankings artist readsStill Mongo artists_v2
Event lineup rank fieldMay differ between Mongo rank vs Artists profile — verify product intent
GET /api/artist/:id/stats (singular) in getArtistDetailOverviewPossible typo vs /api/artists/:id/stats — verify API gateway

Section K — Middle Agent Workspace (parallel workflow)

Section titled “Section K — Middle Agent Workspace (parallel workflow)”

Middle-agent data is not stored on booking_requests / booking_offers. It lives in parallel tables under Backend-Kisum-Artists (workspace_artists, middle_agent_offers, …).

ConcernOwnerBrowser pathUpstream
Operator deal deskFrontend-Kisum-Artists/middle-agent/*GET/PATCH /api/v1/middle-agent/*
Promoter marketplace browseFrontend-Kisum-Promoters/booking/marketplace (Non-direct tab)GET /api/artists-network/middle-agent/listings
Promoter enquiryFrontend-Kisum-PromotersSendMiddleAgentEnquirySheetPOST /api/artists-network/middle-agent/enquiries
Promoter outboxFrontend-Kisum-Promoters/booking/middle-agent-enquiriesGET /api/artists-network/middle-agent/enquiries
Source-agent inboxFrontend-Kisum-Artists/middle-agent/inbound-source-offersGET /api/v1/middle-agent/inbound-source-offers
Direct booking (unchanged)Both apps/booking-requests, /booking-offers/api/v1/booking-requests, /api/v1/booking-offers

Platform doc: Middle Agent Workspace. ADR: Backend-Kisum-Artists/docs/adr/20260625-middle-agent-parallel-workflow.md.


When adding or changing any artist route:

  1. Update this registry (same PR as code).
  2. Update Backend-Kisum-Promoters/docs/ARTIST_SOURCE_OF_TRUTH_REGISTRY.md (mirror).
  3. Update Frontend-Kisum-Promoters/docs/ARTIST_API_SOURCE_OF_TRUTH.md if FE callers change.
  4. Update Backend-Kisum-Artists/docs/artist-source-of-truth-registry.md if upstream contract changes.
  5. Add row to Data Ownership if ownership moves.

  • Backend-Kisum-Promoters/docs/ARTISTS_NETWORK_BFF.md — network proxy details
  • Backend-Kisum-Promoters/docs/ARTIST_SOURCE_OF_TRUTH_REGISTRY.md — package mirror
  • Frontend-Kisum-Promoters/docs/ARTIST_API_SOURCE_OF_TRUTH.md — FE caller index
  • Backend-Kisum-Artists/docs/artist-source-of-truth-registry.md — upstream owner index