Project

A real estate transaction project.

  • asset
    Type: object
    required

    Asset information: single property or portfolio with property count.

    • type
      Type: string
      required

      Asset type: "single" for single property, "portfolio" for multiple properties.

    • propertyCount
      Type: null | integer | string Pattern: ^-?(?:0|[1-9]\d*)$Format: int32

      Number of properties in the portfolio. Only present when type is "portfolio".

  • createdUtc
    Type: stringFormat: date-time
    required

    Creation timestamp (UTC).

  • etag
    Type: string
    required

    ETag for concurrency control.

  • id
    Type: string
    required

    Project ID.

  • name
    Type: string
    required

    Project name.

  • status
    Type: string
    required

    Project lifecycle status: open, closed, deleted.

  • updatedUtc
    Type: stringFormat: date-time
    required

    Last update timestamp (UTC).

  • changeOrigin
    Type: null | string

    Origin channel that triggered this change. Informational only; treat as an opaque value.

  • changeType
    Type: null | string

    Type of change that produced this version: "create", "update", or "delete"

  • classification
    Type: null | string

    Project classification (work stage): draft, active, inactive. Defaults to "draft" when no explicit classification has been set.

  • deletedUtc
    Type: null | stringFormat: date-time

    Deletion timestamp (UTC) if the resource has been deleted.

  • exclusivity
    Type: null | string

    Sales exclusivity type: "exclusive", "non_exclusive", "other", or null if not set. Replaces the deprecated mandate field; both are populated with the same value on read responses for the duration of the deprecation window.

  • externalRefs
    Type: array object[] · ExternalRef[]

    External references for CRM integration (e.g., Salesforce, HubSpot).

    Represents an external system reference (e.g., Salesforce, HubSpot, Pipedrive). Supports multiple CRM systems simultaneously.

    • id
      Type: string
      max length:  
      255
      required

      External identifier within the namespace (e.g., "003XXXXXXXXXXXX" for Salesforce). Case-sensitive. Format depends on the external system.

    • namespace
      Type: string
      max length:  
      50
      required

      External system namespace (e.g., "salesforce", "hubspot", "pipedrive", "csv-import"). Case-insensitive.

  • mandate
    Type: null | string
    deprecated

    Deprecated alias for exclusivity. Populated with the same value on read responses. Will be removed in a future minor version — migrate to exclusivity.

  • price
    Type: object · Price nullable

    Asking price / price expectation for the deal (single value). Pair with priceRange when an indicative band is also needed; the range, if set, must contain this value.

    • currency
      Type: string
      min length:  
      3
      max length:  
      3
      required

      ISO 4217 currency code (e.g., "SEK", "EUR", "USD").

    • value
      Type: number | string Pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?$Format: double
      min:  
      0
      required

      Price value. Multiply by scale factor to get actual amount. Example: value=1500 with scale="millions" = 1.5 billion.

    • scale
      Type: string

      Scale factor for the value: "none" (1), "thousands" (1,000), "millions" (1,000,000), "billions" (1,000,000,000). Default is "none" if not specified on input.

  • priceRange
    Type: object · PriceRange nullable

    Custom price range (min/max override for display purposes). When set, must contain the price value.

    • currency
      Type: string
      min length:  
      3
      max length:  
      3
      required

      ISO 4217 currency code (e.g., "EUR", "SEK", "USD").

    • max
      Type: null | number | string Pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?$Format: double
      min:  
      0

      Maximum price. Multiply by scale factor to get actual amount. Example: max=200 with scale="millions" = 200 million. Omit for an open-ended lower-bounded range.

    • min
      Type: null | number | string Pattern: ^-?(?:0|[1-9]\d*)(?:\.\d+)?$Format: double
      min:  
      0

      Minimum price. Multiply by scale factor to get actual amount. Example: min=100 with scale="millions" = 100 million. Omit for an open-ended upper-bounded range.

    • scale
      Type: string

      Scale factor for the values: "none" (1), "thousands" (1,000), "millions" (1,000,000), "billions" (1,000,000,000). Default is "none" if not specified on input.

  • properties
    Type: array object[] | null · ProjectPropertyRef[]

    Linked properties. Currently contains at most one property.

    Reference to a linked property.

    • id
      Type: string
      required

      Property ID.

    • name
      Type: string
      required

      Property name.

    • uri
      Type: null | string

      Opaque canonical Propstreet entity URI for deep linking.

  • teaser
    Type: object · Teaser nullable

    Teaser information including workflow stage and timestamps. Null if teaser workflow has not started.

    • createdUtc
      Type: stringFormat: date-time
      required

      Creation timestamp (UTC).

    • etag
      Type: string
      required

      ETag for concurrency control. Send back in If-Match on PATCH.

    • id
      Type: string
      required

      Teaser ID. Opaque string. Stable across reads — clients should treat the value as opaque (do not parse).

    • updatedUtc
      Type: stringFormat: date-time
      required

      Last update timestamp (UTC).

    • changeOrigin
      Type: null | string

      Origin of the change: api, mcp, ui, or system. Returned only on write responses; null on GET.

    • changeType
      Type: null | string

      Type of change that produced this version: create, update, or delete. Returned only on write responses; null on GET.

    • communicatedUtc
      Type: null | stringFormat: date-time

      When the teaser was first communicated to prospects (UTC). Null if not yet communicated.

    • exclusivity
      Type: null | string

      Project sales exclusivity: exclusive, non_exclusive, or other. Mirrored from the parent project (null on property / room contexts). Aligned with the project resource's exclusivity field.

    • isPreMarket
      Type: null | boolean

      True when the teaser is pre-market (investor-initiated portfolio teaser, before a project exists).

    • navigateUri
      Type: null | string

      Propstreet app deeplink in the propstreet:// URI scheme. Opaque to integrators; used by first-party clients (Propstreet app, Propstreet agent) for in-app navigation.

    • nudge
      Type: object · TeaserNudge nullable

      Optional steerable hint when a prerequisite is missing or the current state blocks the obvious next move. Carries a stable code alongside the human-readable message — branch on the code.

    • options
      Type: object · TeaserOptions nullable

      Author-curated visibility matrix for each teaser field. The author is whoever owns the parent — broker on project / room, investor on property pre-market. Drives what third-party investors see in the projection.

    • projection
      Type: object · TeaserProjection nullable

      Third-party investor projection — what investors actually see in the prospect feed and shortlist views, rendered from the stored fields after applying the author's visibility matrix. Hidden fields are absent (not null) so the JSON shape mirrors the investor view.

    • publishedUtc
      Type: null | stringFormat: date-time

      When the teaser was published (UTC). Null if not yet published.

    • stage
      Type: null | string

      Teaser workflow stage: property_added, drafting, published, verified, communicated. Null if the teaser workflow has not started.

    • tags
      Type: array string[] | null

      Snapshot of tags visible on this teaser — the exact set the author chose to disclose to investors at write time. Stored verbatim and rendered verbatim; never resolved against the property's current pool. Subsequent property-tag edits do not change what investors see on this teaser; the author writes a new teaser to pick them up. Omitted on thin steerable envelopes (e.g., when nudge.code is no_property_attached, no_pre_market_yet, or transferred_to_other_broker).

    • template
      Type: object · TeaserTemplate nullable

      What the author is allowed to choose for each option, given the active billing plan, the underlying property data, and the parent context (project / property pre-market / room).

    • title
      Type: null | string

      Author-side display title (the teaser title as seen by whoever owns the parent — broker on project / room, investor on property pre- market). Composed from categories and locality at read time; never stored. Null when both categories and locality are unknown.

    • uri
      Type: null | string

      Opaque canonical Propstreet entity URI for deep linking.

    • verifiedUtc
      Type: null | stringFormat: date-time

      When the teaser was verified (UTC). Null if not yet verified.

  • transactions
    Type: array object[] | null · Transaction[]

    Completed transactions (populated when status="closed").

    Transaction record for a closed deal.

    • closedUtc
      Type: stringFormat: date-time
      required

      When the deal closed (ISO 8601 UTC).

    • type
      Type: string
      required

      Transaction type: "sell" (future: "buy").

    • buyer
      Type: object · TransactionParty nullable

      Buyer details (populated for sell transactions).

    • price
      Type: object · PriceOrRange nullable

      Transaction price as a single value, a min/max range, or both.

    • seller
      Type: object · TransactionParty nullable

      Seller details (populated for buy transactions).

    • yield
      Type: object · PercentOrRange nullable

      Yield at transaction as a single value, a min/max range, or both. Values are in percentage form (e.g., 5.0 = 5%).

  • uri
    Type: null | string

    Opaque canonical Propstreet entity URI for deep linking.