PNCP Licitações API: Brazil Tenders, Values, Files
Pricing
from $1.70 / 1,000 tender delivereds
PNCP Licitações API: Brazil Tenders, Values, Files
Brazilian public tenders (licitações) from PNCP: agency, CNPJ, object, modality, estimated value, deadlines, edital files, line items. Filter by keyword, UF, modality, dates; onlyNew alerts. No API key, no login. MCP-ready for AI agents. Errors and empty results are free. $2 per 1,000 tenders
Pricing
from $1.70 / 1,000 tender delivereds
Rating
0.0
(0)
Developer
ABM
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
PNCP Licitações API: Brazil Public Tenders Scraper
$2 per 1,000 tenders. You pay only for tenders delivered: errors and empty results are free. No API key, no login, no monthly rental.
This Actor searches PNCP (Portal Nacional de Contratações Públicas), the official national portal where every Brazilian public body (federal, state and municipal) must publish its procurement under Lei 14.133/2021. It returns one clean JSON object per tender (licitação, pregão, dispensa, concorrência...) with:
- agency name, CNPJ, sphere (federal / state / municipal), unit, city, IBGE code, UF
- title, purchase object (objeto), purchase and process numbers, modality, dispute mode, status
- estimated value (valor total estimado) and approved value (homologado), in BRL
- publication date, proposal opening date and deadline
- attachments: edital, termo de referência, ETP... with direct download links
- optional line items (itens): description, quantity, unit, unit and total estimated value
- a ready-to-use Markdown summary for LLMs, RAG and alerts
Filter by keyword, state (UF), modality and publication date window. Turn on onlyNew for daily monitoring: each scheduled run returns only tenders you have not received yet.
It reads PNCP's public JSON APIs directly (no browser, no HTML parsing), so it is fast and stable.
How much does it cost?
Pay per event: $0.002 per tender delivered (tender-result).
| Run | Tenders | Price |
|---|---|---|
| Daily alert, 1 keyword, 1 state | ~20 | $0.04 |
| Weekly market scan | 250 | $0.50 |
| Bulk export | 1,000 | $2.00 |
Nothing is charged for tenders filtered out, duplicates across keywords, tenders already delivered (onlyNew), API errors or empty searches. Set a maximum charge on your run: the Actor stops cleanly when it is reached.
Input
{"keywords": ["software", "licença de uso"],"state": "SP","modalities": ["6", "8"],"status": "open","daysBack": 7,"maxResults": 100,"includeDetails": true,"includeItems": false,"onlyNew": false}
| Field | Description |
|---|---|
keywords | Full-text terms (Portuguese works best: limpeza, merenda escolar, pavimentação). One search per keyword, merged and de-duplicated. Empty = all tenders. |
state / states | UF codes (SP, RJ, MG, DF...). Empty = all of Brazil. |
modalities | 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. |
status | all (default), open (still receiving proposals), closed. |
daysBack | Published in the last N days (Brasília time). Default 7. |
dateFrom / dateTo | Explicit publication window (2026-10-01). Overrides daysBack. |
maxResults | Maximum tenders delivered (and charged), all keywords together. |
includeDetails | Detail sheet + attachments (default true). |
includeItems | Purchase line items (default false). |
onlyNew | Skip tenders delivered by previous runs with the same filters. |
Output
One object per tender in the dataset (export to JSON, CSV, Excel, XML or HTML):
{"pncpId": "46177523000109-1-000278/2026","url": "https://pncp.gov.br/app/editais/46177523000109/2026/278","title": "Edital nº 73/2026-R","object": "AQUISIÇÃO DE LICENÇA USO DE SOFTWARE — para atender à SEICOM","documentType": "Edital","purchaseNumber": "73/2026-R","processNumber": "33244/2026-57","year": 2026,"sequentialNumber": 278,"modalityId": 6,"modality": "Pregão - Eletrônico","disputeMode": "Aberto","status": "Divulgada no PNCP","cancelled": false,"publishedAt": "2026-10-20T16:26:19","proposalOpeningDate": "2026-10-21T18:00:00","proposalDeadline": "2026-11-10T08:00:00","estimatedValue": 79179.48,"approvedValue": null,"currency": "BRL","confidentialBudget": false,"agencyCnpj": "46177523000109","agencyName": "MUNICIPIO DE SAO VICENTE","agencySphere": "Municipal","municipality": "São Vicente","ibgeCode": "3551009","state": "SP","stateName": "São Paulo","legalBasis": "Lei 14.133/2021, Art. 28, I","priceRegistration": false,"publishedBy": "Novo BBMNET Licitações","attachments": [{"title": "EDITAL__PE_732026_R__Licenca_Adobeampla","documentType": "Edital","documentTypeId": 2,"sequence": 1,"publishedAt": "2026-10-20T16:26:19","url": "https://pncp.gov.br/pncp-api/v1/orgaos/46177523000109/compras/2026/278/arquivos/1"},{"title": "TR_Adobedocx","documentType": "Termo de Referência","url": "https://pncp.gov.br/pncp-api/v1/orgaos/46177523000109/compras/2026/278/arquivos/2"}],"attachmentsCount": 5,"lineItems": [],"searchKeyword": "software","detailsFetched": true,"markdown": "## Edital nº 73/2026-R – MUNICIPIO DE SAO VICENTE\n- **Modality:** Pregão - Eletrônico\n- **Estimated value:** BRL 79,179.48\n..."}
With includeItems: true, lineItems contains for example
{"number": 1, "description": "LICENÇA USO DE SOFTWARE ... Creative Cloud", "type": "Material", "quantity": 12, "unit": "LICENÇA", "unitEstimatedValue": 6598.29, "totalEstimatedValue": 79179.48, "judgmentCriterion": "Menor preço"}.
Attachment links point to the official PNCP file server: download them directly. The Actor does not copy the files, so you don't pay storage.
Use cases
1. Daily IT tender alert for a software reseller (bid manager)
Every morning at 7:00, a bid manager at a São Paulo software reseller gets the new IT tenders in SP and RJ, still open for proposals, in Google Sheets. Input:
{"keywords": ["software", "licença de uso", "computadores"], "states": ["SP", "RJ"], "status": "open", "daysBack": 2, "onlyNew": true, "maxResults": 200}
Output (excerpt):
[{"title": "Edital nº 73/2026-R", "agencyName": "MUNICIPIO DE SAO VICENTE", "estimatedValue": 79179.48, "proposalDeadline": "2026-11-10T08:00:00", "url": "https://pncp.gov.br/app/editais/46177523000109/2026/278"}]
About 15 to 40 new tenders per day, so $0.03 to $0.08 per day. The team qualifies them in the sheet and downloads the edital from attachments[0].url.
2. Market sizing for a facility-services company (business analyst)
An analyst estimates the yearly public spend on cleaning in Minas Gerais from reverse auctions. Input:
{"keywords": ["limpeza", "conservação predial"], "state": "MG", "modalities": ["6", "7"], "dateFrom": "2026-07-01", "dateTo": "2026-09-30", "maxResults": 2000, "includeItems": true}
Output (excerpt):
[{"agencyName": "MUNICIPIO DE ...", "municipality": "Uberlândia", "estimatedValue": 1250000.0, "lineItems": [{"description": "Serviço de limpeza ...", "quantity": 12, "unit": "MÊS"}]}]
About 1,500 tenders for $3. The CSV goes to Excel or BI to sum estimatedValue by municipality and find the biggest buyers by agencyCnpj.
3. AI agent that drafts go/no-go notes (consultancy)
A public-procurement consultancy lets its AI agent (Claude through MCP) pull new direct awards and electronic auctions for "consultoria", then summarize each markdown field into a go/no-go note for its clients.
Input:
{"keywords": ["consultoria"], "modalities": ["6", "8"], "daysBack": 1, "maxResults": 50}
Output (excerpt):
[{"pncpId": "...-1-000045/2026", "modality": "Dispensa de Licitação", "markdown": "## Aviso de Contratação Direta nº 12/2026 – ...\n- **Estimated value:** BRL 48,000.00 ..."}]
50 tenders cost $0.10. The markdown field fits straight into the prompt, with no HTML to clean.
Call it from the API
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<username>/brazil-pncp-tenders").call(run_input={"keywords": ["software"], "state": "SP", "status": "open", "daysBack": 7, "maxResults": 100,})for tender in client.dataset(run["defaultDatasetId"]).iterate_items():print(tender["publishedAt"], tender["agencyName"], tender["estimatedValue"], tender["url"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('<username>/brazil-pncp-tenders').call({keywords: ['software'], state: 'SP', status: 'open', daysBack: 7, maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((t) => `${t.agencyName} | ${t.estimatedValue} | ${t.url}`));
Automation (Make, n8n, Zapier, Google Sheets)
- Make / n8n / Zapier: add a Schedule trigger (every day at 7:00), then Apify → Run Actor with the input of use case 1 (
onlyNew: true), then Apify → Get dataset items, then Google Sheets → Add rows (columnspublishedAt,title,agencyName,state,estimatedValue,proposalDeadline,url). You can add a Slack or Email step that sends themarkdownfield. - Apify Schedules + integrations: schedule the Actor in the Apify Console and connect the Google Sheets or Slack integration with no code.
- Webhooks: send
ACTOR.RUN.SUCCEEDEDto your own endpoint and fetch the dataset.
Use with AI agents (MCP)
The Actor works with the Apify MCP server (https://mcp.apify.com) from Claude, Cursor, ChatGPT and other MCP clients. Ask for example: "Find open pregões for software in São Paulo published this week and list the ones above R$ 100,000." The agent fills in keywords, state, status and daysBack, and reads markdown or the structured fields.
FAQ
Is this legal? Yes. PNCP is an official open-data portal of the Brazilian federal government, and the Actor only reads its public APIs. It never logs in and never solves captchas. It connects directly; only if PNCP refuses the server's IP does it fall back to an Apify proxy (datacenter first), at no extra cost to you.
Which tenders are covered? Everything published on PNCP as a "contratação" (edital or aviso): pregão, concorrência, dispensa, inexigibilidade, leilão, credenciamento... Since Lei 14.133/2021, publication on PNCP is mandatory for every public body, but some municipalities still publish late or only on their own portal.
Why is estimatedValue null? The agency marked the budget as confidential (confidentialBudget: true, orçamento sigiloso). This is allowed by law until the auction ends.
How does onlyNew work? IDs already delivered for the same keywords, states, modalities and status are remembered for 120 days in a named key-value store of your account. Schedule the Actor daily with daysBack: 2 so you never miss a late publication.
Keywords in English? PNCP texts are in Portuguese. software works, but limpeza will find much more than cleaning.
Can I get contract awards and suppliers? hasResult and approvedValue show whether a result was registered. Full contract and supplier data is out of scope for this Actor.
Limits
- Search is full-text across title, object and agency, so a keyword may also match the agency name or a related word.
maxResultsapplies to all keywords together. Keywords are processed in order, so the first ones can use up the quota.- The publication-window scan goes through at most 10,000 search hits per keyword (newest first). For an old window with a very broad query, narrow the filters (state, modality, keyword).
- Two official sources, automatic switch: the PNCP full-text search API is tried first; when it is down or resets connections (it often does), the Actor switches within seconds to the official PNCP consulta API (
/contratacoes/publicacao), scans the date window by state and modality and matches every keyword on the object, notes and agency names (accent-insensitive, all words of the keyword must appear). Same tenders, same output fields; the run never fails because of the search API. - In that fallback mode, a nationwide search (no state) over a long window reads many pages: add a state or modality filter for faster runs. Tenders are then not strictly newest first.
- PNCP sometimes resets connections or returns 5xx errors. The Actor retries with backoff. If a detail sheet still fails, the tender is delivered with its search fields only (
detailsFetched: false). - Attachment files are linked, not downloaded.
- Windows longer than one year are split automatically into 365-day chunks, because the official API refuses longer windows.
- When the run is about to reach its timeout, the Actor stops scanning and delivers what it already found. Tenders delivered in the last seconds may have no attachment list (
attachmentsCount: null). For long windows, raise the run timeout. - If PNCP is completely down, the run ends with a clear status message and nothing is charged. Retry a few minutes later.