{"openapi":"3.1.0","info":{"title":"AI Trainer Jobs API","version":"1.0.0","description":"Find paid, remote AI trainer jobs. This read-only API needs no account or API key. Apply links are free for candidates.\n\nVersioning: the major version is in the path (/api/v1). Version 1 only gets backward-compatible changes, such as new optional parameters or new response fields. A breaking change gets a new path (/api/v2). A deprecated path keeps working and sends a Deprecation header (RFC 9745) and a Link header with rel=\"successor-version\". Before a path is removed, it sends a Sunset header (RFC 8594) at least 90 days ahead.\n\nRate limits: 60 requests per 60 seconds per client IP. API responses have RateLimit and RateLimit-Policy headers (draft-ietf-httpapi-ratelimit-headers). A 429 response also has Retry-After in seconds.","contact":{"name":"Danilo","url":"https://aitrainerjobs.co/contact","email":"danilo@aitrainerjobs.co"}},"externalDocs":{"description":"AI Trainer Jobs API documentation","url":"https://aitrainerjobs.co/developers"},"security":[],"servers":[{"url":"https://aitrainerjobs.co"}],"paths":{"/api/v1/jobs":{"get":{"operationId":"listJobs","summary":"Search open AI trainer jobs","description":"Use this to find remote AI trainer jobs that match a skill, pay floor, or country. Results contain listed open jobs, newest first. Send users to apply_url or url. Use limit and offset for more results.","parameters":[{"name":"category","in":"query","description":"Limit results to one category.","schema":{"type":"string","enum":["coding","stem","medical","legal","finance","languages","voice-video","creative","generalist","robotics"]}},{"name":"q","in":"query","description":"Case-insensitive text search in title, company, and skills.","schema":{"type":"string"}},{"name":"min_pay","in":"query","description":"Minimum listed maximum hourly pay in USD. For one-time and per-task jobs, compares the listed amount.","schema":{"type":"number","minimum":0}},{"name":"pay_type","in":"query","description":"Pay period: hour, one-time payment (once), or per task.","schema":{"type":"string","enum":["hour","once","task"]}},{"name":"country","in":"query","description":"ISO 3166-1 alpha-2 country code, such as BR. Includes jobs that list this country or state no country limit. Codes are case-insensitive.","schema":{"type":"string","pattern":"^[A-Za-z]{2}$"}},{"name":"limit","in":"query","description":"Number of jobs per response.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"offset","in":"query","description":"Number of matching jobs to skip.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Matching jobs and total count before pagination.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobList"}}}},"400":{"description":"Invalid parameter.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. Wait for the number of seconds in Retry-After.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal error. Try again later.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/jobs/{id}":{"get":{"operationId":"getJob","summary":"Read one AI trainer job","description":"Use this to read a job by its 8-character id. Open and closed jobs are available. Closed jobs have status closed and no apply_url. Salaried and unpublished open jobs are not available.","parameters":[{"name":"id","in":"path","required":true,"description":"The job's 8-character lowercase hexadecimal id.","schema":{"type":"string","pattern":"^[0-9a-f]{8}$"}}],"responses":{"200":{"description":"Job facts and summary.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"400":{"description":"Invalid parameter.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. Wait for the number of seconds in Retry-After.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal error. Try again later.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/categories":{"get":{"operationId":"listCategories","summary":"List job categories","description":"Use this to choose a category slug for a job search and see how many listed open jobs it contains. All categories are returned, including empty categories.","responses":{"200":{"description":"Categories with open job counts.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}}}},"400":{"description":"Invalid parameter.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Method not allowed.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests. Wait for the number of seconds in Retry-After.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal error. Try again later.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Job":{"type":"object","properties":{"id":{"type":"string","pattern":"^[0-9a-f]{8}$"},"title":{"type":"string"},"company":{"type":"string"},"category":{"type":"string","enum":["coding","stem","medical","legal","finance","languages","voice-video","creative","generalist","robotics"]},"url":{"type":"string","format":"uri"},"apply_url":{"type":["string","null"],"format":"uri"},"pay":{"type":"object","properties":{"min":{"type":["number","null"]},"max":{"type":["number","null"]},"currency":{"type":["string","null"],"enum":["USD",null]},"period":{"type":["string","null"],"enum":["hour","once","task",null]},"label":{"type":["string","null"]}},"required":["min","max","currency","period","label"],"additionalProperties":false},"location":{"type":"object","properties":{"label":{"type":["string","null"]},"countries":{"type":"array","items":{"type":"string"}}},"required":["label","countries"],"additionalProperties":false},"languages":{"type":"array","items":{"type":"string"}},"level":{"type":["string","null"],"enum":["entry","experienced","expert",null]},"commitment":{"type":["string","null"]},"skills":{"type":"array","items":{"type":"string"}},"summary":{"type":["string","null"]},"posted_at":{"type":"string"},"published_at":{"type":["string","null"]},"status":{"type":"string","enum":["open","closed"]}},"required":["id","title","company","category","url","apply_url","pay","location","languages","level","commitment","skills","summary","posted_at","published_at","status"],"additionalProperties":false},"JobList":{"type":"object","properties":{"total":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":100},"offset":{"type":"integer","minimum":0},"jobs":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}},"required":["total","limit","offset","jobs"],"additionalProperties":false},"Category":{"type":"object","properties":{"slug":{"type":"string","enum":["coding","stem","medical","legal","finance","languages","voice-video","creative","generalist","robotics"]},"label":{"type":"string"},"open_jobs":{"type":"integer","minimum":0}},"required":["slug","label","open_jobs"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["invalid_parameter","not_found","method_not_allowed","rate_limited","internal_error"]},"message":{"type":"string"},"hint":{"type":"string"}},"required":["code","message","hint"],"additionalProperties":false}},"required":["error"],"additionalProperties":false}},"headers":{"RateLimit":{"description":"Quota left in the current window and seconds until it resets, such as \"default\";r=59;t=60.","schema":{"type":"string"}},"RateLimit-Policy":{"description":"The quota policy: \"default\";q=60;w=60.","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before the next request.","schema":{"type":"integer","minimum":1}}}}}