Local services & SaaS
Faire
Orders, inventory, reorders and messages for wholesale brands.
12 endpoints
Search the Tender Noticeboard, track your leads, answer builders and submit quotes from your AI agent. It signs in to EstimateOne as you, so there is no partner API to apply for. Cotlet runs it hosted, around the clock.
12 tools Read and write
EstimateOne has an External API for partner software: read-only, with one endpoint for Speci-finder matches, set up by EstimateOne for each customer (checked 6 Nov 2026). We found no EstimateOne MCP server. Cotlet adds 12 EstimateOne tools for Claude, ChatGPT and scripts: no API key to request, no partner approval, hosted all day, and one account for your other apps too.
| What you need | Partner API | By hand | Cotlet |
|---|---|---|---|
| Speci-Finder matches | Read-only JSON | Yes, or by email | Yes |
| Search the Noticeboard with filters | No | Yes | Yes |
| Answer Intend to Quote or Not Quoting | No | Yes | Yes, after your OK |
| Request and download documents | No | Yes | Yes, after your OK |
| Submit and revise quotes | No | Yes | Yes, after your OK |
| No partner agreement with EstimateOne | Set up per customer | Yes | Yes |
| Runs with you away | Yes, on a schedule | No | Yes, hosted |
Checked 6 Nov 2026. Sources: E1 Developer: Overview · E1 Developer: Use the API from Zapier · E1 Developer: Supplier API · E1 Help: Managing E1 emails
Once, in a browser we run for you.
Paste one address.
The agent works in your leads.
We never see or store your EstimateOne password, and every call that tells a builder something waits for your OK. Who can see your session
Three steps, then one code block for your client.
Enable EstimateOne for agents. Sign up, sign in to EstimateOne in its Cloud Browser with your own login, then press Enable for agents.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as a custom MCP server or connector in your agent.
Approve the connection. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries EstimateOne next to your other apps. Turned EstimateOne on after connecting? Refresh the connector so the agent sees the 12 new tools.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-estimateone \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-estimateone": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-estimateone]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: estimateone_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: estimateone_write Every other tool takes a project_id from these. Searches use the Noticeboard's own filters; contains_keyword limits results to Speci-Finder matches.
Returns projects from the Tender Noticeboard that your account can see, with builder, category, location, quotes due date and your interest level. Search by Project Name, Project ID, Address, Brand or Product, and use the same filters as the board. contains_keyword limits results to Speci-Finder matches. A free account sees a limited number of tenders per month.
MCP callestimateone_read → search_tenders
REST endpointGET https://cotlet.dev/api/v1/estimateone/tenders/search
| Name | Type | Description |
|---|---|---|
| query string | string | Project Name, Project ID, Address, Brand or Product. |
| trade string | string | Trade filter, as named on the Noticeboard. |
| location string | string | Location filter, as named on the Noticeboard. |
| category string | string | Category filter, as named on the Noticeboard. |
| budget string | string | Budget filter, as named on the Noticeboard. |
| interest_level enum | enum | Interested, Quoting, Quoted or Not Interested. |
| status enum | enum | Open, Awarded or Closed: the tabs of the board. |
| added_within string | string | Added Within filter, as the board offers it. |
| quotes_due_within string | string | Quotes Due Within filter, as the board offers it. |
| contains_keyword boolean | boolean | Only projects with a Speci-Finder keyword match. |
{
"projects": [
{
"project_id": "E1-48213",
"name": "Harbour Medical Centre fitout",
"builder": "Northgate Build",
"category": "Health",
"location": "Newcastle NSW",
"quotes_due": "2026-11-18",
"interest_level": null
},
{
"project_id": "E1-48190",
"name": "Station Road apartments",
"builder": "Kestrel Constructions",
"category": "Residential",
"location": "Parramatta NSW",
"quotes_due": "2026-11-20",
"interest_level": "Interested"
}
]
} Returns the project details page: builder, package, category, approx project value, quotes due, location, trades involved and the Speci-Finder keywords found in it. It also says how the documents are offered (Request package, or View and Download) and your response and quote status. Reading a project does not tell the builder anything; opening documents does.
MCP callestimateone_read → get_tender
REST endpointGET https://cotlet.dev/api/v1/estimateone/projects/{project_id}/tender
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID from search_tenders or list_leads. |
{
"project_id": "project_8c41d2"
} {
"project_id": "E1-48213",
"name": "Harbour Medical Centre fitout",
"builder": "Northgate Build",
"package": "Electrical",
"category": "Health",
"approx_project_value": "$4,500,000",
"quotes_due": "2026-11-18",
"location": "Newcastle NSW",
"trades_involved": [
"Electrical",
"Plumbing",
"Joinery"
],
"keywords": [
"LED panel"
],
"documents": "Request package",
"your_response": null,
"your_quote": null
} Returns projects that match the keywords set up in Speci-Finder, the same ones the Contains a keyword filter and the Speci-Finder Report email use. Each match names the keywords found. What Speci-Finder offers (keyword count, conditional criteria) depends on your subscription.
MCP callestimateone_read → list_speci_finder_matches
REST endpointGET https://cotlet.dev/api/v1/estimateone/speci-finder-matches
| Name | Type | Description |
|---|---|---|
| keyword string | string | Only matches for this keyword. |
{
"matches": [
{
"project_id": "E1-48213",
"name": "Harbour Medical Centre fitout",
"builder": "Northgate Build",
"keywords": [
"LED panel"
],
"quotes_due": "2026-11-18"
}
]
} list_leads follows the Leads screen: its tabs, and only your own invitations unless you pass team_member. A Watchlist change reaches only your team.
Lists the Leads screen by tab: Active (quotes due date not passed), Submitted (quoted on E1 or marked Quote Emailed) or Archived. Each lead shows builder, source (Noticeboard or Invitation), package, team member, quotes due and quote response, and the document status (Not Accessed, Out of Date or Current). By default only invitations assigned to you are listed; team_member shows colleagues.
MCP callestimateone_read → list_leads
REST endpointGET https://cotlet.dev/api/v1/estimateone/leads
| Name | Type | Description |
|---|---|---|
| tab enum | enum | Active, Submitted or Archived. |
| search string | string | Project name, project ID, builder or package. |
| quote_response enum | enum | Quoting, Quote Emailed, Not Quoting, Quoted or No Response. |
| quotes_due_status string | string | Quotes Due status filter, as the Leads screen names it. |
| team_member string | string | Show the leads of this team member. |
{
"leads": [
{
"project_id": "E1-48213",
"project": "Harbour Medical Centre fitout",
"builder": "Northgate Build",
"source": "Invitation",
"package": "Electrical",
"team_member": "Tom Reed",
"quotes_due": "2026-11-18",
"quote_response": "Quoting",
"documents": "Current"
},
{
"project_id": "E1-47980",
"project": "Riverside school hall",
"builder": "Kestrel Constructions",
"source": "Noticeboard",
"package": "Electrical",
"team_member": "Tom Reed",
"quotes_due": "2026-11-09",
"quote_response": "No Response",
"documents": "Not Accessed"
}
]
} Returns the Watchlist tab: every tracked project your team sees, with its Interest Level (Interested, Quoting, Quoted or Not Interested) and the team member it is assigned to. Use interest_level to narrow the list. Tender dates, awards and addendums show on each project.
MCP callestimateone_read → list_watchlist
REST endpointGET https://cotlet.dev/api/v1/estimateone/watchlists
| Name | Type | Description |
|---|---|---|
| interest_level enum | enum | Interested, Quoting, Quoted or Not Interested. |
| assigned_to string | string | Only projects assigned to this team member. |
{
"projects": [
{
"project_id": "E1-48213",
"name": "Harbour Medical Centre fitout",
"interest_level": "Quoting",
"assigned_to": "Tom Reed",
"quotes_due": "2026-11-18"
},
{
"project_id": "E1-48190",
"name": "Station Road apartments",
"interest_level": "Interested",
"assigned_to": null,
"quotes_due": "2026-11-20"
}
]
} Adds a project to your Watchlist, sets its Interest Level (Interested, Quoting, Quoted or Not Interested) or assigns it to a team member. It reaches only your own team and is undone with one call, so it does not wait for your OK.
MCP callestimateone_write → update_watchlist
REST endpointPATCH https://cotlet.dev/api/v1/estimateone/projects/{project_id}/watchlist
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID. |
| interest_level enum | enum | Interested, Quoting, Quoted or Not Interested. |
| assigned_to string | string | Team member to assign the project to. |
{
"project_id": "project_8c41d2"
} {
"project_id": "E1-48190",
"on_watchlist": true,
"interest_level": "Interested",
"assigned_to": "Tom Reed"
} Sets Your Response on a project: Intend to Quote, or Not Quoting with a reason. The builder is told either way ("Northgate Build knows you're quoting"). You can change the response later with another call. By default you confirm each call; you can switch that off for this tool.
MCP callestimateone_write → set_response
REST endpointPUT https://cotlet.dev/api/v1/estimateone/projects/{project_id}/response
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID. |
| response enum required | enum | intend_to_quote or not_quoting. |
| reason enum | enum | For not_quoting: Trade or product not suitable, No capacity, Not in service area, Project too small, Project too large, Docs lack detail, or Don't send a reason. |
{
"project_id": "project_8c41d2",
"response": "intend_to_quote"
} {
"project_id": "E1-47980",
"response": "Not Quoting",
"reason": "Project too large",
"builder_notified": "Kestrel Constructions"
} Request package waits for the builder; where the board shows View and Download, download_package works at once. Opening documents tells the builder.
Selects your nominated package and clicks Request package. The builder approves, and E1 emails you when they accept or reject, so access is not immediate. Only for projects that show Request package; where the board shows View and Download, call download_package. By default you confirm each call; you can switch that off for this tool.
MCP callestimateone_write → request_package
REST endpointPOST https://cotlet.dev/api/v1/estimateone/projects/{project_id}/package/request
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID. |
| package string required | string | The package you want, as the project lists it. |
{
"project_id": "project_8c41d2",
"package": "package"
} {
"project_id": "E1-48213",
"package": "Electrical",
"status": "Requested",
"builder": "Northgate Build"
} Downloads a package in your Cloud Browser and returns the file list. It starts a transmittal and lets the builder know you are viewing the documents. changes_only uses Download changes, which fetches only new or updated files after a Documents changed banner. By default you confirm each call; you can switch that off for this tool.
MCP callestimateone_write → download_package
REST endpointPOST https://cotlet.dev/api/v1/estimateone/projects/{project_id}/package/download
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID. |
| package string | string | Package to download. Without it, the full set. |
| changes_only boolean | boolean | Only new or updated files since your last download. |
{
"project_id": "project_8c41d2"
} {
"project_id": "E1-48213",
"package": "Electrical",
"documents": "Current",
"files": [
"E-100 Power plan.pdf",
"E-200 Lighting schedule.pdf",
"Spec section 16.pdf"
],
"transmittal_sent_to": "Northgate Build"
} A quote needs a total excluding GST and a quote file. Revising keeps the original, so builders see both versions.
Returns the Quotes tab under Activity for one project: each version you submitted, the amount excluding GST and the Viewed By Builders column with its date stamp. viewed_at is empty until the builder opens the quote. Each builder sees only their own quote.
MCP callestimateone_read → list_quotes
REST endpointGET https://cotlet.dev/api/v1/estimateone/projects/{project_id}/quotes
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID. |
{
"project_id": "project_8c41d2"
} {
"quotes": [
{
"version": "v1",
"builder": "Northgate Build",
"package": "Electrical",
"total_ex_gst": "118400.00",
"submitted_at": "2026-11-10T09:12:00+11:00",
"viewed_at": "2026-11-10T14:40:00+11:00"
},
{
"version": "v2",
"builder": "Northgate Build",
"package": "Electrical",
"total_ex_gst": "116900.00",
"submitted_at": "2026-11-12T08:30:00+11:00",
"viewed_at": null
}
]
} Fills the Quote form: builder or builders, package, total amount excluding GST (required), the Quote file (required) and an optional message that every selected builder sees. E1 emails the quote to the builder and adds it to their portal, and your lead turns to Quoted. For different messages per builder, call once per builder. By default you confirm each call; you can switch that off for this tool.
MCP callestimateone_write → submit_quote
REST endpointPOST https://cotlet.dev/api/v1/estimateone/projects/{project_id}/quote/submit
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID. |
| builders array required | array | Builder names from the project. |
| package string required | string | Package, as the form lists it. |
| total_amount string required | string | Total excluding GST. |
| quote_file string required | string | The quote document to upload. |
| message string | string | Quote message, seen by every selected builder. |
{
"project_id": "E1-48213",
"builders": [
"Northgate Build"
],
"package": "Electrical",
"total_amount": "118400.00",
"quote_file": "electrical-quote.pdf",
"message": "Includes LED panels per E-200. Valid for 30 days."
} {
"project_id": "E1-48213",
"version": "v1",
"builders": [
"Northgate Build"
],
"package": "Electrical",
"total_ex_gst": "118400.00",
"lead_status": "Quoted"
} Opens the quote in the Quotes tab and uses Revise Quote with a new amount, file and message. Builders keep the original and the new version, so the message should say what changed. Quote summary lists every version. By default you confirm each call; you can switch that off for this tool.
MCP callestimateone_write → revise_quote
REST endpointPOST https://cotlet.dev/api/v1/estimateone/projects/{project_id}/quote/revise
| Name | Type | Description |
|---|---|---|
| project_id string required | string | Project ID. |
| builder string required | string | Builder the quote went to. |
| total_amount string required | string | New total excluding GST. |
| quote_file string required | string | The revised quote document. |
| message string | string | What changed. |
{
"project_id": "project_8c41d2",
"builder": "builder",
"total_amount": "total amount",
"quote_file": "quote file"
} {
"project_id": "E1-48213",
"builder": "Northgate Build",
"version": "v2",
"total_ex_gst": "116900.00",
"previous_version": "v1"
} Your signed-in EstimateOne browser profile, encrypted with AES-256-GCM, in Finland. Not the password.
The 12 EstimateOne tools. Never the cookie or the login.
What your account sees: tenders, leads, Watchlist, documents and your quotes.
Plans, billing, licences, team members, password and two-factor.
You sign in yourself and type any code. We never do.
Disable for agents, reset the browser or delete the API key. The next call fails.
cotlet.dev gets A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
| Tool | What EstimateOne decides |
|---|---|
| search_tenders | A free account sees a limited number of tenders per month. |
| list_speci_finder_matches | Speci-Finder features follow your subscription. Conditional criteria are on the Professional tiers. |
| list_leads | Shows your own invitations. Colleagues' leads need the team_member filter. |
| request_package | The builder approves, and EstimateOne emails you their answer. |
| submit_quote | The total amount excluding GST and the quote file are required. |
| list_quotes | Viewed By Builders shows a date once the builder opens the quote. |
EstimateOne accepts quotes after the due date, but builders may have stopped looking. Ask your agent to flag Overdue leads and confirm with the builder first.
EstimateOne shows different things to free and paid accounts, so the tools read each screen as your account shows it. When EstimateOne moves a button or renames a filter, the fix is on our side. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Update the Watchlist | Change it again; only your team sees it |
| Request a package | The builder decides and EstimateOne emails you the answer |
| Download a package | No, the builder is told you opened the documents |
| Set Intend to Quote or Not Quoting | Change it with another call; the builder was already told |
| Submit a quote | Delete it in EstimateOne; the builder may have kept a copy, so tell them |
| Revise a quote | No, builders keep both versions; the message says what changed |
5 of 12 tools ask first: request_package, download_package, set_response, submit_quote and revise_quote. The 6 reads and the Watchlist change run at once. Turn the wait off per tool for a scheduled run.
A quote sent by email, outside EstimateOne, cannot be deleted inside it.
{
"name": "submit_quote",
"arguments": {
"project_id": "E1-48213",
"builders": [
"Northgate Build"
],
"package": "Electrical",
"total_amount": "118400.00",
"quote_file": "electrical-quote.pdf",
"message": "Includes LED panels per E-200. Valid for 30 days."
}
} curl -X POST https://cotlet.dev/api/v1/estimateone/projects/E1-48213/quote/submit \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"builders":["Northgate Build"],"package":"Electrical","total_amount":"118400.00","quote_file":"electrical-quote.pdf","message":"Includes LED panels per E-200. Valid for 30 days."}' {
"project_id": "E1-48213",
"version": "v1",
"builders": [
"Northgate Build"
],
"package": "Electrical",
"total_ex_gst": "118400.00",
"lead_status": "Quoted"
} Scripts and cron jobs reach the same tools over REST at /api/v1/estimateone, with the same key and price. A write answers 202 while it waits for your OK. Each row in the tools table shows its REST path.
About $20 a monthfor a subcontractor's estimator, 3,520 credits. Your EstimateOne plan is billed by EstimateOne as before.
| Job | Calls | Credits |
|---|---|---|
| Daily digest: matches and new tenders | 6 × 22 | 1,320 |
| Quotes due this week, weekly | 4 × 4 | 160 |
| Answer a tender: details, then your response | 2 × 10 | 200 |
| Request or download a package | 2 × 8 | 160 |
| Submit a quote, then check it | 3 × 6 | 180 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 3,520 |
The month is our example: a digest on each of 22 working days, about 10 tenders answered, 8 packages and 6 quotes. EstimateOne publishes no figure for tenders a subcontractor quotes a month. It also lists no price for its subcontractor and supplier plans; sign-up is free with a limited number of tenders a month. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| EstimateOne partner API | Official: Speci-finder matches as JSON with cursor paging, one OAuth2 credential per customer user. | EstimateOne sets up each partner and customer. Read-only, no tender search, documents or quotes, no webhooks. |
| Webhooks by Zapier | EstimateOne's guide: request a token, read matches, loop them into a CRM or sheet. Hourly or daily is its advice. | The same partner credential. There is no EstimateOne app on Zapier. |
| EstimateOne emails | A Speci-Finder Report on new projects with your keywords and a daily or weekly Watchlist Update on dates, awards and addendums. | Mail for a person. Nothing answers a builder or sends a quote. |
We found no EstimateOne MCP server on GitHub or from EstimateOne (searched 6 Nov 2026). If you build software for many EstimateOne customers and want matches pushed into your own system, ask EstimateOne for partner access. Cotlet is for the estimator or owner who wants an agent in Claude or ChatGPT working in their own account, with nothing to apply for.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the EstimateOne tools.
Sign up at cotlet.dev, log in to EstimateOne once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your EstimateOne account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in EstimateOne: a daily tender digest; chase quotes due this week; decline tenders that do not fit. You ask in plain words, and anything that reaches a builder waits for your OK first.
EstimateOne has no connector of its own for ChatGPT or Claude (checked 6 Nov 2026). Cotlet adds one to both: you add Cotlet once and ChatGPT or Claude works in your own EstimateOne account, finding and sorting tenders for you.
Create a free account at https://cotlet.dev, open EstimateOne under Integrations in the console and sign in to EstimateOne in its Cloud Browser. The trial starts with your first app, no card asked.
We found none from EstimateOne (checked 6 Nov 2026). Its External API is partner-only and read-only, and it returns Speci-finder matches. Cotlet gives Claude, ChatGPT and scripts the EstimateOne tools above, hosted.
No plan is needed to connect. E1 says sign-up is free, and a free account sees a limited number of tenders per month, so search_tenders shows what your account shows. Speci-Finder features depend on your subscription tier, so list_speci_finder_matches returns what your tier offers.
The Leads screen shows only invitations assigned to you by default, and list_leads follows it. Pass team_member to see a colleague's leads. Your agent works in your own account, so it sees what you see.
No. Cotlet works in your own account, so EstimateOne issues no credential and registers no application. You sign in with your own login, and your account sets what the agent sees.
Not through Cotlet. The partner API has no webhooks either. Cotlet reads and writes when your agent asks, so for a morning check of new tenders, run your agent on a schedule.
Only the door is different. Both expose the same 12 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and cron jobs use REST.
No. Cotlet is independent and not affiliated with EstimateOne Pty Ltd.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy