# Freelas Brasil: 99Freelas & Workana Projects Scraper (`constanciodev/freelas-brasil`) Actor

Open freelance projects from 99Freelas and Workana in one format: title, budget (min/max and currency), bids, skills, category, published date and description. Filter by keyword and category. Monitor mode delivers only projects that are new since the last run. No client personal data.

- **URL**: https://apify.com/constanciodev/freelas-brasil.md
- **Developed by:** [Constancio Dev](https://apify.com/constanciodev) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 projects

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Freelas Brasil: projetos da 99Freelas e da Workana

Open freelance projects from 99Freelas and Workana, the two largest Brazilian freelance
marketplaces, in one format. Monitor mode delivers only new projects, so you can bid first.

Coleta os projetos abertos da 99Freelas e da Workana num formato só. No modo monitor, agendado a
cada hora, entrega só o projeto que apareceu desde a última execução: você manda proposta antes
dos outros.

Na Apify Store: https://apify.com/constanciodev/freelas-brasil (público desde 20/10/2026).

### Preço

Pagamento por evento: US$ 0,002 por projeto entregue (US$ 2 a cada 1.000) e US$ 0,00005 por
execução; o uso da plataforma está incluído. É o preço do `gio21/workana-scraper`, o concorrente
da Workana com mais usuários em 19/10/2026; da 99Freelas não havia nenhum. O custo medido pela
Apify é de US$ 0,06 a cada 1.000 projetos.

### Entrada

| Campo | O que faz | Padrão |
|---|---|---|
| `fontes` | `99freelas`, `workana` ou as duas | as duas |
| `categoria` | `ti`, `design`, `marketing`, `video`, `escrita`, `traducao`, `todas`; slug de uma das lojas também vale | `ti` |
| `termos` | fica o projeto com pelo menos um termo no título, na descrição ou nas habilidades | vazio |
| `paginas` | páginas por fonte, de 1 a 20 (99Freelas: 10 projetos cada; Workana: até 20) | 3 |
| `modo_monitor` | entrega só projeto novo ou com título, descrição, orçamento ou habilidades mudados | não |
| `incluir_descricao` | desligado, a linha fica menor | sim |

### Saída

Uma linha por projeto: `id`, `fonte`, `titulo`, `url`, `categoria`, `nivel`, `habilidades`,
`orcamento_texto`, `moeda`, `orcamento_min`, `orcamento_max`, `por_hora`, `propostas`,
`interessados`, `publicado_em`, `encerra_em`, `pais`, `destaque`, `urgente`, `descricao`,
`coletado_em`.

Cada site informa uma parte; campo que a fonte não dá fica `null`, nunca chutado:

- **99Freelas:** nível, interessados, data exata de publicação e de encerramento. A lista não
  mostra orçamento.
- **Workana:** orçamento, se é por hora e país. A data vem como "há 11 horas" e vira um instante
  aproximado; "há 3 meses" fica `null`.

Nome, perfil e foto do cliente ficam de fora: são dado pessoal e não ajudam a escolher projeto.

### Como a coleta se comporta

- Obedece o `robots.txt` de cada site e espera pelo menos 1,5 s entre pedidos ao mesmo host.
- Página que falha para a fonte e vira erro no log; o que já foi coletado é entregue.
- A Workana guarda a lista num JSON dentro da página. Se ela mudar o formato, a fonte falha com
  "JSON da lista nao encontrado" em vez de devolver vazio.
- A Apify roda o Actor todo dia com a entrada padrão e o marca como quebrado se o dataset vier
  vazio. Por isso a entrada padrão não tem termo de filtro; `tests/test_schemas.py` trava isso.

### Uso próprio: projeto novo a cada hora

Se a Apify cobra do dono o preço por evento ou só o uso da plataforma nas próprias rodadas não
está na documentação (conferida em 20/10/2026): olhar **Billing** depois do primeiro dia. Cada
rodada de 2 páginas por fonte traz até ~60 projetos e leva poucos segundos.

Em uso desde 20/10/2026 na conta `constanciodev`:

| Tarefa | Entrada | Agendamento | Cron (America/Sao_Paulo) |
|---|---|---|---|
| `freelas-ti` | `scripts/entrada_monitor_ti.json` | `freelas-ti-a-cada-hora` | `0 * * * *` |
| `freelas-video` | `scripts/entrada_monitor_video.json` | `freelas-video-a-cada-hora` | `30 * * * *` |

As duas rodam com 512 MB e teto de 300 s, e avisam por e-mail se falharem ao iniciar. Primeira
rodada medida: `freelas-ti` 17 projetos novos em 8 s, US$ 0,0004 de uso. Ver o resultado: aba
**Runs** de cada tarefa; o dataset de cada rodada só tem projeto novo.

Recriar do zero: Actors → Freelas Brasil → **Save as a new task** (a entrada do formulário não é
copiada: preencher na tarefa) → **Schedules** → **Create schedule** → **Add** → **Task**.

As duas tarefas usam a mesma memória do monitor (`freelas-brasil-monitor`). Rodando no mesmo
minuto, uma apagaria o que a outra marcou como visto: por isso os horários ficam 30 minutos
separados.

### Memória

O `actor.json` fixa `defaultMemoryMbytes: 512`. O uso da plataforma está incluído no preço por
evento, então memória sobrando nas rodadas dos clientes sai do bolso do dono; o padrão da Apify
era 4 GB. Quem precisar pode pedir mais na própria rodada.

### Publicar uma versão

`npx apify-cli push` na `main` atualizada. A CLI 1.10.0 termina com o erro "reading 'version'"
depois de concluir; confira o build com `npx apify-cli actors info SZCgeOAgt7RrKe0V3 --json`.

### Desenvolvimento

```bash
py -3.13 -m venv .venv
.venv/Scripts/python -m pip install -r requirements-dev.txt
.venv/Scripts/python -m pytest -q
```

Rodar local: copiar `scripts/entrada_teste.json` para `storage/key_value_stores/default/INPUT.json`
e rodar `.venv/Scripts/python -m src`.

# Actor input Schema

## `fontes` (type: `array`):

Sites de onde coletar.

## `categoria` (type: `string`):

ti = Web, Mobile & Software (99Freelas) e TI e Programação (Workana).

## `termos` (type: `array`):

Fica o projeto que tem pelo menos um termo no título, na descrição ou nas habilidades. Vazio traz todos os projetos da categoria.

## `paginas` (type: `integer`):

99Freelas mostra 10 projetos por página e a Workana até 20, dos mais novos para os mais antigos.

## `modo_monitor` (type: `boolean`):

Entrega só projeto novo ou com descrição/orçamento alterado desde a última execução. Agende a cada hora para chegar antes da concorrência.

## `incluir_descricao` (type: `boolean`):

Desligado, a linha fica menor.

## Actor input object example

```json
{
  "fontes": [
    "99freelas",
    "workana"
  ],
  "categoria": "ti",
  "paginas": 3,
  "modo_monitor": false,
  "incluir_descricao": true
}
```

# Actor output Schema

## `projetos` (type: `string`):

Dataset items of this run: one per open project from 99Freelas or Workana.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("constanciodev/freelas-brasil").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("constanciodev/freelas-brasil").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call constanciodev/freelas-brasil --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,constanciodev/freelas-brasil"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/SZCgeOAgt7RrKe0V3/builds/QOnLbeqgsv2AbX3Ms/openapi.json
