Documentation

Home › API Management

API Management

Create and manage API keys for programmatic access to your account

Log in to your account to generate and manage API keys.

Authentication Header

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

HTTP
X-API-Key: your_api_key_here

Rate limit: 1,000 requests per hour per API key

Endpoints

Standard Endpoints

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.

Content-Type:multipart/form-data

titlestringrequired
descriptionstringrequired
pay_ratedecimalrequired
total_availabilitiesintegerrequired
proof_required_descriptionstringrequired
categorystringrequired
sub_categorystring
campaign_imagefile
countriesarray

Omit to include all countries

approve_once_fullboolean

default: false. When true, all submissions are automatically approved and workers paid once the job reaches its total availabilities

python
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']}")
JSON
// 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"
  }
}

400Invalid data or insufficient balance

401Invalid or missing API key

403Job rejected by legitimacy check

Retrieves your current account balance.

Content-Type:application/json

JSON
{} // Empty body
python
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']}")
JSON
// 200 OK
{
  "balance": "1000.00"
}

401Invalid or missing API key

404User not found

Approves a worker's submission for your campaign.

Path Parameters

campaign_idUUID
submission_idinteger

Content-Type:application/json

JSON
{
  "notes": "Great work!" // Optional
}
python
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()}")
JSON
// 200 OK
{
  "success": true,
  "message": "Submission approved successfully",
  "submission": {
    "id": 123,
    "user": "worker_username",
    "status": "Approved",
    "amount_paid": "5.00"
  }
}

400Submission already processed or insufficient funds

403You don't own this campaign

404Submission not found

Rejects a worker's submission with a reason.

Path Parameters

campaign_idUUID
submission_idinteger

Content-Type:application/json

JSON
{
  "notes": "Does not meet requirements" // Required
}
python
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()}")
JSON
// 200 OK
{
  "success": true,
  "message": "Submission rejected",
  "submission": {
    "id": 123,
    "user": "worker_username",
    "status": "Rejected",
    "notes": "Does not meet requirements"
  }
}

400Missing rejection reason

403You don't own this campaign

404Submission not found

Approve all pending submissions for a campaign at once.

Path Parameters

campaign_idUUID

Content-Type:application/json

JSON
{
  "notes": "Bulk action notes" // Optional
}
python
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()}")
JSON
// 200 OK
{
  "success": true,
  "message": "All submissions approved successfully.",
  "submissions": [
    { "id": 123, "status": "Approved", "user": "worker1" },
    { "id": 124, "status": "Approved", "user": "worker2" }
  ]
}

403You don't own this campaign

404No pending submissions found

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

statusstring

"Active", "Pending", "Completed", "Canceled"

languagestring

default: "en"

python
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"}
)
JSON
// 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
  }
]

401Invalid or missing API key

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

Path Parameters

campaign_idUUID
languagestring

default: "en"

python
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']}")
JSON
// 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
}

401Invalid or missing API key

403You don't own this campaign

404Campaign not found

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

Path Parameters

campaign_idUUID
statusstring

"Pending", "Approved", "Rejected"

searchstring

search by worker name

pageinteger

default: 1

rowsPerPageinteger

default: 1000

languagestring

default: "en"

python
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"}
)
JSON
// 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
    }
  }
}

401Invalid or missing API key

403You don't own this campaign

404Campaign not found

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

Content-Type:application/json

JSON
{
  "worker_id": 12345 // Worker public ID
}
python
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()}")
JSON
// 201 Created
{
  "success": true,
  "message": "Worker blocked successfully",
  "worker_id": 12345
}

400Missing worker_id, self-block attempt, or worker already blocked

401Invalid or missing API key

404Worker not found

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

Content-Type:application/json

JSON
{
  "worker_id": 12345
}
python
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()}")
JSON
// 200 OK
{
  "success": true,
  "message": "Worker unblocked successfully",
  "worker_id": 12345
}

400Missing worker_id or worker is not blocked

401Invalid or missing API key

404Worker not found

Retrieves the list of all workers you have blocked.

Request
No request body required.
python
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']})")
JSON
// 200 OK
[
  {
    "worker_id": 12345,
    "worker_name": "WorkerName",
    "blocked_at": "2025-01-15T10:30:00Z"
  }
]

401Invalid or missing API key

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.

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.

Content-Type:application/json

JSON
{
  "link": "https://facebook.com/post/123", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en", // Optional
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

JSON
{
  "link": "https://facebook.com/post/123", // Required
  "quantity": 25, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en", // Optional
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "1.25"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

JSON
{
  "link": "https://instagram.com/ABC123", // Required
  "quantity": 100, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en", // Optional
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "5.00"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

JSON
{
  "link": "https://instagram.com/username", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en", // Optional
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

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
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "3.75"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

JSON
{
  "link": "https://twitter.com/username", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "CA"], // Omit to include all countries
  "language": "en", // Optional
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

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
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "1.50"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

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
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "1.00"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

JSON
{
  "link": "https://9gag.com/gag/abc123", // Required
  "quantity": 50, // Required (minimum: 6)
  "countries": ["US", "GB"], // Omit to include all countries
  "language": "en", // Optional
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "2.50"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

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.

Content-Type:application/json

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
  "approve_once_full": true // Optional (default: true). Auto-approve all submissions once job is full
}
python
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']}")
JSON
// 201 Created
{
  "success": true,
  "message": "Job created successfully",
  "job_id": "123e4567-e89b-12d3-a456-426614174000",
  "total_cost": "5.00"
}

400Invalid data, insufficient balance, or quantity below minimum (6)

401Invalid or missing API key

Error Handling

All API errors follow a consistent format:

JSON
{
  "error": "Error message describing what went wrong"
}

Common HTTP Status Codes:

Status CodeStatusDescription
200OKRequest succeeded
201CreatedResource created successfully
400Bad RequestInvalid request data
401UnauthorizedMissing or invalid API key
403ForbiddenInsufficient permissions
404Not FoundResource not found
429Rate LimitedRate limit exceeded (1,000/hour)
500Server ErrorServer-side error