PRIV ProtocolPRIV Docs
Data Bounty Board

Submitting Data

Contributor guide for finding bounties, submitting content, and earning PRIV tokens on the Data Bounty Board.

Getting Started as a Contributor

The Data Bounty Board allows you to earn PRIV tokens by providing data that businesses need for AI training, research, and analytics.

Prerequisites

  1. PRIV account - Sign up at app.privlabs.io
  2. Connected wallet - Link your Ethereum wallet for payouts
  3. Age verification - Most bounties require contributors to be 18+
  4. Reputation building - Start with entry-level bounties to build your reputation

Finding Bounties

Browse Available Bounties

Navigate to the Data Bounty Board section to see all active bounties:

# API: Browse public bounties
curl https://api.privlabs.io/v1/b2b/requests/browse \
  -H "Authorization: Bearer your_token"

Filter by Type

FilterDescription
Typeimage, video, audio, voice, text, behavioral, location
Price RangeMinimum/maximum PRIV per submission
TagsTopic keywords
Reputation RequiredFilter by your current level

Bounty Details

Each bounty includes:

┌─────────────────────────────────────────────────────────────────┐
│  Urban Street Photography Dataset                    Active     │
│  by AI Vision Labs                                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  Type: Images          Price: 0.50 PRIV per item               │
│  Target: 10,000        Progress: 3,247 / 10,000 (32%)          │
│  Expires: June 1, 2026                                         │
│  Escrow: 5,000 PRIV locked in BountyEscrow.sol                 │
│                                                                 │
│  Requirements:                                                  │
│  ├── Min Resolution: 1920x1080                                 │
│  ├── Format: JPEG                                              │
│  ├── Reputation Level: 1+                                      │
│  └── Approver Voting: Yes                                      │
│                                                                 │
│  Consent Required:                                              │
│  ├── AI Training: Yes                                          │
│  └── Commercial Use: Yes                                       │
│                                                                 │
│  Tags: photography, urban, street, computer-vision             │
│                                                                 │
│  [View Details]  [Opt In]                                      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

Opting Into Bounties

Before submitting data, you must opt into a bounty to confirm you meet the requirements and accept the terms.

Opt-In Process

  1. Review requirements - Ensure you can provide the requested data type and quality
  2. Check consent requirements - Understand how your data will be used
  3. Confirm eligibility - Verify you meet age and geographic requirements
  4. Accept terms - Agree to the bounty-specific terms
# API: Opt into a bounty
curl -X POST https://api.privlabs.io/v1/b2b/requests/req_a1b2c3/opt-in \
  -H "Authorization: Bearer your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "confirmedAge": true,
    "agreedToTerms": true,
    "consent": {
      "aiTraining": true,
      "commercial": true,
      "research": false
    }
  }'

Only opt in if you can genuinely provide the requested data. Opting in and not submitting, or submitting low-quality data, affects your reputation.

Submission Requirements

File Format Guidelines

Each bounty type has specific format requirements:

Images

RequirementLimits
File TypesJPEG, PNG, WebP, HEIC, GIF, BMP, TIFF
Max File Size25 MB
Resolution100x100 to 10000x10000 pixels
Quality ScoreMinimum 0.3 (auto-assessed)

Videos

RequirementLimits
File TypesMP4, WebM, MOV, AVI, MKV, MPEG
Max File Size500 MB
Duration1 second to 1 hour
Resolution240p to 4K
FPS10-120 fps

Audio

RequirementLimits
File TypesMP3, WAV, WebM, OGG, M4A, FLAC, AAC
Max File Size100 MB
Duration1 second to 2 hours
Sample Rate8kHz to 192kHz

Voice Recordings

RequirementLimits
File TypesMP3, WAV, WebM, OGG, MP4
Max File Size50 MB
Duration1 second to 30 minutes
Sample RateMinimum 16kHz
Speech DetectionMinimum 50% speech content

Text

