{
  "openapi": "3.0.1",
  "info": {
    "title": "Brazil Tech Jobs Scraper - Stack, Seniority, Salary",
    "description": "Brazilian tech jobs from Programathor and Remotar with stack, seniority, salary band, contract type (PJ, CLT), work model (remote, hybrid, on site) and English requirement read from the posting, no AI. Filter by any of them. No login. US$ 2 per 1,000 jobs; failed items are free.",
    "version": "0.1",
    "x-build-id": "BA11jglQwK3eQAZRv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapewise~vagas-tech-br/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapewise-vagas-tech-br",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapewise~vagas-tech-br/runs": {
      "post": {
        "operationId": "runs-sync-scrapewise-vagas-tech-br",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapewise~vagas-tech-br/run-sync": {
      "post": {
        "operationId": "run-sync-scrapewise-vagas-tech-br",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which Brazilian job boards to read. Programathor (default) lists tech jobs only, with stack tags, seniority and salary band on each card. Remotar adds remote and hybrid tech jobs, newest first, with posting date and application link. With both selected, pages are read in turns, 'Max items' is shared and a job found on both boards (same title and company) is delivered and charged once.",
            "items": {
              "type": "string",
              "enum": [
                "programathor",
                "remotar"
              ],
              "enumTitles": [
                "Programathor (tech job board, all work models)",
                "Remotar (remote and hybrid jobs in Brazil, tech categories)"
              ]
            },
            "default": [
              "programathor"
            ]
          },
          "stack": {
            "title": "Stack",
            "type": "array",
            "description": "Technologies to filter by, one per line, case insensitive: python, react, kubernetes. A job is kept when any one term appears in its stack as a substring, so 'java' also matches JavaScript. Empty = every stack. On Remotar, when 'Keywords' is empty, each term is also sent to its search. Jobs removed by this filter are not charged.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Optional search terms, one per line: backend, data engineer, mobile. On Remotar they are sent to its search. On Programathor, which has no search, a job is kept when a term appears in its title or stack tags. Empty = Remotar is searched with your Stack terms, or read newest first when Stack is empty too.",
            "items": {
              "type": "string"
            }
          },
          "senioridade": {
            "title": "Seniority",
            "enum": [
              "qualquer",
              "estagio",
              "junior",
              "pleno",
              "senior"
            ],
            "type": "string",
            "description": "Keep only jobs at this level, detected from the level word on the card: estagio (internship), junior, pleno (between junior and senior, closest to mid level) or senior. 'qualquer' (default) keeps every level, including jobs that name none. Jobs removed here are not charged.",
            "default": "qualquer"
          },
          "remoto": {
            "title": "Remote only",
            "type": "boolean",
            "description": "On: keep only remote jobs (the location line says remote on Programathor, or the job is 100% remote on Remotar). Off (default): every work model. For hybrid or on-site only, use 'Work model' instead.",
            "default": false
          },
          "incluirVencidas": {
            "title": "Include expired jobs",
            "type": "boolean",
            "description": "Programathor keeps an archive of expired postings after the open ones. Off (default): expired cards are skipped, not delivered and not charged, and paging stops when a page has no open job left. On: expired jobs are delivered with vencida: true and charged like any other row, which is useful for market studies over past weeks.",
            "default": false
          },
          "contractTypes": {
            "title": "Contract type",
            "type": "array",
            "description": "Keep only jobs whose contract type, read from an explicit mention in the title, a board field or the description (\"Regime: PJ\", \"Contratação CLT\"), is one of these. PJ is a contractor, CLT an employee. A job offering CLT or PJ is 'Several offered' and matches both. 'Not stated' keeps jobs that never say it. Empty (default) = any. Removed jobs are not charged.",
            "items": {
              "type": "string",
              "enum": [
                "pj",
                "clt",
                "internship",
                "temporary",
                "freelance",
                "multiple",
                "unknown"
              ],
              "enumTitles": [
                "PJ (contractor, pessoa jurídica)",
                "CLT (employee)",
                "Internship (estágio)",
                "Temporary",
                "Freelance",
                "Several offered (e.g. CLT or PJ)",
                "Not stated"
              ]
            }
          },
          "workModels": {
            "title": "Work model",
            "type": "array",
            "description": "Keep only jobs whose work model, read from an explicit mention (\"100% remoto\", \"modelo híbrido\", \"presencial\", the board's location field), is one of these: remote, hybrid, on site, or not stated. Empty (default) = any. Removed jobs are not charged.",
            "items": {
              "type": "string",
              "enum": [
                "remote",
                "hybrid",
                "onsite",
                "unknown"
              ],
              "enumTitles": [
                "Remote",
                "Hybrid",
                "On site",
                "Not stated"
              ]
            }
          },
          "maxItems": {
            "title": "Max jobs",
            "type": "integer",
            "description": "Stops the run once this many jobs are delivered; delivered jobs are the only charged event, so this is also the spending cap (30 jobs = US$ 0.06 on the Free plan). Default 30. A run can return fewer when fewer open jobs match.",
            "default": 30
          },
          "onlyNewJobs": {
            "title": "Only new jobs (for schedules)",
            "type": "boolean",
            "description": "On: returns only jobs not delivered in previous runs with the same filters, so a daily scheduled Task works as a job alert. Skipped jobs are free and do not count toward 'Max jobs'. The memory is a Key-Value Store named 'vagas-tech-br-only-new-jobs' in your own account, one record per filter combination; delete it to start over. Off (default): every matching job each run.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy used to read the boards. The default Apify datacenter proxy works; the sources do not need residential IPs, and proxy traffic is included in the price. Change only if you want to route through your own proxy.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": []
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}