RapidWorkers Logo
Sign inSign up

API Management

Create and manage API keys for programmatic access to your account

Authentication Header

Include your API key in every request using the X-API-Key header:

X-API-Key: your_api_key_here

Endpoints
Standard Endpoints
POST

/jobs/add

Creates a new job/campaign with specified details. Requires multipart/form-data content type. Set approve_once_full to true to automatically approve all submissions and pay workers once the job reaches its total availabilities.

Request
Content-Type: multipart/form-data

title: string (required)
description: string (required)
pay_rate: decimal (required)
total_availabilities: integer (required)
proof_required_description: string (required)
category: string (required)
sub_category: string (optional)
campaign_image: file (optional)
countries: array (optional. Omit to include all countries)
approve_once_full: boolean (optional, default: false. When true, all submissions are automatically approved and workers paid once the job reaches its total availabilities)
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job": {
    "public_id": "123e4567-e89b-12d3-a456-426614174000",
    "title": "Test Job",
    "status": "Active",
    "pay_rate": "5.00",
    "total_availabilities": 10
  },
  "deduction_details": {
    "total_cost": "50.00",
    "commission": "5.00",
    "total_deducted": "55.00",
    "new_balance": "945.00"
  }
}
Error Responses
  • 400Invalid data or insufficient balance
  • 401Invalid or missing API key
  • 403Job rejected by legitimacy check
Code Example
import requests

# Create a job without image
job_data = {
    "title": "Complete a Survey",
    "description": "Fill out our 5-minute customer satisfaction survey",
    "pay_rate": "2.50",
    "total_availabilities": "100",
    "proof_required_description": "Submit a screenshot of the completion page",
    "category": "Survey",
    "sub_category": (None, "Customer Feedback"),
    "countries": (None, '["US", "CA", "GB"]'),  # Omit to include all countries
}
response = requests.post(
    "https://api.rapidworkers.io/jobs/add",
    headers={"X-API-Key": "your_api_key_here"},
    files=job_data
)
job = response.json()
print(f"Job created: {job['job']['public_id']}")
POST

/account/get_balance

Retrieves your current account balance.

Request
Content-Type: application/json
{} // Empty body
Response
// 200 OK
{
  "balance": "1000.00"
}
Error Responses
  • 401Invalid or missing API key
  • 404User not found
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/account/get_balance",
    headers={"X-API-Key": "your_api_key_here"}
)
print(f"Balance: {response.json()['balance']}")
POST

/api/campaigns/{campaign_id}/submissions/{submission_id}/approve/

Approves a worker's submission for your campaign.

Path Parameters
campaign_id (UUID)
submission_id (integer)
Request
Content-Type: application/json

{
  "notes": "Great work!" // Optional
}
Response
// 200 OK
{
  "success": true,
  "message": "Submission approved successfully",
  "submission": {
    "id": 123,
    "user": "worker_username",
    "status": "Approved",
    "amount_paid": "5.00"
  }
}
Error Responses
  • 400Submission already processed or insufficient funds
  • 403You don't own this campaign
  • 404Submission not found
Code Example
import requests

campaign_id = "your_campaign_public_id"
submission_id = 456

response = requests.post(
    f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/{submission_id}/approve/",
    headers={"X-API-Key": "your_api_key_here"},
    json={"notes": "Great work!"}
)
print(f"Submission approved: {response.json()}")
POST

/api/campaigns/{campaign_id}/submissions/{submission_id}/reject/

Rejects a worker's submission with a reason.

Path Parameters
campaign_id (UUID)
submission_id (integer)
Request
Content-Type: application/json

{
  "notes": "Does not meet requirements" // Required
}
Response
// 200 OK
{
  "success": true,
  "message": "Submission rejected",
  "submission": {
    "id": 123,
    "user": "worker_username",
    "status": "Rejected",
    "notes": "Does not meet requirements"
  }
}
Error Responses
  • 400Missing rejection reason
  • 403You don't own this campaign
  • 404Submission not found
