# Web3.career Jobs API

## Get Web3 job listings (JSON)

> Fetch the latest Web3 job listings with optional filters for tag, country,\
> remote status, and result count.\
> \
> \*\*Response parsing note:\*\* The response body is a JSON array whose elements are\
> a mix of strings and a nested array of job objects. Extract the jobs by finding\
> the first array element within the root array.\
> \
> \*\*Link attribution:\*\* When displaying results, you must link to jobs using\
> the \`apply\_url\` field with a follow link. See Terms of Use in the API description.<br>

```json
{"openapi":"3.1.0","info":{"title":"Web3.career Jobs API","version":"1.0"},"servers":[{"url":"https://web3.career/api","description":"Production"}],"security":[{"apiToken":[]}],"components":{"securitySchemes":{"apiToken":{"type":"apiKey","in":"query","name":"token","description":"API token obtained from [web3.career/web3-jobs-api](https://web3.career/web3-jobs-api).\nPassed as a query parameter on every request.\n"}},"schemas":{"ApiResponse":{"type":"array","description":"Top-level response array containing mixed types. The structure is typically\n`[string, string, Job[]]` — two metadata strings followed by the jobs array.\n**Extract jobs by finding the first element that is itself an array.**\nIn some cases the root array may directly contain job objects (fallback).\n","items":{"oneOf":[{"type":"string","description":"Metadata string (e.g., status or version identifier)"},{"type":"array","description":"The actual array of job listing objects","items":{"$ref":"#/components/schemas/Job"}}]}},"Job":{"type":"object","description":"A single Web3 job listing.","properties":{"id":{"type":"string","description":"Unique job identifier."},"title":{"type":"string","description":"Job title."},"company":{"type":"string","description":"Hiring company name."},"location":{"type":"string","description":"Job location (e.g., \"Remote\", \"New York, US\", \"Berlin, Germany\")."},"remote":{"type":"boolean","description":"Whether the position is fully remote."},"description":{"type":"string","description":"Full job description. **May contain raw HTML markup** (`<p>`, `<ul>`, `<li>`,\n`<strong>`, `<br>`, etc.). Strip HTML tags if you need plain text. Absent when\n`show_description=false` is set on the request.\n"},"tags":{"type":"array","description":"Skill and technology tags associated with the job.","items":{"type":"string"}},"apply_url":{"type":"string","format":"uri","description":"Application URL with embedded tracking parameters. **This is the primary link\nyou must use when directing users to a job.** Do not append query parameters\n(utm_source, utm_medium, ref, etc.) — they are already included. Links must\nuse rel=\"follow\" or have no rel attribute. Using rel=\"nofollow\" will result\nin API access suspension.\n"},"url":{"type":"string","format":"uri","description":"Direct link to the job posting on web3.career (without tracking params). Use `apply_url` for user-facing links."},"salary":{"type":"string","description":"Salary range when disclosed. Many listings omit this field."},"postedAt":{"type":"string","description":"When the job was posted. Format may vary between listings."}},"additionalProperties":true,"required":[]}}},"paths":{"/v1":{"get":{"operationId":"getJobs","summary":"Get Web3 job listings (JSON)","description":"Fetch the latest Web3 job listings with optional filters for tag, country,\nremote status, and result count.\n\n**Response parsing note:** The response body is a JSON array whose elements are\na mix of strings and a nested array of job objects. Extract the jobs by finding\nthe first array element within the root array.\n\n**Link attribution:** When displaying results, you must link to jobs using\nthe `apply_url` field with a follow link. See Terms of Use in the API description.\n","parameters":[{"name":"token","in":"query","required":true,"description":"API authentication token obtained from web3.career/web3-jobs-api.","schema":{"type":"string"}},{"name":"tag","in":"query","required":false,"description":"Filter by a single tag, skill, or category. Must be an exact slug from the\nsupported tags list. Only one tag per request — multi-tag searches require\nseparate API calls. Invalid tags silently return empty results.\n","schema":{"type":"string","enum":["ai","analyst","backend","bitcoin","blockchain","community-manager","crypto","cryptography","cto","customer-support","dao","data-science","defi","design","developer-relations","devops","discord","economy-designer","entry-level","erc","erc-20","evm","front-end","full-stack","gaming","ganache","golang","hardhat","intern","java","javascript","layer-2","marketing","mobile","moderator","nft","node","non-tech","open-source","openzeppelin","pay-in-crypto","product-manager","project-manager","react","refi","research","ruby","rust","sales","smart-contract","solana","solidity","truffle","web3-py","web3js","zero-knowledge"]}},{"name":"country","in":"query","required":false,"description":"Filter by country using a lowercase, hyphenated slug (e.g., `united-states`,\n`united-kingdom`, `germany`). Do not use country names, ISO codes, or\nabbreviations. Invalid slugs silently return empty results.\n","schema":{"type":"string","pattern":"^[a-z]+(-[a-z]+)*$"}},{"name":"remote","in":"query","required":false,"description":"Set to `true` to return only remote positions. Omit entirely to return all\njobs (remote and on-site). There is no `false` value — omission is \"show all\".\n","schema":{"type":"string","enum":["true"]}},{"name":"limit","in":"query","required":false,"description":"Number of job listings to return. Defaults to approximately 20 if omitted.\nThere is no offset or cursor parameter — results are always the most recent listings.\n","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"show_description","in":"query","required":false,"description":"Set to `false` to exclude job descriptions from the response. Reduces payload\nsize significantly. Descriptions may contain raw HTML when included.\n","schema":{"type":"string","enum":["true","false"],"default":"true"}}],"responses":{"200":{"description":"Successful response. Returns a top-level JSON array containing mixed types.\nThe actual job listings are in a nested array — find the first element in the\nroot array that is itself an array.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Unauthorized. The API token is invalid, expired, or missing.\nVerify the `token` parameter and obtain a new token from\n[web3.career/web3-jobs-api](https://web3.career/web3-jobs-api) if needed.\n"},"403":{"description":"Forbidden. The token does not have sufficient permissions.\nCheck your account settings at web3.career.\n"},"429":{"description":"Rate limit exceeded. Too many requests in a short period.\nImplement exponential backoff with jitter and retry after a delay.\nRecommended: start at 1s, double each attempt, cap at 10s, add +/-20% jitter.\n"},"500":{"description":"Internal server error. The web3.career API is experiencing issues.\nRetry with exponential backoff. These are typically transient.\n"}}}}}}
```
