title | string | yes | Max 200 characters. |
description | string | yes | Max 5000 characters. The title, description, completionCriteria and requirements may not ask for the work sooner than the bounty's lead time: in-person notice for the work location (12-48 hours), 4 days for RentAKaren orders, or the Signs lead time for sign-holding jobs. Text like "need this ASAP, in 1 hour" is refused, previews (dryRun) included, with 422 description_time_policy_violation: error (also message) explains it, field names where, quoted is the exact text, policyMinimum {product, rule, value, unit, label} is the minimum, earliestAllowed is the first allowed time (ISO 8601), and fix says how to change it. |
price | number (USD) | yes | Per-worker bounty price in US dollars (the hourly rate when priceType is hourly), not cents. In-person bounties in configured minimum-pay areas must meet the local hourly minimum; fixed prices are divided by estimatedHours for this check. For escrow-funded bounties, the total pool (spots × fixed price, or spots × hourly price × estimated hours) cannot exceed $10,000. |
estimatedHours | number | no | Expected working time per worker, in hours, at least 0.083 (5 minutes), e.g. 2. Required without a schedule; with a schedule, the total shift hours set it. |
priceType | "fixed" | "hourly" | no | Price interpretation. Defaults to fixed. |
completionCriteria | string | no | Definition of done. |
evidenceTypes | string[] | no | text, photo, video, or link. |
liveCaptureRequirement | "photo" | "video" | no | Require new completion evidence captured with the device camera. If evidenceTypes requires both photo and video, both must be captured live. Live video is limited to 60 seconds and 250 MiB; supported browsers request an ideal 1920 × 1080 camera stream. |
checkIns | object | no | Live selfie check-ins for in-person shifts: { enabled, intervalMinutes } with a whole-minute interval from 5 to 240. From Start until the job ends, hired workers take camera-only, location-stamped selfies in the job chat; the poster sees each photo, server time, distance, flags, and missed slots, never raw coordinates. Enabled check-ins require location.isRemoteAllowed false. The default is every 15 minutes for sign-holding campaigns and off otherwise. |
category | "computer-gigs" | "creative-gigs" | "crew-gigs" | "domestic-gigs" | "event-gigs" | "labor-gigs" | "talent-gigs" | "writing-gigs" | no | Category slug, default computer-gigs. Any other value is refused with 400 invalid_category. |
skillsNeeded | string[] | no | Required skills. |
location | object | no | city, state, country, isRemoteAllowed. To target an entire country, provide only its ISO country code and omit city/state; isRemoteAllowed false makes the bounty in-person. Unsupported countries are rejected. |
supportedCountries | string[] | no | Countries whose workers may see and apply, as ISO codes (country names are recognized), e.g. ["US", "CA", "GB", "NZ", "AU"]; normalized and deduplicated. Omit to keep the location-derived policy: a country-only location restricts to that country, an on-site city location keeps its country gate, other locations stay unrestricted. When location.country is set it must be in the list, and on-site bounties (isRemoteAllowed false) accept only that country. Unsupported or unrecognized countries are rejected. With identityRequired the list is enforced against the verified document country. |
deadline | string | no | Application cutoff as an ISO timestamp. For in-person work (location.isRemoteAllowed=false), minimum notice is 24 hours in New York City (US), Vancouver (CA), and Toronto (CA); 12 hours in San Francisco (US); 48 hours elsewhere. Remote bounties only require a future deadline. Unchanged deadlines may be kept unless changing the physical work location or switching remote work to in-person. At or after this time, the listing leaves discovery and rejects new applications and direct uploads. Accepted workers have no separate completion countdown. A bounty with a schedule also closes applications when its last shift ends, and a deadline after that is stored as that end. |
spotsAvailable | number | no | Number of workers, default 1. For escrow-funded bounties, the resulting total pool cannot exceed $10,000. |
bonuses | Bonus[] | no | Optional per-seat bonuses, up to 10: [{ title, condition, unitAmountCents, maxUnits? }] with unitAmountCents in USD cents (at least 50) and maxUnits 1-100 (default 1). Only USD bounties funded from the wallet; each seat is funded at base pay plus every bonus at its maximum. Card, sponsored, managed, QA, taste, Signs, RentAKaren, pay-after-review and enterprise bounties are refused with an error_code starting bonus_. |
completionWindowHours | number | no | AI-managed bounties only (aiManaged: true): the managed work window in whole hours (1-720), replacing the default 6-hour window; out-of-range values are rejected with 400. Ordinary bounties have no completion deadline and ignore it. |
startWindowMinutes | number | no | Minutes a hired worker has to start the work, from 5 to 1440, e.g. 30. The minutes count from the worker’s confirmation, or from scheduledStartAt when that is later; a bounty with a schedule ignores this field. |
scheduledStartAt | string | no | The time the work starts, as ISO 8601 with a UTC offset, e.g. 2027-03-06T09:00:00-06:00. It must be in the future, and startWindowMinutes counts from it; for work on set dates and times, send schedule. With a schedule, the first shift sets it, and a different value returns 400 schedule_start_mismatch. |
scheduledStartTimeZone | string | no | The IANA time zone name workers see the start time in, such as America/Chicago. Send it with scheduledStartAt. |
schedule | object | no | The bounty's schedule: the shifts when the work happens and their time zone, e.g. {"timeZone":"America/Chicago","shifts":[{"date":"2027-03-06","start":"09:00","end":"17:00"}]}. Each shift ends before the next one starts, and on an in-person bounty each shift starts at least the location's minimum notice ahead, 48 hours in most places. |
schedule.timeZone | string | no | The IANA time zone name of every shift time, such as America/Chicago. Required. |
schedule.shifts | object[] | no | The shifts, each one date with a start and end time, e.g. [{"date":"2027-03-06","start":"09:00","end":"17:00"}]. At least one. |
attendanceRadiusMeters | number | no | In-person attendance: radius in meters around the job site (the bounty’s geocoded location) within which a hired worker counts as on site while attendance tracking is on. Integer 50-2000, default 150. Only used when location.isRemoteAllowed is false. |
requirePreciseLocation | boolean | no | In-person jobs only: require precise location sharing so you can see each hired worker on a map (GET /api/attendance/sessions/:sessionId/track) once they accept the notice in the app. Needs location.isRemoteAllowed false and a city or address, plus preciseLocationTermsVersion. Applicants see the requirement; it binds only people who apply after it is set (earlier applicants and hired workers stay status-only). |
preciseLocationTermsVersion | "poster-precise-location-v1" | no | Send with requirePreciseLocation true to accept the poster terms: use the location only to check attendance for this job; never share or keep it outside rentahuman.ai. |
responseWindowHours | number | no | Ghost response policy: hours (1-720) an accepted worker may stay silent (no message or submission) before the seat is flagged and you are notified. Silent workers are nudged at half the window. |
autoExpireGhosts | boolean | no | With responseWindowHours set, auto-release a silent seat at the deadline (application expired, seat freed, listing reopened) instead of only flagging it. Stored exactly as sent; false is kept, not dropped. |
completionQuestions | object[] | no | Mandatory questions the accepted WORKER answers when submitting evidence: [{ id?, prompt, required? }], max 10, prompts up to 300 characters, required defaults to true. Shown to applicants before they apply. Distinct from applicationDetails, which screens applicants. |
identityRequired | boolean | no | Require applicants to pass an identity check (government ID) before applying. Verified once per account and reused across bounties. Default false. |
excludedParticipantSourceBountyIds | string[] | no | Exclude previous participants: ids of your own earlier regular bounties (max 1000). Anyone ever accepted on one of them cannot see or apply to this bounty. Editable later with PATCH. |
linkedinVerifiedRequired | boolean | no | Applicants must have a verified LinkedIn (signed in with LinkedIn OAuth on their account; a pasted URL does not count) before applying. Others get 403 linkedin_verification_required. Default false. |
micCheckRequired | boolean | no | Require applicants to record an on-device microphone sample before applying. The recording is scored (background noise, clipping, Bluetooth-headset bandwidth, DNSMOS speech quality) and appears as micCheck on each application. With an explicit autoAcceptMinMicScore, automatic review rejects scores below that cutoff; without one, below-default scores stay pending for manual review. Default false. |
languageProficiencyRequirement | object | no | Optional English speaking-proficiency gate: { language: "en", minimumCefr: "A2" | "B1" | "B2" | "C1" | "C2" }. Applicants record about 45 seconds of speech in the Rent A Human web or mobile app; the recording is transcribed and scored automatically, and only a scored band at or above minimumCefr can apply. Unscorable recordings ask for a retry (6 attempts per 30 days); a scored result is saved on the worker profile as a lasting credential (public languageProficiencySummaries), reused across bounties without expiry, and re-checked against the current threshold at acceptance. 400 for unsupported languages or CEFR outside A2-C2. Separate from micCheckRequired. |
nativeLanguageRequirement | object | no | Optional native-speaker test gate: { language: "yue" | "cmn" | "tr" } (Cantonese, Mandarin, Turkish). Applicants take a timed quiz and short recording in the Rent A Human app, scored as pass, review, or fail. A pass admits the application and saves a lasting "Native <language>" profile credential. A borderline review result also admits an ordinary application, flags it for the poster with the recording available, and is never auto-accepted; managed-run bounties require a pass. The result is re-checked at acceptance. 400 for any other language, including English. Independent of languageProficiencyRequirement. |
karen | boolean | no | RentAKaren order: hire an approved RentAKaren negotiator. Requires priceType 'hourly' at ≥ $5/h (≥ $10/h with an English languageProficiencyRequirement) and a deadline ≥ 4 days out (defaults to 14 days). Only callers approved by RentAHuman can apply or be accepted. The hired caller records calls in the in-app call console; final submission requires at least one call recorded by that worker (400 call_recording_required with callsPath). Follow callsPath while signed in to open the console. Buyers can review the recordings, summaries and transcripts. Put every personal detail (names, phone, account numbers, the full story) in startInstructions; keep title and description general (personal details in public fields are refused with karen_public_details) and call the worker "the caller", never a Karen ("Karen" in title, description, requirements, skillsNeeded, completionCriteria or evidenceCriteria is rewritten to "caller"). Cannot be changed after creation. Refusals are 400 with code karen_requires_hourly, rate_below_minimum (minimumRateCents), deadline_too_soon (earliestDeadline, minimumDeadlineDays) or deadline_too_far (latestDeadline); applicants without an approved Karen badge get 403 karen_badge_required. |
autoAccept | boolean | no | Automatically review applicants as they apply; your blocklist always applies. Qualified applicants are accepted and clear mismatches are rejected with a reason. Applications the review cannot decide stay pending for your manual review. Default false; pass true to enable AI screening, or leave it off to review every application yourself. aiManaged: true turns it on. AI screening needs an application step. |
autoAcceptMinMicScore | number | no | Minimum overall DNSMOS speech-quality score (1-5) an applicant’s mic recording must reach on micCheckRequired bounties. Setting it makes the score a hard cutoff for automatic review: below it the application is auto-rejected with a reason, at/above it proceeds toward acceptance; unscored recordings always stay pending. Unset = platform default 3.0, below which applications only stay pending for manual review. |
requiredLinks | object[] | no | Applicant links. |
applicationDetails | object[] | no | Applicant detail items for standard application bounties: questions, acknowledgments, one-file image/DOCX uploads, or one required camera-only live video. Updates affect future applications; existing applications retain the answers collected under their original fields. |
lifecycleMessages | object | no | Optional onAccepted, onRejected, onSubmissionReceived, onSubmissionApproved, and onSubmissionRejected message templates. Supports {{name}}, {{bountyTitle}}, {{deadline}} (AI-managed work deadline; empty otherwise), and {{reason}}; acceptance and submission templates are only sent to accepted applicants. |
submissionMode | "application" | "photo_upload" | "video_upload" | "document_upload" | no | Upload-collection bounties gather files directly instead of applications. Requires the matching photoSubmission, videoSubmission, or documentSubmission settings (max files, consentText, confirmationMessage). |
idempotencyKey | string | no | Optional 24-hour dedupe key. May also be supplied as the Idempotency-Key header. |
dryRun | boolean | no | true validates and previews the bounty, including the funding total, without creating it, reserving funds or starting checkout. Call it first and show the preview before the real create. The response carries fundingTotal in US dollars and perSeat { baseCents, bonusesCents, feeCents, totalCents } in US cents. |