{
  "openapi": "3.0.1",
  "info": {
    "title": "Bandcamp Music Insights Scraper",
    "description": "Bandcamp artists, albums, tracks, merch & supporter communities. ISRC codes, label graphs, contact extraction, tag-based discovery. Input-time filters and history tracking.",
    "version": "1.0",
    "x-build-id": "3aJS5Lzkb4k6ugAY4"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/brilliant_gum~bandcamp-music-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-brilliant_gum-bandcamp-music-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/brilliant_gum~bandcamp-music-scraper/runs": {
      "post": {
        "operationId": "runs-sync-brilliant_gum-bandcamp-music-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/brilliant_gum~bandcamp-music-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-brilliant_gum-bandcamp-music-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "artistUrls": {
            "title": "Artist URLs",
            "type": "array",
            "description": "Bandcamp artist or label URLs (e.g. https://daughters.bandcamp.com/, https://kingkrule.bandcamp.com/). Album/track URLs are also accepted and routed to the right handler.",
            "items": {
              "type": "string"
            }
          },
          "artistSubdomains": {
            "title": "Artist subdomains",
            "type": "array",
            "description": "Bare Bandcamp subdomains (e.g. 'daughters', 'noisia'). Convenient for CSV lists.",
            "items": {
              "type": "string"
            }
          },
          "albumUrls": {
            "title": "Album URLs",
            "type": "array",
            "description": "Direct album URLs (e.g. https://daughters.bandcamp.com/album/you-wont-get-what-you-want).",
            "items": {
              "type": "string"
            }
          },
          "trackUrls": {
            "title": "Track URLs",
            "type": "array",
            "description": "Direct track URLs (e.g. https://daughters.bandcamp.com/track/satan-in-the-wait).",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "title": "Tag-based discovery",
            "type": "array",
            "description": "Tags to browse via Bandcamp's discover API (e.g. 'noise-rock', 'ambient', 'black-metal'). Returns the top albums currently surfaced for each tag.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries (discovery)",
            "type": "array",
            "description": "Free-text queries — routed through the discover API.",
            "items": {
              "type": "string"
            }
          },
          "maxAlbumsPerArtist": {
            "title": "Max albums per artist",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Cap on albums fetched per artist (drawn from the discography grid).",
            "default": 50
          },
          "maxTracksPerArtist": {
            "title": "Max standalone tracks per artist (0 = unlimited within page)",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "Cap on standalone tracks fetched per artist (tracks not bundled in an album).",
            "default": 0
          },
          "maxDiscoveryItemsPerTag": {
            "title": "Max discovery items per tag",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Cap on items returned per tag via the discover API.",
            "default": 100
          },
          "includeArtist": {
            "title": "Include artist record",
            "type": "boolean",
            "description": "Push one artist record per artist scraped (in addition to per-album/track records).",
            "default": true
          },
          "includeDiscography": {
            "title": "Walk the discography",
            "type": "boolean",
            "description": "Fetch every album in the artist's discography (up to 'Max albums per artist').",
            "default": true
          },
          "includeTrackDetails": {
            "title": "Include per-track records",
            "type": "boolean",
            "description": "Push one record per track inside each album (with ISRC, duration, lyrics, play count, preview MP3).",
            "default": true
          },
          "includeMerch": {
            "title": "Include merch release variants",
            "type": "boolean",
            "description": "Keep CD/Vinyl/Cassette/T-shirt variants in the album's releaseVariants array.",
            "default": true
          },
          "fetchAlbumDetailsForDiscovery": {
            "title": "Walk into discovered items",
            "type": "boolean",
            "description": "For tag/search results, fetch each item's full album page (richer data but more requests).",
            "default": false
          },
          "tagsInclude": {
            "title": "[Filters — applied before billing] Must include tags",
            "type": "array",
            "description": "Drop albums whose tag list doesn't include at least one of these (case-insensitive). Filter applied BEFORE billing — no charge for filtered entities.",
            "items": {
              "type": "string"
            }
          },
          "tagsExclude": {
            "title": "Must NOT include tags",
            "type": "array",
            "description": "Drop albums whose tag list includes any of these.",
            "items": {
              "type": "string"
            }
          },
          "minPrice": {
            "title": "Min album price",
            "minimum": 0,
            "type": "integer",
            "description": "Minimum 'minimum price' for paid albums. 0 = include free / name-your-price.",
            "default": 0
          },
          "maxPrice": {
            "title": "Max album price (0 = unlimited)",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum 'minimum price'. 0 means no upper limit.",
            "default": 0
          },
          "freeOnly": {
            "title": "Free releases only",
            "type": "boolean",
            "description": "Keep only releases with free downloads available.",
            "default": false
          },
          "paidOnly": {
            "title": "Paid releases only",
            "type": "boolean",
            "description": "Keep only releases with a non-zero minimum price.",
            "default": false
          },
          "releaseDateFrom": {
            "title": "Earliest release date",
            "type": "string",
            "description": "ISO date or YYYY-MM-DD. Drop albums released before this."
          },
          "releaseDateTo": {
            "title": "Latest release date",
            "type": "string",
            "description": "ISO date or YYYY-MM-DD. Drop albums released after this."
          },
          "formats": {
            "title": "Format allow-list",
            "type": "array",
            "description": "Keep only releases offered in any of these formats (e.g. 'vinyl', 'cassette', 'cd'). Substring match.",
            "items": {
              "type": "string"
            }
          },
          "minSupporters": {
            "title": "Min supporters per album",
            "minimum": 0,
            "type": "integer",
            "description": "Drop albums below this supporter count. Bandcamp's unique 'supported by' signal.",
            "default": 0
          },
          "minTracks": {
            "title": "Min tracks per album",
            "minimum": 0,
            "type": "integer",
            "description": "Drop albums with fewer tracks than this (e.g. filter out singles).",
            "default": 0
          },
          "keywordsInclude": {
            "title": "Must contain keywords",
            "type": "array",
            "description": "Drop albums whose title + description + tags don't include at least one of these (case-insensitive).",
            "items": {
              "type": "string"
            }
          },
          "keywordsExclude": {
            "title": "Must NOT contain keywords",
            "type": "array",
            "description": "Drop albums whose text contains any of these keywords.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Artist location filter",
            "type": "string",
            "description": "Substring match on the artist's location (e.g. 'Berlin', 'Brooklyn'). Case-insensitive."
          },
          "labelsOnly": {
            "title": "Labels only (skip individual artists)",
            "type": "boolean",
            "description": "Keep only Bandcamp pages flagged as labels.",
            "default": false
          },
          "signedToLabelOnly": {
            "title": "Artists signed to a label only",
            "type": "boolean",
            "description": "Drop unsigned/self-released artists.",
            "default": false
          },
          "hasContact": {
            "title": "Has extractable contact info only",
            "type": "boolean",
            "description": "Drop artists without any extractable email, website or social handle (useful for lead-gen runs).",
            "default": false
          },
          "includeContactInfo": {
            "title": "Extract contact info (lead-gen)",
            "type": "boolean",
            "description": "Parse emails, websites and canonical socials from bio + sites array.",
            "default": true
          },
          "includeAnalytics": {
            "title": "Compute analytics block",
            "type": "boolean",
            "description": "Per-artist average album price, release cadence, top tags, total supporters, dominant formats, label list, paid-vs-free ratio.",
            "default": true
          },
          "includeTagClustering": {
            "title": "Compute tag co-occurrence clusters",
            "type": "boolean",
            "description": "Add a tagClusters block listing which tags co-occur across the artist's catalog (useful for genre micro-niche discovery).",
            "default": false
          },
          "enableHistory": {
            "title": "Enable historical tracking (supporter + release-velocity deltas)",
            "type": "boolean",
            "description": "Persist a timestamped snapshot every run into a named store, then compute deltas (releases per month, supporter growth per day, price drift, trend) vs the previous run. Schedule daily/weekly to build a time-series.",
            "default": false
          },
          "historyDatasetName": {
            "title": "History store name",
            "type": "string",
            "description": "Named key-value store to persist snapshots into. Reused across scheduled runs.",
            "default": "bandcamp-history"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Proxies are included and configured automatically — leave empty unless overriding."
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel workers.",
            "default": 5
          },
          "minDelayMs": {
            "title": "Min delay between requests (ms)",
            "minimum": 200,
            "maximum": 10000,
            "type": "integer",
            "description": "Per-request throttle.",
            "default": 1000
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}