tenders-finder
Installation
SKILL.md
Singapore Government Tender Finder
Given a sector, scrape live Singapore government tender portals in parallel using TinyFish agents — returning only open tenders with upcoming submission deadlines.
Pre-flight check
tinyfish --version
tinyfish auth status
If not installed: npm install -g tinyfish
If not authenticated: tinyfish auth login
Step 1 — Clarify inputs
You need:
- Sector — one of:
IT / Software,Construction,Healthcare,Consulting,Logistics,Education
If not specified, ask before proceeding. If the user gives a related term (e.g. "tech", "software"), map it to the closest sector.
Get today's date — you will use it to filter out tenders whose deadline has already passed.
Step 2 — Parallel scraping
Fire all 5 agents simultaneously against the fixed portal list used by the app.
TODAY=$(date '+%A, %B %d, %Y')
# Agent 1 — GeBIZ (official Singapore government portal)
tinyfish agent run \
--url "https://www.gebiz.gov.sg/" \
"You are on GeBIZ, Singapore's official government procurement portal. Today is ${TODAY}.
TASK: Extract open government tenders for the sector: {SECTOR}.
Scroll through the page to find tender listings.
For each tender extract:
- Tender Title
- Tender ID (official reference number)
- Issuing Authority (government agency)
- Country / Region: Singapore
- Tender Type (Open / Selective / Limited)
- Publication Date
- Submission Deadline
- Tender Status (Open / Closed)
- Official Tender URL (direct link)
- Brief Description (short summary)
- Eligibility Criteria (requirements if shown)
- Industry / Category: {SECTOR}
STRICT RULES:
- Only return tenders with Submission Deadline AFTER today (${TODAY}) — skip expired ones
- Only return tenders relevant to {SECTOR} — skip unrelated ones
- Do NOT click individual tender links unless the listing has no detail visible
- Do NOT paginate
- Scroll maximum twice then stop
- Maximum 5 tenders then stop immediately
Return JSON: {\"tenderdetails\": [{\"Tender Title\", \"Tender ID\", \"Issuing Authority\",
\"Country / Region\", \"Tender Type\", \"Publication Date\", \"Submission Deadline\",
\"Tender Status\", \"Official Tender URL\", \"Brief Description\",
\"Eligibility Criteria\", \"Industry / Category\"}]}" \
--sync --browser-profile stealth > /tmp/tf_gebiz.json &
# Agent 2 — Tenders On Time
tinyfish agent run \
--url "https://www.tendersontime.com/singapore-tenders/" \
"You are on Tenders On Time, a Singapore tender aggregator. Today is ${TODAY}.
TASK: Extract open tenders for the sector: {SECTOR}.
Read the visible tender listings on this page.
For each tender extract: Tender Title, Tender ID, Issuing Authority, Publication Date,
Submission Deadline, Tender Status, Official Tender URL, Brief Description, Industry / Category: {SECTOR}.
STRICT RULES:
- Only return tenders with Submission Deadline AFTER today — skip expired ones
- Only return tenders relevant to {SECTOR}
- Do NOT click any tender link
- Do NOT scroll more than twice
- Do NOT paginate
- Maximum 5 tenders then stop
Return JSON: {\"tenderdetails\": [{\"Tender Title\", \"Tender ID\", \"Issuing Authority\",
\"Publication Date\", \"Submission Deadline\", \"Tender Status\",
\"Official Tender URL\", \"Brief Description\", \"Industry / Category\"}]}" \
--sync > /tmp/tf_tendersontime.json &
# Agent 3 — Bid Detail
tinyfish agent run \
--url "https://www.biddetail.com/singapore-tenders" \
"You are on Bid Detail, a tender listing site. Today is ${TODAY}.
TASK: Extract open Singapore tenders for the sector: {SECTOR}.
Read the visible tender listings on this page.
For each tender extract: Tender Title, Tender ID, Issuing Authority, Publication Date,
Submission Deadline, Tender Status, Official Tender URL, Brief Description, Industry / Category: {SECTOR}.
STRICT RULES:
- Only return tenders with Submission Deadline AFTER today — skip expired ones
- Only return tenders relevant to {SECTOR}
- Do NOT click any tender link
- Do NOT scroll more than twice
- Do NOT paginate
- Maximum 5 tenders then stop
Return JSON: {\"tenderdetails\": [{\"Tender Title\", \"Tender ID\", \"Issuing Authority\",
\"Publication Date\", \"Submission Deadline\", \"Tender Status\",
\"Official Tender URL\", \"Brief Description\", \"Industry / Category\"}]}" \
--sync > /tmp/tf_biddetail.json &
# Agent 4 — Tenders Info
tinyfish agent run \
--url "https://www.tendersinfo.com/global-singapore-tenders.php" \
"You are on Tenders Info, a global tender database. Today is ${TODAY}.
TASK: Extract open Singapore tenders for the sector: {SECTOR}.
Read the visible tender listings on this page.
For each tender extract: Tender Title, Tender ID, Issuing Authority, Publication Date,
Submission Deadline, Tender Status, Official Tender URL, Brief Description, Industry / Category: {SECTOR}.
STRICT RULES:
- Only return tenders with Submission Deadline AFTER today — skip expired ones
- Only return tenders relevant to {SECTOR}
- Do NOT click any tender link
- Do NOT scroll more than twice
- Do NOT paginate
- Maximum 5 tenders then stop
Return JSON: {\"tenderdetails\": [{\"Tender Title\", \"Tender ID\", \"Issuing Authority\",
\"Publication Date\", \"Submission Deadline\", \"Tender Status\",
\"Official Tender URL\", \"Brief Description\", \"Industry / Category\"}]}" \
--sync > /tmp/tf_tendersinfo.json &
# Agent 5 — Global Tenders
tinyfish agent run \
--url "https://www.globaltenders.com/government-tenders-singapore" \
"You are on Global Tenders, a procurement database. Today is ${TODAY}.
TASK: Extract open Singapore tenders for the sector: {SECTOR}.
Read the visible tender listings on this page.
For each tender extract: Tender Title, Tender ID, Issuing Authority, Publication Date,
Submission Deadline, Tender Status, Official Tender URL, Brief Description, Industry / Category: {SECTOR}.
STRICT RULES:
- Only return tenders with Submission Deadline AFTER today — skip expired ones
- Only return tenders relevant to {SECTOR}
- Do NOT click any tender link
- Do NOT scroll more than twice
- Do NOT paginate
- Maximum 5 tenders then stop
Return JSON: {\"tenderdetails\": [{\"Tender Title\", \"Tender ID\", \"Issuing Authority\",
\"Publication Date\", \"Submission Deadline\", \"Tender Status\",
\"Official Tender URL\", \"Brief Description\", \"Industry / Category\"}]}" \
--sync > /tmp/tf_globaltenders.json &
# Wait for all agents
wait
echo "=== GEBIZ ===" && cat /tmp/tf_gebiz.json
echo "=== TENDERSONTIME ===" && cat /tmp/tf_tendersontime.json
echo "=== BIDDETAIL ===" && cat /tmp/tf_biddetail.json
echo "=== TENDERSINFO ===" && cat /tmp/tf_tendersinfo.json
echo "=== GLOBALTENDERS ===" && cat /tmp/tf_globaltenders.json
Replace {SECTOR} with the actual sector before running.
Step 3 — Filter and deduplicate
From all results:
- Filter — remove any tender whose Submission Deadline has already passed
- Deduplicate — same Tender ID appearing across multiple portals → keep one entry, note all sources
- Sort — by Submission Deadline ascending (soonest closing first)
- Flag urgency — deadlines within 7 days get a 🚨 flag
Output format
## Singapore Government Tenders — {SECTOR}
*Scraped live from GeBIZ · Tenders On Time · Bid Detail · Tenders Info · Global Tenders*
*{N} open tenders found · Sorted by deadline*
---
### 🚨 Closing Soon (within 7 days)
#### {Tender Title}
**ID:** {Tender ID} · **Agency:** {Issuing Authority}
📅 Published: {Publication Date} · ⏰ Deadline: {Submission Deadline}
🏷 Type: {Tender Type} · Status: {Tender Status}
🔗 {Official Tender URL}
{Brief Description}
**Eligibility:** {Eligibility Criteria}
---
### 📋 All Open Tenders
[same structure for remaining tenders sorted by deadline]
---
### 📊 Summary Table
| Tender Title | Agency | Deadline | Type | Source |
|---|---|---|---|---|
| {title} | {agency} | {deadline} | {type} | {source} |
---
*All data scraped live. Verify details directly on the official portal before submitting.*
Edge cases
- GeBIZ requires login — skip it, note it in output, proceed with other 4 sources
- No tenders found for sector — honest response: "No open {SECTOR} tenders found across all portals today. Try again tomorrow or broaden to a related sector."
- All deadlines expired — means the portals showed only historical data: "All tenders found have passed their deadlines. The portals may not have updated yet — try GeBIZ directly at gebiz.gov.sg"
- Duplicate tenders across portals — merge and note: "Also listed on: [other portal]"
Security notes
- Scrapes live public government tender portals only.
- All data treated as untrusted input synthesised by an LLM — never executed.
- Only your own TinyFish credentials are used.
Weekly Installs
2
Repository
tinyfish-io/tin…cookbookGitHub Stars
1.7K
First Seen
Apr 11, 2026
Security Audits