Creators

Create a new job

Creates a discovery job posting as a draft with product, requirements, application challenge, and payment configuration. The body and the application challenge are written as markdown (bodyMarkdown, challengeBriefMarkdown) or TipTap JSON (body, challengeBrief); reads return both.

post/jobs

Request

  • Base URL: https://viral.app/api/v1
  • URL: https://viral.app/api/v1/jobs
  • Auth: API key in header x-api-key

Request body

productTitlestring required

Product the job promotes

productDescriptionstring required

Short product description shown in the listing

logoUrlstring

Template URL of the uploaded product logo

productNichesstring[] required

Product niches (shared taxonomy with creator discovery profiles)

contentFormatsstring[]

Content formats the job asks for; empty accepts any

countryResidencesstring[]

Countries of residence creators may apply from (ISO3); empty accepts any

languagesstring[]

Content languages the creator must produce in; empty accepts any

minAgeinteger

Minimum creator age (no maximum age by design)

aiContentPolicy'real_only' | 'ai_only'

AI content requirement — 'real_only' excludes fully-AI creators, 'ai_only' excludes real-only creators; unset accepts both

jobType'canvas_ugc' | 'influencer' | 'ugc_ads' | 'creator_manager' | 'other' required
minWeeklyHoursinteger

Minimum weekly hours the creator must have available

minWeeklyVideosinteger

Minimum videos per week the creator must be able to produce

platformFocusstring[]

Platforms the content is produced for

accountType'new_account' | 'personal_account' | 'company_account'
exampleVideoUrlsstring[]

Example video links (TikTok, Instagram Reels, YouTube); each becomes an example-video tile on the posting at save time, tracked as a reference — a link that cannot be fetched stays a plain link. Ignored when exampleVideos is sent.

videoSubmissionRequiredboolean
challengeBriefMarkdownstring nullable

Markdown: ##/### headings, paragraphs, bold, italic, links, images alt, - and 1. lists, and $variable placeholders. Code, quotes, rules and tables fall back to plain paragraphs.

currency'USD' | 'EUR' | 'CHF' | 'GBP' | 'CNY' | 'JPY' | 'KRW' | 'THB' | 'IDR' | 'VND' | 'RUB' required
payFrequency'one_time' | 'per_day' | 'per_week' | 'per_month' required
flatSalaryAmountinteger

Amount in minor units of the job currency

perVideoAmountinteger

Amount in minor units of the job currency

cpmAmountinteger

Amount in minor units of the job currency

bonusAmountinteger

The HIGHEST one-time bonus a single video can earn, in minor units of the job currency (creators read it as 'Bonus up to …'). The view milestones are campaign terms; a rate per 1,000 views is cpmAmount, never a bonus.

bodyMarkdownstring nullable

Markdown: ##/### headings, paragraphs, bold, italic, links, images alt, - and 1. lists, and $variable placeholders. Code, quotes, rules and tables fall back to plain paragraphs.

Example request

{
  "productTitle": "Habit Tracker Pro",
  "productDescription": "A habit tracking app that keeps you accountable with streaks and reminders.",
  "productNiches": [
    "productivity",
    "health_wellness"
  ],
  "contentFormats": [
    "talking_head",
    "product_demo"
  ],
  "languages": [
    "en"
  ],
  "minAge": 18,
  "jobType": "canvas_ugc",
  "minWeeklyHours": 5,
  "minWeeklyVideos": 5,
  "platformFocus": [
    "tiktok",
    "instagram",
    "youtube"
  ],
  "accountType": "new_account",
  "exampleVideoUrls": [],
  "videoSubmissionRequired": false,
  "sampleVideoUrls": [],
  "currency": "USD",
  "payFrequency": "per_month",
  "flatSalaryAmount": 200000,
  "perVideoAmount": 2500
}

Response

OK

idstring required
status'draft' | 'public' | 'paused' required
productTitlestring required
productDescriptionstring required
logoUrlstring nullable required
productNichesstring[] required
contentFormatsstring[] required
countryResidencesstring[] required
languagesstring[] required
minAgeinteger nullable required
aiContentPolicystring nullable required
jobTypestring required
minWeeklyHoursinteger nullable required
minWeeklyVideosinteger nullable required
platformFocusstring[] required
accountTypestring nullable required
exampleVideoUrlsstring[] required
videoSubmissionRequiredboolean required
sampleVideoUrlsstring[] required
currencystring required
payFrequencystring required
flatSalaryAmountinteger nullable required
perVideoAmountinteger nullable required
cpmAmountinteger nullable required
bonusAmountinteger nullable required
publishedAtstring date-time nullable required
embeddingunknown
embeddingModelstring nullable required
embeddedAtstring date-time nullable required
firstMatchesNotifiedAtstring date-time nullable required
pausedReasonstring nullable required
createdAtstring date-time required
updatedAtstring date-time required
actorType'user' | 'system' | 'api_token' required
userIdstring required
orgIdstring required
bodyMarkdownstring nullable required

The posting's body as markdown; null without a body

challengeBriefMarkdownstring nullable required

The application challenge as markdown; null without one

Changes

No recorded changes to this operation across all 1 revision of this API.