Supplier API
The Supplier API exposes Speci-finder matched project results for a supplier user.
Open the live API reference
List Speci-finder results
GET /api/supplier/v1/companies/{companyId}/speci-finder/resultsRequired
| Scope | speci-finder/read |
| Headers | Authorization: Bearer <access_token>, x-e1-client-id: <client_id> |
Path parameters
| Name | Type | Description |
|---|---|---|
companyId | string | E1 company identifier for the supplier. Must match a registration on your application. |
The endpoint takes no query parameters or request body — selection of “currently open” tenders is scoped server-side.
Response (200 OK)
Returns matched projects, each with one or more matched tenders. A project appears once per response; if a single project has matched tenders under different builders, those tenders are grouped under the same project entry.
{ "data": [ { "projectId": "12345", "projectName": "Main Street Development", "address": "123 Collins St, Melbourne Victoria 3000 Australia", "category": "Commercial", "budget": { "low": 1000000, "high": 5000000 }, "status": "Active", "consultants": [ { "name": "Smith Engineers", "website": "https://smith.example" }, { "name": "Jones Architects", "website": null } ], "tenders": [ { "id": "67890", "name": "Bulk Earthworks", "type": "Tender", "builder": { "name": "ABC Constructions", "website": "https://abc.example" }, "tenderOpenAt": "2026-05-01", "quotesDueAt": "2026-05-15", "status": "Open", "matchedKeywords": ["concrete", "formwork"] } ], "tenderingSubcontractors": [ { "name": "Apex Concrete", "website": "https://apex.example" }, { "name": "Pour & Set", "website": null } ], "url": "https://app.estimateone.com/find-tenders?projectId=12345" } ]}Response field reference
Project
| Field | Type | Notes |
|---|---|---|
projectId | string | E1 project identifier. |
projectName | string | Human-readable project name. |
address | string | Full international postal address (street, suburb, state, postcode, country). |
category | string | Project category (e.g. Commercial, Residential). |
budget | { low: number, high: number | null } | null | Banded budget range in dollars. null when no budget is set; high may be null for an open-ended top end. |
status | "Active" | "Closed" | Project-level status. Closed indicates the project itself is closed (regardless of any individual tender status). |
consultants | array of Party | Consultants engaged on the project. Empty for partners without the consultant-details add-on. Excludes unverified entries. |
tenders | array of Tender | One or more matching tenders. Never empty for a returned project. |
tenderingSubcontractors | array of Party | Subcontractors who have responded affirmatively to the builder on this project (currently quoting / quoted / quoted outside E1, or signalled interest via watchlist). Subject to the E1 SubbieSupplierConnection unlock model — for projects you haven’t unlocked, this lists only previously-viewed subbies. Deduplicated by company. |
url | string | Deep link into the E1 web app for this project. |
Tender
| Field | Type | Notes |
|---|---|---|
id | string | E1 tender identifier. |
name | string | Tender name (typically a trade package, e.g. “Bulk Earthworks”). |
type | "Tender" | "Procurement" | Which product surface the tender belongs to. |
builder | Party | The lead builder running this tender. |
tenderOpenAt | ISO 8601 date (YYYY-MM-DD) or null | When the tender opened. |
quotesDueAt | ISO 8601 date (YYYY-MM-DD) or null | When quotes close. null if no due date is set. |
status | "Open" | "Closed" | "Awarded" | Tender-level status. |
matchedKeywords | array of string | The subset of the assigned user’s keywords that matched this tender. |
| Field | Type | Notes |
|---|---|---|
name | string | Display name of the company (preferring the linked E1 account’s name when available). |
website | string | null | Company website URL, normalised to include an https:// scheme. null when no website is on file. |
Matching semantics
- Results only include tenders that are currently open — quotes are not past due and fall within the near-term window. The window is server-side; partners do not control it.
- Matching is driven by the assigned user’s Speci-finder keywords. If the assigned user has no keywords configured, the response will be
200 OKwithdata: []. - See Data freshness for how quickly new data propagates.
Example request
curl -X GET \ "https://api.estimateone.com/api/supplier/v1/companies/{companyId}/speci-finder/results" \ -H "Authorization: Bearer $TOKEN" \ -H "x-e1-client-id: $CLIENT_ID"Errors
See Errors for the full catalogue. Common failures for this endpoint:
| Status | code | Cause |
|---|---|---|
| 400 | CLIENT_ID_HEADER_MISSING | x-e1-client-id header not sent. |
| 401 | CLIENT_ID_HEADER_MISMATCH | x-e1-client-id header does not match the token. |
| 401 | Unauthorised | Token invalid, company not registered, permission not published, or scope missing. |
| 5xx | FETCH_FAILED / INTERNAL_SERVER_ERROR | Something failed downstream. Retry with backoff. |
OpenAPI spec
The full OpenAPI 3.1 spec is published at https://api.estimateone.com/swagger/doc. Use it to drive client code generation in the language of your choice. You can also browse it interactively.