Cityofnewyork APIpassport.cityofnewyork.us ↗
Access NYC PASSPort public procurement solicitations. Retrieve RFx listings with agency, EPIN, status, procurement method, and release date via 2 endpoints.
What is the Cityofnewyork API?
The NYC PASSPort Solicitations API provides access to New York City's public procurement opportunities through 2 endpoints, returning fields like EPIN, agency, procurement method, RFx status, and release date for every active solicitation. The list_solicitations endpoint retrieves all public RFx records with automatic pagination, while search_solicitations filters results by keyword across solicitation names and descriptions.
curl -X GET 'https://api.parse.bot/scraper/818a1929-82b5-4d75-a8cc-bdfe20bd21a1/list_solicitations?max_pages=1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace passport-cityofnewyork-us-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: NYC PASSPort solicitations — browse and search procurement opportunities."""
from parse_apis.nyc_passport_public_solicitations_api import NYCPassport, SolicitationPageError
client = NYCPassport()
# List recent solicitations (capped to 5 items)
for sol in client.solicitations.list(limit=5):
print(sol.procurement_name, "|", sol.agency, "|", sol.rfx_status)
# Search for construction-related opportunities
result = client.solicitations.search(keyword="construction", limit=1).first()
if result:
print(result.epin, result.procurement_name, result.industry, result.release_date)
# Typed error handling around a list call
try:
for sol in client.solicitations.list(keyword="technology", limit=3):
print(sol.procurement_name, sol.procurement_method, sol.main_commodity)
except SolicitationPageError as exc:
print(f"Page error: {exc}")
print("exercised: solicitations.list / solicitations.search / SolicitationPageError catch")
List all public solicitations available on NYC PASSPort. Returns paginated results from the public browse page, automatically advancing through server-side pages. Each page contains 15 results. Without a keyword filter, returns all solicitations ordered by most recent release date.
| Param | Type | Description |
|---|---|---|
| keyword | string | Optional keyword to filter solicitations by name or description. |
| max_pages | integer | Maximum number of pages to retrieve. Each page contains 15 results. |
{
"type": "object",
"fields": {
"total_count": "integer - total number of solicitations available on the site",
"solicitations": "array of solicitation objects with program, industry, epin, procurement_name, agency, rfx_status, procurement_method, release_date, due_date, remaining_time, main_commodity, and detail_id",
"retrieved_count": "integer - number of solicitations actually retrieved"
},
"sample": {
"data": {
"total_count": 151,
"solicitations": [
{
"epin": "06922P0040",
"agency": "DEPARTMENT OF SOCIAL SERVICES",
"program": "Supportive Housing",
"due_date": "12/31/2099 7:00:00 PM",
"industry": "Human/Client Service",
"detail_id": "37097",
"rfx_status": "Released",
"release_date": "6/8/2026 10:00:00 AM",
"main_commodity": "Housing Services",
"remaining_time": "",
"procurement_name": "06922P0040-Provision of Congregate Supportive Housing",
"procurement_method": "Competitive Sealed Proposal"
}
],
"retrieved_count": 15
},
"status": "success"
}
}About the Cityofnewyork API
What the API Returns
Both endpoints return an array of solicitation objects drawn from NYC PASSPort, the City of New York's Procurement and Sourcing Solutions Portal. Each object includes: program, industry, epin (the unique procurement identifier), procurement_name, agency, rfx_status, procurement_method, and release_date. The response also surfaces total_count (total solicitations available on the site) and retrieved_count (how many were actually fetched in the current request).
Endpoints and Parameters
list_solicitations accepts an optional keyword string to filter by name or description, and an optional max_pages integer to cap how many pages are fetched — each page holds 15 records. This makes it straightforward to do a full sweep of all open solicitations or limit retrieval to a manageable batch.
search_solicitations takes the same keyword and max_pages parameters and additionally echoes back the keyword field in the response so you can confirm which query produced the results. Use this endpoint when you want to target a specific topic, industry, or agency name rather than pulling the full list.
Pagination and Coverage
Results are paginated at 15 solicitations per page on the source portal. Both endpoints handle pagination automatically up to the max_pages limit you specify. Omitting max_pages will retrieve all available pages. The total_count field lets you calculate how many pages exist before committing to a full retrieval.
The Cityofnewyork API is a managed, monitored endpoint for passport.cityofnewyork.us — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when passport.cityofnewyork.us changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official passport.cityofnewyork.us API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor new RFx releases from specific NYC agencies by polling
list_solicitationsand filtering on theagencyfield. - Build a procurement alert system that runs
search_solicitationswith industry-specific keywords and flags newrelease_dateentries. - Compile a dataset of NYC contracting opportunities segmented by
procurement_method(RFP, RFQ, RFI) for competitive analysis. - Track
rfx_statuschanges over time to identify solicitations moving from open to awarded or cancelled. - Populate a vendor-facing dashboard with open NYC solicitations matched to a company's registered
industrycategories. - Research NYC procurement patterns by aggregating solicitation volume per
agencyover time usingtotal_countand paginated records. - Cross-reference
epinvalues against contract award databases to map solicitations to their eventual outcomes.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does NYC PASSPort have an official developer API?+
What does the `epin` field represent and how is it useful?+
epin (Electronic Procurement Identification Number) is the unique identifier assigned to each procurement in the NYC PASSPort system. It can be used to look up a specific solicitation directly on the portal and to join records across datasets that reference the same procurement.What is the difference between `list_solicitations` and `search_solicitations`?+
list_solicitations retrieves all public solicitations on the portal, with an optional keyword filter applied client-side. search_solicitations submits the keyword as a search query and returns only matching results, also surfacing the keyword field in the response to confirm which query was used. For broad sweeps use list_solicitations; for targeted lookups use search_solicitations.Does the API return solicitation documents, attachments, or award details?+
Are there any limitations on how much data can be retrieved in one request?+
max_pages controls the upper bound on records returned. If max_pages is omitted, the API will paginate through all available pages, which can result in a large response when total_count is high. For large datasets, setting a reasonable max_pages value and iterating incrementally is advisable.