RequirementLimits
File TypesPlain text, JSON, CSV, Markdown
Max File Size5 MB
Character Count10 to 1,000,000
Word CountMinimum 3 words
LanguagesEN, ES, FR, DE, ZH, JA, KO, PT, RU, AR

Content Ownership

You must certify that:

  • You created the content or have rights to distribute it
  • No copyright violations - Content is original or properly licensed
  • No third-party claims - No one else can claim ownership

Submitting Data

Step 1: Prepare Your File

Ensure your file meets all requirements before uploading:

// Client-side file preparation
const file = document.getElementById('fileInput').files[0];

// Calculate SHA-256 hash for deduplication
const hashBuffer = await crypto.subtle.digest('SHA-256', await file.arrayBuffer());
const hashArray = Array.from(new Uint8Array(hashBuffer));
const fileHash = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');

console.log('File hash:', fileHash);

Step 2: Upload to IPFS

Content is stored on IPFS for decentralization:

# Upload file and get CID
curl -X POST https://api.privlabs.io/v1/storage/upload \
  -H "Authorization: Bearer your_token" \
  -F "file=@photo.jpg"

# Response
{
  "success": true,
  "data": {
    "cid": "QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy",
    "size": 2048576
  }
}

Step 3: Submit to Bounty

curl -X POST https://api.privlabs.io/v1/b2b/requests/req_a1b2c3/submit \
  -H "Authorization: Bearer your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "fileHash": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6",
    "ipfsCid": "QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy",
    "fileSizeBytes": 2048576,
    "mimeType": "image/jpeg",
    "filename": "street_scene_001.jpg",
    "description": "Urban street scene in downtown Tokyo",
    "consent": {
      "aiTraining": true,
      "commercial": true,
      "research": false,
      "confirmedAge": true,
      "agreedToTerms": true
    },
    "attributes": {
      "width": 3840,
      "height": 2160
    },
    "metadata": {
      "camera": "Sony A7III",
      "location": "Tokyo, Japan",
      "date": "2026-01-15"
    }
  }'

Response

{
  "success": true,
  "data": {
    "submission": {
      "id": "sub_x1y2z3",
      "requestId": "req_a1b2c3",
      "status": "pending",
      "fileHash": "a1b2c3...",
      "qualityScore": null,
      "auditStatus": "pending",
      "paymentStatus": null,
      "createdAt": "2026-02-04T10:30:00Z"
    },
    "message": "Submission received and queued for approver voting",
    "estimatedPayout": "0.425000"
  }
}

Submission Lifecycle

┌─────────┐     ┌────────────┐     ┌──────────┐
│ Pending │ ──> │ Validating │ ──> │ Approved │
└─────────┘     └────────────┘     └──────────┘
     │                │                  │
     │                │                  ▼
     │                │            ┌──────────────┐
     │                │            │ Approver     │ (if required)
     │                │            │ Voting       │
     │                │            └──────────────┘
     │                │                  │
     │                │         ┌────────┴────────┐
     │                │         ▼                 ▼
     │                │   Vote Passed       Vote Failed
     │                │         │                 │
     │                │         ▼                 │
     │                │  ┌─────────────────┐      │
     │                │  │ Escrow Payout   │      │
     │                │  └─────────────────┘      │
     │                │         │                 │
     │                │         ▼                 │
     │                │      ┌──────┐             │
     │                └──>   │ Paid │             │
     │                       └──────┘             │
     │                                            │
     └────────> Rejected <────────────────────────┘
               Flagged (manual review)

Tracking Submissions

View Your Submissions

curl https://api.privlabs.io/v1/b2b/submissions/my \
  -H "Authorization: Bearer your_token"

Submission Statuses

StatusDescriptionAction
PendingReceived, awaiting processingWait
ValidatingBeing automatically checkedWait
ApprovedPassed validationWaiting for approver voting or payment
RejectedFailed validationReview reason, improve
FlaggedNeeds manual reviewWait for decision
Under ReviewBeing reviewed by staked approversWait
Vote PassedApproved by approver consensusPayment processing
Vote FailedRejected by approver consensusReview feedback
Payment PendingEscrow payout being processedWait
PaidEarnings sent to wallet from escrowClaim from dashboard