Code Example
import requests

campaign_id = "your_campaign_public_id"
submission_id = 456

response = requests.post(
    f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/{submission_id}/reject/",
    headers={"X-API-Key": "your_api_key_here"},
    json={"notes": "Screenshot does not show completion page"}
)
print(f"Submission rejected: {response.json()}")
POST

/api/campaigns/{campaign_id}/submissions/bulk_action/

Approve all pending submissions for a campaign at once.

Path Parameters
campaign_id (UUID)
Request
Content-Type: application/json

{
  "notes": "Bulk action notes" // Optional
}
Response
// 200 OK
{
  "success": true,
  "message": "All submissions approved successfully.",
  "submissions": [
    { "id": 123, "status": "Approved", "user": "worker1" },
    { "id": 124, "status": "Approved", "user": "worker2" }
  ]
}
Error Responses
  • 403You don't own this campaign
  • 404No pending submissions found
Code Example
import requests

campaign_id = "your_campaign_public_id"

# Bulk approve all pending
response = requests.post(
    f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/bulk_action/",
    headers={"X-API-Key": "your_api_key_here"},
    json={"notes": "All submissions verified"}
)
print(f"Bulk action result: {response.json()}")
GET

/api/campaigns/

Retrieves all campaigns owned by the authenticated user, with optional status filtering.

Request
Query Parameters (optional):

status: string ("Active", "Pending", "Completed", "Canceled")
language: string (default: "en")
Response
// 200 OK
[
  {
    "jobId": "123e4567-e89b-12d3-a456-426614174000",
    "jobTitle": "Complete a Survey",
    "jobCategory": "Survey",
    "jobPay": "2.50",
    "jobLocation": "In",
    "jobCreatedAt": "2025-01-15T10:30:00Z",
    "jobStatus": "Active",
    "jobInstancesCompleted": 45,
    "jobTotalAvailabilities": 100,
    "jobSuccessRate": "40%",
    "description": "Fill out our customer satisfaction survey",
    "canceled": false,
    "remainingAvailabilities": 55,
    "pendingSubmissions": 12,
    "approvedSubmissions": 40,
    "rejectedSubmissions": 5
  }
]
Error Responses
  • 401Invalid or missing API key
Code Example
import requests

# List all campaigns
response = requests.get(
    "https://api.rapidworkers.io/api/campaigns/",
    headers={"X-API-Key": "your_api_key_here"}
)
campaigns = response.json()
for campaign in campaigns["results"]:
    print(f"{campaign['jobTitle']} - {campaign['jobStatus']}")

# Filter by status
response = requests.get(
    "https://api.rapidworkers.io/api/campaigns/?status=Active",
    headers={"X-API-Key": "your_api_key_here"}
)
GET

/api/campaigns/detail/{campaign_id}/

Retrieves detailed information about a specific campaign including submission counts and remaining availability.

Path Parameters
campaign_id (UUID)
Request
Query Parameters (optional):

language: string (default: "en")
Response
// 200 OK
{
  "jobId": "123e4567-e89b-12d3-a456-426614174000",
  "jobTitle": "Complete a Survey",
  "jobCategory": "Survey",
  "jobPay": "2.50",
  "jobLocation": "In",
  "jobCreatedAt": "2025-01-15T10:30:00Z",
  "jobStatus": "Active",
  "jobInstancesCompleted": 45,
  "jobTotalAvailabilities": 100,
  "jobSuccessRate": "40%",
  "description": "Fill out our customer satisfaction survey",
  "canceled": false,
  "remainingAvailabilities": 55,
  "pendingSubmissions": 12,
  "approvedSubmissions": 40,
  "rejectedSubmissions": 5
}
Error Responses
  • 401Invalid or missing API key
  • 403You don't own this campaign
  • 404Campaign not found
Code Example
import requests

