Brazil Public Tenders (PNCP)
Pricing
$2.50 / 1,000 results
Brazil Public Tenders (PNCP)
Brazilian public tenders and contracts from the official PNCP API: buyer, modality, object, estimated and contract values, dates, state. Date, state, keyword filters. LGPD-safe.
Pricing
$2.50 / 1,000 results
Rating
0.0
(0)
Developer
Home Lab Mobile
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
7 days ago
Last modified
Categories
Share
Get Brazilian public tenders (licitações, dispensas, inexigibilidades) and signed public contracts as clean JSON, straight from the official PNCP API (Portal Nacional de Contratações Públicas), the national portal every Brazilian public body must publish to under Lei 14.133/2021. Each row has the buyer, state and municipality, modality, object, estimated or contract value in BRL, key dates and a link to the PNCP page. No login, key or account is needed. Natural-person suppliers are removed under the LGPD.
What it does
- Lists tenders published on PNCP in a date window (last N days, or explicit dates), for the procurement modalities you choose.
- Lists contracts published in a date window, with supplier company (CNPJ and name), value and term.
- Filters by state (UF) and by keyword in the object description (case- and accent-insensitive,
|for alternatives). - Strips personal data (LGPD): suppliers that are natural persons (CPF) or foreign are returned without ID and name; MEI sole traders keep their CNPJ but not their name; those names and any CPF-shaped numbers are removed from description text.
- Returns one result per tender or contract. You pay only for valid results; malformed rows are dropped and not charged.
- Fails loudly: if the API returns nothing or its format changes, the run fails instead of returning an empty or broken dataset. A run with zero rows succeeds only when every page was read and the API (plus your filters) really had no matches.
Input
| Field | Type | Required | Description |
|---|---|---|---|
dataset | string | no | tenders (default) or contracts. |
daysBack | integer | no | Publication window from N days before today (Brasília time) to today. Default 3; 0 = today. |
dateFrom / dateTo | string | no | Explicit window, YYYY-MM-DD. Overrides daysBack. Max 365 days. |
modalities | integer[] | no | Tenders only. PNCP modality codes, default [6, 4, 8, 9]. 1 Leilão eletrônico, 2 Diálogo competitivo, 3 Concurso, 4 Concorrência eletrônica, 5 Concorrência presencial, 6 Pregão eletrônico, 7 Pregão presencial, 8 Dispensa, 9 Inexigibilidade, 10 Manifestação de interesse, 11 Pré-qualificação, 12 Credenciamento, 13 Leilão presencial. |
state | string | no | Two-letter UF of the buyer, e.g. SP. |
keyword | string | no | Text that must appear in the object or complementary info, e.g. notebook|computador. |
maxResults | integer | no | Stop after this many results (default 100, max 10,000). Caps the cost of a run. |
maxPages | integer | no | Safety cap on API pages read (50 records each). Default 200. |
Examples:
{ "dataset": "tenders", "daysBack": 3, "modalities": [6], "maxResults": 50 }
{ "dataset": "contracts", "dateFrom": "2026-10-01", "dateTo": "2026-10-07", "state": "MG", "keyword": "ambulância", "maxResults": 200 }
Calling from an AI agent (MCP)
This Actor works as a tool through the Apify MCP server. Example tool call:
{ "actor": "homelabmobile/brazil-pncp-tenders", "input": { "dataset": "tenders", "daysBack": 2, "state": "SP", "keyword": "software", "maxResults": 10 } }
Output
One JSON object per tender or contract. Fields that do not apply to the record type are null.
Dates from PNCP are Brasília local time without an offset. Tender example (from a real run):
{"recordType": "tender","pncpControlNumber": "83021808000182-1-000652/2026","url": "https://pncp.gov.br/app/editais/83021808000182/2026/652","buyerCnpj": "83021808000182","buyerName": "MUNICIPIO DE CHAPECO","buyerSphere": "M","unitName": "Prefeitura Municipal de Chapecó","state": "SC","municipality": "Chapecó","modalityId": 6,"modalityName": "Pregão - Eletrônico","status": "Divulgada no PNCP","object": "CONTRATAÇÃO DE EMPRESA PARA FORNECIMENTO DE PLACAS EM CHAPA DE METAL ADESIVADA, COM IMPRESSÃO DIGITAL","estimatedValue": 58915.2,"awardedValue": null,"currency": "BRL","proposalOpenAt": "2026-10-08T17:15:01","proposalCloseAt": "2026-10-22T08:55:01","publishedAt": "2026-10-09T00:00:12","scrapedAt": "2026-10-14T02:37:12.000Z"}
Contract example (abridged):
{"recordType": "contract","pncpControlNumber": "83551549000100-2-000152/2026","tenderControlNumber": "83551549000100-1-000085/2026","url": "https://pncp.gov.br/app/contratos/83551549000100/2026/152","buyerName": "BALNEARIO CAMBORIU CAMARA DE VEREADORES","state": "SC","category": "Serviços","object": "Aquisição de 02(duas) vagas no curso “ O Inventário e a Gestão Patrimonial” ...","contractGlobalValue": 2200,"currency": "BRL","supplierType": "PJ","supplierCnpj": "01484706000139","supplierName": "INSTITUTO GAMMA DE ASSESSORIA A ORGAOS PUBLICOS LTDA","supplierRedacted": false,"signedDate": "2026-10-09","validFrom": "2026-10-09","validTo": "2026-10-21"}
Personal data (LGPD)
| Supplier | supplierCnpj | supplierName | supplierRedacted |
|---|---|---|---|
| Company (PJ) | kept | kept | false |
| MEI sole trader (PJ whose registered name contains the owner's CPF, e.g. "OWNER NAME 12345678909") | kept | null | true |
| Natural person (PF) | null (CPF dropped) | null | true |
| Foreign supplier (PE) or malformed ID | null | null | true |
Subcontractors follow the same rules (subcontractorCnpj, subcontractorName). Every redacted name, with or without its CPF, is
replaced by [nome removido] in object and additionalInfo, and any CPF-shaped number in those texts becomes [CPF removido].
The PNCP API has no MEI or company-size flag, so a CPF-shaped number in a company name is what identifies an MEI. An MEI registered
under a trade name without a CPF keeps that trade name.
The full field list with descriptions is in the dataset schema. Each run also writes a RUN_SUMMARY record (status, counts) to its key-value store.
Pricing
Pay per event:
| Event | Price | Per 1,000 |
|---|---|---|
| Result (one valid tender or contract) | $0.0025 | $2.50 |
Plus Apify's standard Actor start charge. A typical run of 50 results costs about $0.125.
Data source and licence
Data comes from the PNCP public consultation API (https://pncp.gov.br/api/consulta), operated by the Brazilian federal government (Serpro).
PNCP states: "O PNCP disponibiliza dados para consulta, reutilização e acompanhamento por meio de recursos de dados abertos" (PNCP FAQ).
Lei 14.133/2021, art. 174 §4, requires PNCP to use open data format. The gov.br site footer says its content is published under
Creative Commons Attribution-NoDerivs 3.0 (CC BY-ND 3.0). Attribution: Fonte: Portal Nacional de Contratações Públicas (PNCP), pncp.gov.br.
Rows are passed through with field renaming and personal-data removal only; values are not altered.
Known limits
- Window is by publication date on PNCP, not by bid deadline. Records published today may still be arriving.
- The tenders API must be paged per modality; more modalities and longer windows mean more pages and slower runs (we read at most 30 pages per minute to stay polite: about 1,500 rows per minute before filters).
- The contracts API has no state parameter, so
stateon contracts is applied after download and reads more pages. - Keyword filtering happens after download; rare keywords over long windows can hit
maxPagesbeforemaxResults. - Items (lots), results per item, price registration minutes (atas) and documents are not included.
- Natural-person, foreign and MEI supplier names are always redacted (no opt-out); see Personal data above.
- The PNCP API is sometimes slow or returns 5xx; the Actor retries each page up to 5 times with backoff. If a page still fails, that query stops (logged as an error) and the others continue; if nothing could be read, the run fails.
- Public, logged-out API only. It does not log in or bypass any access control.
Support
Open an issue on the Actor's Issues tab. We reply within 2 business days.