Earnings and Payments

Payout Calculation

Your earnings per approved submission:

Submission Price:              0.50 PRIV
├── Your Payout (97%):         0.485 PRIV
└── Protocol Fee (3%):         0.015 PRIV

With Approver Voting Premium (+25%):
├── Your Payout:               0.485 PRIV
└── Approver Reward:           0.125 PRIV

Claiming Earnings

Earnings are credited to your PRIV balance instantly from escrow upon approval. Claim to your wallet:

curl -X POST https://api.privlabs.io/v1/user/earnings/claim \
  -H "Authorization: Bearer your_token" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "100.00",
    "walletAddress": "0x..."
  }'

Earnings Dashboard

Track your earnings in the dashboard:

MetricDescription
Total EarnedLifetime earnings
PendingAwaiting approval/approver voting
AvailableReady to claim
ClaimedWithdrawn to wallet

Best Practices

Maximizing Approval Rate

  1. Read instructions carefully - Follow every requirement exactly
  2. Check sample content - Match the style and quality shown
  3. Review before submitting - Double-check file quality
  4. Provide accurate metadata - Don't guess or make up details

Avoiding Rejection

Common rejection reasons:

IssueSolution
Wrong formatConvert to required format
Low resolutionUse higher quality source
Contains prohibited contentRe-read prohibited list
Duplicate contentOnly submit original work
Missing metadataFill in all required fields

Building Reputation

ActionReputation Impact
Approved submission+1 point
Rejected submission-2 points
Flagged for fraud-20 points + penalty
Consistent qualityBonus at milestones

Reaching Level 2 reputation unlocks staked approver privileges, allowing you to earn additional income by reviewing others' submissions.

Code Examples

JavaScript SDK Integration

import { PrivClient } from '@priv/sdk';

const priv = new PrivClient({
  apiKey: process.env.PRIV_API_KEY,
});

// Browse available bounties
const bounties = await priv.b2b.requests.browse({
  type: 'image',
  minPrice: 0.1,
  maxPrice: 1.0,
});

// Opt into a bounty
await priv.b2b.requests.optIn('req_a1b2c3', {
  consent: {
    aiTraining: true,
    commercial: true,
    research: false,
  },
});

// Upload and submit
const { cid } = await priv.storage.upload(file);
const submission = await priv.b2b.requests.submit('req_a1b2c3', {
  ipfsCid: cid,
  fileHash: await calculateHash(file),
  fileSizeBytes: file.size,
  mimeType: file.type,
  consent: {
    aiTraining: true,
    commercial: true,
    research: false,
    confirmedAge: true,
    agreedToTerms: true,
  },
});

console.log('Submission ID:', submission.id);
console.log('Estimated payout:', submission.estimatedPayout);

Batch Submissions

// Submit multiple files efficiently
const files = [...document.querySelectorAll('input[type=file]')]
  .flatMap(input => [...input.files]);

const submissions = await Promise.all(
  files.map(async (file) => {
    const { cid } = await priv.storage.upload(file);
    const hash = await calculateHash(file);

    return priv.b2b.requests.submit('req_a1b2c3', {
      ipfsCid: cid,
      fileHash: hash,
      fileSizeBytes: file.size,
      mimeType: file.type,
      consent: defaultConsent,
    });
  })
);

console.log(`Submitted ${submissions.length} files`);

Troubleshooting

IssueSolution
"You must opt in first"Complete opt-in before submitting
"File hash already exists"Content was already submitted
"Bounty not accepting submissions"Bounty is paused/fulfilled/expired
"Insufficient reputation"Build reputation on easier bounties
"Consent mismatch"Ensure consent matches bounty requirements

Next Steps