Listing lifecycle
Every listing moves through a defined set of statuses. TheListingsStatusEnum (from @prisma/client) defines the valid states:
Draft
The listing is being authored. It is not visible to the public. Partners can save incomplete data and return to finish later. Status:
active (draft variant — not yet published).Pending review
Once a partner submits the listing for approval, it enters a pending review state. Jurisdictional admins or admins review the listing before it goes live. Requested changes and the requesting user are tracked in the
requestedChanges, requestedChangesDate, and requestedChangesUser fields.Active (open)
The listing is published and accepting applications. The
applicationOpenDate and applicationDueDate fields control when the application window opens and closes. Status: active.Closed
The
applicationDueDate has passed, or a partner manually closes the listing. The closedAt timestamp is recorded. No new applications are accepted. Status: closed.The
PUT /listings/closeListings endpoint triggers the automated listing-close process job. It is typically invoked on a schedule and requires admin or jurisdictional admin authorization.Key listing data
Property details
Property details
name— listing title (required, max 256 characters)listingsBuildingAddress— the physical address of the propertydeveloper— name of the housing developeryearBuilt— year the building was constructedbuildingTotalUnits— total number of units in the buildingneighborhood,region,configurableRegion— geographic classificationamenities,unitAmenities— property-level and unit-level amenitiessmokingPolicy,petPolicy,allowsDogs,allowsCats— building policiesaccessibility— ADA or accessibility noteslistingNeighborhoodAmenities— nearby transit, schools, parks, etc.
Unit types and rent
Unit types and rent
Each listing includes either
units (individual unit records) or unitGroups (grouped unit definitions), but not both. A listing must have at least one unit or unit group to be published.Units reference AMI charts to define income limits per household size. Rent amounts and deposit ranges are set per unit. Summary data is available via unitsSummarized, unitGroupsSummarized, and unitsSummary.depositMin,depositMax,depositType,depositValue— deposit configurationrentalAssistance— notes about rental assistance programs (max 4096 characters)costsNotIncluded— utilities or fees not included in rent
Building selection criteria
Building selection criteria
Partners can attach selection criteria via:
buildingSelectionCriteria— a URL linking to criteria documentationlistingsBuildingSelectionCriteriaFile— an uploaded asset filecreditHistory,rentalHistory,criminalBackground— screening policy textrequiredDocuments— document checklist for applicantsrequiredDocumentsList— structured document list
disableBuildingSelectionCriteria feature flag hides this section when set on the jurisdiction.Preferences and programs
Preferences and programs
Listings can include multiselect questions that represent preferences (e.g., Live/Work in the City) or programs (e.g., veterans housing). These are managed via
listingMultiselectQuestions and linked to MultiselectQuestion records. Preferences affect lottery ranking when enableGeocodingPreferences is enabled.The disableListingPreferences feature flag removes preferences support entirely for a jurisdiction.Images and documents
Images and documents
listingImages— ordered array of listing images (at leastminimumImagesRequiredmust be provided before publishing; configurable per jurisdiction viaminimumListingPublishImagesRequired)listingsMarketingFlyerFile,marketingFlyer,accessibleMarketingFlyer— marketing materialsassets— general file attachments
Waitlist settings
Waitlist settings
isWaitlistOpen— whether the waitlist is currently accepting applicantswaitlistCurrentSize— current number of households on the waitlistwaitlistMaxSize— maximum waitlist capacitywaitlistOpenSpots— number of open waitlist spotsdisplayWaitlistSize— controls whether waitlist size is shown publiclyshowWaitlist(computed) —truewhenwaitlistCurrentSize < waitlistMaxSize
Leasing agent
Leasing agent
leasingAgentName,leasingAgentEmail,leasingAgentPhone,leasingAgentTitleleasingAgentOfficeHourslistingsLeasingAgentAddress
Application methods
A listing’sapplicationMethods array defines how applicants submit. The ApplicationMethodsTypeEnum (from @prisma/client) supports:
Common Application (digital)
Sets
digitalApplication: true and commonDigitalApplication: true. Applicants complete the multi-step Bloom Common Application form on the public portal. The listing’s applicationConfig can customize form sections.External link
Sets
paperApplication: true or uses a Referral method type. Partners supply a URL to a third-party form or a paper application mailing/drop-off address. Pick-up address (listingsApplicationPickUpAddress), drop-off address (listingsApplicationDropOffAddress), and mailing address (listingsApplicationMailingAddress) can each be configured with an ApplicationAddressTypeEnum type.disableCommonApplication feature flag prevents the digital application option from being selected for any listing in a jurisdiction.
Partners portal workflow
Create a listing
Navigate to Listings > Add listing in the Partners Portal. Fill in the required fields across all sections. The listing is saved as a draft. Required fields before publishing are enforced by the
requiredFields metadata array and @ValidateListingPublish decorators.Add units
Add individual units or unit groups with bedroom type, AMI percentage, monthly rent, and accessibility type. At least one unit or unit group is required.
Configure application settings
Choose an application method (digital Common Application or external link), set open and due dates, and configure any preferences or programs.
Submit for review
Submit the listing for review. Admins can request changes or approve it for publication. Approval permissions are controlled by the jurisdiction’s
listingApprovalPermissions field.Publish
Once approved, publish the listing. The
publishedAt timestamp is recorded and the listing becomes publicly visible with status active.Listing statuses and review orders
- Listing statuses (ListingsStatusEnum)
- Review order types (ReviewOrderTypeEnum)
- Availability filter values (FilterAvailabilityEnum)
| Status | Description |
|---|---|
active | Listing is published and visible to the public |
closed | Application window has ended |
pendingReview | Submitted for admin review before publishing |
changesRequested | Admin has requested edits before approval |
pending | Draft saved but not yet submitted for review |
Filtering and querying listings
TheGET /listings endpoint accepts ListingsQueryParams for filtering. You can also use POST /listings/list with a ListingsQueryBody for richer filter expressions.
Supported filter keys (ListingFilterKeys):
| Filter key | Description |
|---|---|
status | Filter by ListingsStatusEnum value |
jurisdiction | Filter by jurisdiction ID |
name | Search by listing name |
city, zipCode, neighborhood, counties | Geographic filters |
bedrooms, bathrooms, bedroomTypes | Unit type filters |
monthlyRent | Maximum rent filter |
availability, availabilities | Availability state filter |
reservedCommunityTypes | Filter by reserved community type |
multiselectQuestions | Filter by associated preference/program |
listingFeatures | Filter by accessibility or building features |
section8Acceptance | Filter by Section 8 acceptance |
homeTypes | Filter by home type |
regions, configurableRegions | Filter by region |
parkingType | Filter by parking type |
isVerified | Filter by verified status |
leasingAgent | Filter by leasing agent |
listingType | Filter by listing type |
ids | Fetch specific listings by ID array |
API endpoints
| Method | Path | Description |
|---|---|---|
GET | /listings | Get a paginated set of listings with query param filters |
POST | /listings/list | Get a paginated set of listings with body-based filters |
GET | /listings/:id | Get a single listing by UUID |
GET | /listings/external/:id | Get a listing formatted for external consumption |
POST | /listings | Create a new listing |
POST | /listings/duplicate | Duplicate an existing listing |
PUT | /listings/:id | Update a listing by UUID |
DELETE | /listings | Delete a listing by ID (passed in request body) |
PUT | /listings/closeListings | Trigger the automated listing-close cron job |
GET | /listings/mapMarkers | Get map marker data for all active listings |
GET | /listings/csv | Export listings and units as a ZIP of CSV files |
GET | /listings/csvSecure | Secure CSV export (returns a signed URL) |
GET | /listings/byMultiselectQuestion/:id | Get listing IDs associated with a multiselect question |
GET | /listings/byProperty/:propertyId | Get listing IDs associated with a property |
POST /listings and PUT /listings/:id use the ListingCreateUpdateValidationPipe, which performs additional DTO manipulation and enforces publish-time validation rules beyond standard class-validator decorators.CSV export
TheGET /listings/csv endpoint returns a ZIP archive containing CSV files for listings and their associated units. Query parameters are defined by ListingCsvQueryParams. Access requires both an API key and partner-level permissions.
The secure variant GET /listings/csvSecure returns a signed URL instead of streaming the file directly, which is suitable for use cases where the client needs to download the file independently.