Campaign Object

A Campaign is the core entity in OnlyDancers. It represents a music creator's dance contest, including the song, prize pool, reward tiers, and submission rules.

JSON Structure

{
  "campaignId": "1",
  "creator": {
    "name": "Sample Artist",
    "address": "0x1234...abcd",
    "profileUrl": "https://onlydancers.fun/creator/sample-artist"
  },
  "song": {
    "title": "Move With Me",
    "artist": "Sample Artist",
    "duration": "3:24",
    "platforms": {
      "youtube": "https://youtube.com/watch?v=example",
      "tiktok": "https://tiktok.com/sound/example",
      "instagram": "https://instagram.com/reels/audio/example"
    }
  },
  "prizePool": {
    "creatorDeposit": 50000,
    "entryFee": 5,
    "currency": "USDC",
    "rewardTokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
  },
  "tiers": [
    { "name": "1st Place", "prizePerWinner": 5000, "winners": 1 },
    { "name": "2nd Place", "prizePerWinner": 3000, "winners": 1 },
    { "name": "3rd Place", "prizePerWinner": 2000, "winners": 1 },
    { "name": "4th-10th", "prizePerWinner": 700, "winners": 7 },
    { "name": "11th-50th", "prizePerWinner": 200, "winners": 40 },
    { "name": "51st-200th", "prizePerWinner": 75, "winners": 150 },
    { "name": "201st-500th", "prizePerWinner": 30, "winners": 300 },
    { "name": "Lucky Draw", "prizePerWinner": 100, "winners": 968 },
    { "name": "Best Outfit", "prizePerWinner": 1000, "winners": 100 },
    { "name": "Best Location", "prizePerWinner": 1000, "winners": 10 },
    { "name": "Best 14yo", "prizePerWinner": 1000, "winners": 50 },
    { "name": "Best 15yo", "prizePerWinner": 1000, "winners": 50 },
    { "name": "Best 16yo", "prizePerWinner": 1000, "winners": 50 },
    { "name": "Max Collaborators", "prizePerWinner": 5000, "winners": 10 },
    { "name": "Best 17yo", "prizePerWinner": 1000, "winners": 50 },
    { "name": "Best 18yo", "prizePerWinner": 1000, "winners": 50 }
  ],
  "totalWinners": 1838,
  "totalPrizePool": 549950,
  "status": "active",
  "chain": "ethereum",
  "chainId": 1,
  "contractAddress": "0x...",
  "startDate": "2026-04-01T00:00:00Z",
  "endDate": "2026-05-01T00:00:00Z",
  "submissionRules": {
    "maxSubmissionsPerDancer": 1,
    "requiredDescription": "🔥 #OnlyDancers #MoveWithMe @onlydancers.fun — Enter at onlydancers.fun/contest/1",
    "allowedPlatforms": ["youtube", "tiktok", "instagram"]
  }
}

Field Descriptions

campaignId

Unique identifier for the campaign. Used in API calls and URLs.

creator

Object containing the music creator's information:

  • name: Creator's display name

  • address: Ethereum wallet address (received deposit + collected entry fees)

  • profileUrl: Link to creator's OnlyDancers profile

song

Metadata about the song dancers will perform to:

  • title: Song name

  • artist: Artist name

  • duration: Song length in MM:SS format

  • platforms: URLs to the song on YouTube, TikTok, and Instagram for easy discovery

prizePool

Financial configuration:

  • creatorDeposit: Amount (in USDC cents) that the creator deposited as the base prize pool

  • entryFee: Amount ($5 USD) that each dancer pays to enter

  • currency: Token used for payouts (USDC)

  • rewardTokenAddress: Ethereum contract address of the USDC token

tiers

Array of reward tiers, each with:

  • name: Tier display name (e.g., "1st Place", "Lucky Draw", "Best Outfit")

  • prizePerWinner: Amount each winner in this tier receives (in USDC cents)

  • winners: Number of winners in this tier

totalWinners

Sum of all winners across all tiers. Fixed at campaign creation.

totalPrizePool

Total USDC available for payouts after all dancers have submitted entries.

status

Campaign state: "active", "judging", "completed", or "cancelled".

chain & chainId

Blockchain network: "ethereum", chainId 1 for mainnet.

contractAddress

Deployed FoomD2E smart contract address managing this campaign.

startDate & endDate

Campaign submission window in ISO 8601 format.

submissionRules

Constraints for dancer submissions:

  • maxSubmissionsPerDancer: How many entries each dancer can make (typically 1)

  • requiredDescription: The exact text that must appear in the video upload description

  • allowedPlatforms: Which platforms accept submissions (youtube, tiktok, instagram)