campaign_id = "123e4567-e89b-12d3-a456-426614174000"
response = requests.get(
    f"https://api.rapidworkers.io/api/campaigns/detail/{campaign_id}/",
    headers={"X-API-Key": "your_api_key_here"}
)
campaign = response.json()
print(f"Remaining slots: {campaign['remaining_availabilities']}")
print(f"Pending: {campaign['pending_submissions']}")
GET

/api/campaigns/{campaign_id}/submissions/

Retrieves all submissions for a specific campaign with worker metadata, optional status filtering, and pagination.

Path Parameters
campaign_id (UUID)
Request
Query Parameters (optional):

status: string ("Pending", "Approved", "Rejected")
search: string (search by worker name)
page: integer (default: 1)
rowsPerPage: integer (default: 1000)
language: string (default: "en")
Response
// 200 OK
{
  "count": 45,
  "next": null,
  "previous": null,
  "results": {
    "submissions": [
      {
        "submissionId": 123,
        "userId": "abc-def-123",
        "userName": "WorkerName",
        "userAvatar": "https://...",
        "campaignId": "123e4567-e89b-12d3-a456-426614174000",
        "campaignTitle": "Complete a Survey",
        "status": "Pending",
        "country_name": "United States",
        "submittedAt": "2025-01-16T14:30:00Z",
        "proof_text": "Completed the survey as requested",
        "images": [
          { 
            "id": "img_1", 
            "url": "https://...", 
            "thumbnailUrl": "https://..." 
          }
        ],
        "notes": null,
        "workerAccountAgeDays": 120,
        "workerApprovalRate": "85%",
        "workerTotalCompleted": 47
      }
    ],
    "pagination": {
      "totalCount": 45,
      "pageCount": 1,
      "currentPage": 1,
      "rowsPerPage": 1000
    }
  }
}
Error Responses
  • 401Invalid or missing API key
  • 403You don't own this campaign
  • 404Campaign not found
Code Example
import requests

campaign_id = "123e4567-e89b-12d3-a456-426614174000"

# List all submissions
response = requests.get(
    f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/",
    headers={"X-API-Key": "your_api_key_here"}
)
data = response.json()
for sub in data["results"]["submissions"]:
    print(f"#{sub['submissionId']} - {sub['status']} - Age: {sub['worker_account_age_days']}d")

# Filter pending only
response = requests.get(
    f"https://api.rapidworkers.io/api/campaigns/{campaign_id}/submissions/?status=Pending",
    headers={"X-API-Key": "your_api_key_here"}
)
POST

/api/workers/block/

Blocks a worker from submitting proofs to any of your campaigns. Blocked workers will not see your campaigns in their job list.

Request
Content-Type: application/json

{
  "worker_id": 12345 // Worker public ID
}
Response
// 201 Created
{
  "success": true,
  "message": "Worker blocked successfully",
  "worker_id": 12345
}
Error Responses
  • 400Missing worker_id, self-block attempt, or worker already blocked
  • 401Invalid or missing API key
  • 404Worker not found
Code Example
import requests

worker_id = 12345

response = requests.post(
    "https://api.rapidworkers.io/api/workers/block/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={"worker_id": worker_id}
)
print(f"Worker blocked: {response.json()}")
POST

/api/workers/unblock/

Unblocks a previously blocked worker, allowing them to see and submit proofs to your campaigns again.

Request
Content-Type: application/json

{
  "worker_id": 12345
}
Response
// 200 OK
{
  "success": true,
  "message": "Worker unblocked successfully",
  "worker_id": 12345
}
Error Responses
  • 400Missing worker_id or worker is not blocked
  • 401Invalid or missing API key
  • 404Worker not found
Code Example
import requests

worker_id = 12345

response = requests.post(
    "https://api.rapidworkers.io/api/workers/unblock/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={"worker_id": worker_id}
)
print(f"Worker unblocked: {response.json()}")
GET

/api/workers/blocked/

Retrieves the list of all workers you have blocked.

