buy.nsw.gov.au API
Search live NSW Government procurement opportunities by keyword, category, opportunity type, region, sort order, and page. Retrieve public opportunity details, including descriptions, overview fields, dates, buyer, categories, related content, and currently published attachments. List live category, opportunity-type, and area search-filter labels and values.
Endpoint health
Loading verification…
Connect your agent
Connect through MCP so your agent can find this API, read its docs, and call its endpoints.
Add the server from your terminal.
claude mcp add --transport http agent-data https://agent-data.motie.dev/mcpIn Claude Code, run /mcp, select agent-data, then Authenticate. Sign in to your agent-data account in the browser.
Then ask your agent to use the buy.nsw.gov.au API for your task.
Call it over HTTP
Get an API keySign up free, generate an API key, and set it as AGENT_DATA_API_KEY in your environment. Your first 100 calls each month are free.
curl --request GET --get 'https://api.agent-data.dev/buy-nsw-gov-au/v1/opportunities' \
--header "Authorization: Bearer $AGENT_DATA_API_KEY"Endpoints
Inputs and response fields for every endpoint in this API.
GETOpportunities/v1/opportunities
Search the live Buy NSW result fragment. Multi-select filters accept repeated query parameters.
Input
queryOptionalQuery · string, default: Keyword search; an empty string returns unfiltered opportunities.
Example: Actuarial
categoriesOptionalQuery · array | nullOne or more Buy NSW category values.
Example: finance-tax-and-insurance
typesOptionalQuery · array | nullOne or more opportunity types.
Example: Tenders
areaOptionalQuery · array | nullOne or more NSW regional area values.
Example: sydney-metro
sortOptionalQuery · "Relevance" | "LastUpdated" | "AtoZ" | "ZtoA" | "Ascending" | "Descending" | nullSort option exposed by the source.
Example: AtoZ
pageOptionalQuery · integer, min: 1, default: 1One-based source result page.
Example: 1
Response
areastring[]pageintegersortstring | nullitemsobject[]items[].buyerstring | nullitems[].titlestringitems[].summarystring | nullitems[].source_idstringitems[].categoriesstring[]items[].source_urlstringitems[].record_type"opportunity" | "scheme"items[].closing_datestring | nullitems[].opportunity_idstring | nullitems[].reference_codesstring[]items[].opportunity_typestring | nullquerystringtypesstring[]next_pageinteger | nullpage_sizeintegertransportstringcategoriesstring[]request_idstringsource_urlstringtotal_pagesintegerprevious_pageinteger | nulltotal_resultsintegerupstream_attemptsobject[]upstream_attempts[].url?string | nullupstream_attempts[].attemptintegerupstream_attempts[].outcomestringupstream_attempts[].refusal?string | nullupstream_attempts[].transportstringupstream_attempts[].error_type?string | nullupstream_attempts[].status_code?integer | nullupstream_attempts[].tls_profile?string | nullupstream_attempts[].response_body?string | nullupstream_attempts[].response_bytes?integer | nullupstream_attempts[].response_sha256?string | nullupstream_attempts[].response_header_names?string[]Fields marked ? are optional.
GETOpportunity filters/v1/opportunity-filters
Fetch live search-form categories, opportunity types, and areas. Use each value with the corresponding categories, types, or area parameter of GET /v1/opportunities. Search-form categories are a flat group with no selectable subcategories.
Input
No input parameters.
Response
areaobject[]area[].labelstringarea[].valuestringtypesobject[]types[].labelstringtypes[].valuestringtransportstringcategoriesobject[]categories[].labelstringcategories[].valuestringrequest_idstringsource_urlstringupstream_attemptsobject[]upstream_attempts[].url?string | nullupstream_attempts[].attemptintegerupstream_attempts[].outcomestringupstream_attempts[].refusal?string | nullupstream_attempts[].transportstringupstream_attempts[].error_type?string | nullupstream_attempts[].status_code?integer | nullupstream_attempts[].tls_profile?string | nullupstream_attempts[].response_body?string | nullupstream_attempts[].response_bytes?integer | nullupstream_attempts[].response_sha256?string | nullupstream_attempts[].response_header_names?string[]Fields marked ? are optional.
GETOpportunities by opportunity id/v1/opportunities/{opportunity_id}
Retrieve a public procurement opportunity detail page using its opaque ID from a Buy NSW opportunity link. Search may also return procurement-scheme records, which include their source URL and are not accepted by this detail route.
Input
opportunity_idRequiredPath · stringExample: DB89347C-DC7C-4D4D-B86301D6DA91423E
Response
buyerstring | nulltitlestringoverviewobjectsectionsobject[]sections[].textstringsections[].headingstringsections[].headingsstring[]source_idstringtransportstringcategoriesstring[]request_idstringsource_urlstringattachmentsobject[]attachments[].urlstringattachments[].namestringdescriptionstring | nullrecord_typestringclosing_datestring | nullpublish_datestring | nullopportunity_idstringupstream_attemptsobject[]upstream_attempts[].url?string | nullupstream_attempts[].attemptintegerupstream_attempts[].outcomestringupstream_attempts[].refusal?string | nullupstream_attempts[].transportstringupstream_attempts[].error_type?string | nullupstream_attempts[].status_code?integer | nullupstream_attempts[].tls_profile?string | nullupstream_attempts[].response_body?string | nullupstream_attempts[].response_bytes?integer | nullupstream_attempts[].response_sha256?string | nullupstream_attempts[].response_header_names?string[]estimated_decision_datestring | nullFields marked ? are optional.
Don’t see the endpoint you need?
Ask agent-data to add an endpoint or return more fields. Extensions are free and keep existing endpoints working.
An account is required to submit an extension. Prepare your request, then sign in to build.