Request
No request body required.
Response
// 200 OK
[
  {
    "worker_id": 12345,
    "worker_name": "WorkerName",
    "blocked_at": "2025-01-15T10:30:00Z"
  }
]
Error Responses
  • 401Invalid or missing API key
Code Example
import requests

response = requests.get(
    "https://api.rapidworkers.io/api/workers/blocked/",
    headers={"X-API-Key": "your_api_key_here"}
)
blocked = response.json()
for worker in blocked:
    print(f"Blocked: {worker['worker_name']} (ID: {worker['worker_id']})")

Prefilled Job Endpoints

Simplified endpoints for common social media engagement tasks. Only requires a link and quantity. All prefilled jobs have automatic approval enabled: submissions are automatically approved and workers paid once the job reaches its total availabilities.

POST

/api/jobs/facebook-likes/

Create a simplified job for getting Facebook post likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://facebook.com/post/123", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/facebook-likes/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://facebook.com/post/123",
        "quantity": 50  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/facebook-shares/

Create a simplified job for getting Facebook post shares. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://facebook.com/post/123", // Required
  "quantity": 25, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "1.25"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/facebook-shares/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://facebook.com/post/123",
        "quantity": 25  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/instagram-likes/

Create a simplified job for getting Instagram post likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://instagram.com/ABC123", // Required
  "quantity": 100, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "5.00"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/instagram-likes/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://instagram.com/ABC123",
        "quantity": 100  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/instagram-followers/

Create a simplified job for gaining Instagram followers. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://instagram.com/username", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/instagram-followers/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://instagram.com/username",
        "quantity": 50  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/twitter-likes/

Create a simplified job for getting Twitter/X post likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://twitter.com/user/status/123", // Required
  "quantity": 75, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "3.75"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/twitter-likes/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://twitter.com/user/status/123",
        "quantity": 75  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/twitter-followers/

Create a simplified job for gaining Twitter/X followers. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://twitter.com/username", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/twitter-followers/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://twitter.com/username",
        "quantity": 50  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/twitter-retweets/

Create a simplified job for getting Twitter/X retweets. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://twitter.com/user/status/123", // Required
  "quantity": 30, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "1.50"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/twitter-retweets/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://twitter.com/user/status/123",
        "quantity": 30  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/trustpilot-reviews/

Create a simplified job for getting Trustpilot reviews. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://trustpilot.com/review/example.com", // Required
  "quantity": 20, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "1.00"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/trustpilot-reviews/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://trustpilot.com/review/example.com",
        "quantity": 20  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/9gag-upvotes/

Create a simplified job for getting 9GAG upvotes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://9gag.com/gag/abc123", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/9gag-upvotes/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://9gag.com/gag/abc123",
        "quantity": 50  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")
POST

/api/jobs/youtube-likes/

Create a simplified job for getting YouTube video likes. Only requires a link and quantity. Auto-pricing: $0.05 per job. Submissions are automatically approved once the job is full.

Request
Content-Type: application/json

{
  "link": "https://youtube.com/watch?v=abc123", // Required
  "quantity": 100, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en" // Optional
}
Response
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "5.00"
}
Error Responses
  • 400Invalid data, insufficient balance, or quantity below minimum (6)
  • 401Invalid or missing API key
Code Example
import requests

response = requests.post(
    "https://api.rapidworkers.io/api/jobs/youtube-likes/",
    headers={"X-API-Key": "your_api_key_here", "Content-Type": "application/json"},
    json={
        "link": "https://youtube.com/watch?v=abc123",
        "quantity": 100  # Minimum: 6
    }
)
job = response.json()
print(f"Job created: {job['job_id']}")

Error Handling

All API errors follow a consistent format:

{
  "error": "Error message describing what went wrong"
}
Common HTTP Status Codes:
  • 200 Request succeeded
  • 201 Resource created successfully
  • 400 Invalid request data
  • 401 Missing or invalid API key
  • 403 Insufficient permissions
  • 404 Resource not found
  • 429 Rate limit exceeded (1,000/hour)
  • 500 Server-side error