EverReal
  • Introduction
  • Authentication
    • API ClientID and ClientSecret
    • Authentication limitations
  • Rate limiting
  • Helpers
    • Errors
    • Pagination
    • Formatting
  • How to guide
    • EverReal Data Import Process
      • Connect an Integration
      • Import Mappers
      • Ideal CSV Structure
      • Debug Imports
      • FAQ
    • Data import via GraphQL
  • Endpoints
    • Account users / members
    • Owners
      • Owners Query
      • Owners Mutation
    • Property Groups
      • Property Groups Query
      • Property Group Mutation
    • Properties
      • Properties Query
      • Properties Mutation
    • Units
      • Units Query
      • Units Mutation
    • Listing
      • Listing Query
      • Listing Mutation
    • Candidates
      • Candidates Query
      • Candidate Mutation
    • Messages
    • Contact Activites
    • Tenants
      • Tenants Query
      • Tenant Mutation
    • Contract
      • Contract Query
      • Contract Mutation
    • Contacts
      • Contact Mutation
      • Contact Query
    • Document management
      • Document management
      • Simple file upload
    • Tasks
      • Tasks Query
    • Protocols
      • Protocol Query
  • Webhooks
    • Owner Events
      • OWNER_CREATED
      • OWNER_UPDATED
      • OWNER_DELETED
    • Property Events
      • PROPERTY_CREATED
      • PROPERTY_UPDATED
      • PROPERTY_DELETED
    • Unit Events
      • UNIT_CREATED
      • UNIT_UPDATED
      • UNIT_DELETED
    • Listing Events
      • LISTING_ACTIVATED
      • LISTING_ARCHIVED
      • LISTING_UPDATED
      • LISTING_DEACTIVATED
      • LISTING_CREATED
      • LISTING_PUBLISHED_TO_CHANNEL
      • LISTING_UNPUBLISHED_FROM_CHANNEL
    • Candidates Events
      • CANDIDATE_PARSED
      • LISTING_CANDIDATE_APPLIED
    • Listing Contracting Events
      • LISTING_CONTRACT_FLOW_SIGNED
      • LISTING_CONTRACT_FLOW_PARTIALLY_SIGNED
      • LISTING_CONTRACT_FLOW_WITHDRAWN
      • LISTING_CONTRACT_FLOW_STARTED
    • Listing Scheduling Events
      • LISTING_CANDIDATE_SCHEDULE_TIMESLOT_BOOKING_REMOVED_CANDIDATE
      • LISTING_CANDIDATE_SCHEDULE_TIMESLOT_BOOKING_REMOVED_ADMIN
      • LISTING_CANDIDATE_SCHEDULE_TIMESLOT_BOOKED_CANDIDATE
      • LISTING_CANDIDATE_SCHEDULE_TIMESLOT_BOOKED_ADMIN
      • LISTING_CANDIDATE_SCHEDULE_NEW_TIMESLOTS_REQUESTED
      • LISTING_CANDIDATE_SCHEDULE_INVITED_VIEWING
    • Protocol Events
      • PROTOCOL_COMPLETED
  • Change log
    • Releases
      • Introducing Mappers
      • Enhancements for GraphQL
      • Enhancements for Querying
      • Enhancements for Webhooks
    • Upcoming
      • Introduced Querying Protocol in GraphQL
Powered by GitBook
On this page
  • Important information
  • Query
  • Mutation
  • Schema Definition

Was this helpful?

  1. Endpoints

Listing

Advert for a property that is for sale or for rent, the listing actually refers to the listing agreement that is made between a principal and an agent, regarding marketing of a property.

PreviousUnits MutationNextListing Query

Last updated 2 years ago

Was this helpful?

To use EverReal playground is required to provide the Bearer token, read more in Master Data page

Important information

Amenities

Parking can have 2 values:

  • null if the listing does not have amenity "Has Parking" checked

  • {type, quality} if the listing has amenity "Has Parking" checked

Pictures and documents

There are 4 important document properties: {coverPicture,pictures,documents,floorPlans}

The base path of pictures is formed of the baseUrl + "/" picture.resourcePath .The base url is

Query

To understand what is necessary and how to use GraphQl, in Master Data page we explain what is necessary to do

type Query {
  listings(input: ListingFilterListPaging): [Listing]
  avgListingActivity(input: AvgActivityFilter): AvgListingActivity
  listingCounts(input: ListingCountsFilter): ListingCounts
}

type AvgListingActivity {
  activeListings: Int
}

type ListingCounts {
  listingsMissingViewings: Int
  listingsMissingContracts: Int
  activeAndPublished: Int
  olderThan30Days: Int
  listingsInContracting: Int
  listingsContractingCompleted: Int
  listingsMoveinCompleted: Int
}

type Listing {
  id: String
  title: String
  type: String
  isArchived: Boolean
  isActive: Boolean
  companyId: String
  listingResponsible: User
  contractDetails: ListingContractDetails
  coverPicture: IFile
  pictures: [IFile]
  documents: [IFile]
  floorplans: [IFile]
  company: Company
  status: LISTING_STATUS
  amenities: ListingAmenities
  listingInformation: ListingInformation
  availableFrom: Date
  propertyId: String
  property: Property
  unitId: String
  unit: Unit
  descriptions: ListingDescription
  createdAt: DateTime
  updatedAt: DateTime
}

type ListingAmenities {
  amenitiesIncluded: [AMENITIES_INCLUDED] # See this type under units page
  parking: UnitParkingType # See this type under units page
  qualityOfAmenities: String
  condition: String
  lastRenovationYear: Int
  heatingType: String
  mainEnergySource: String
  energyPerformanceCertificateAvailability: ENERGY_PERFORMANCE_CERTIFICATE_AVAILABILITY
  energyCertificateCreationDate: ENERGY_CERTIFICATE_CREATION_DATE
  buildingEnergyRatingType: BUILDING_ENERGY_RATING_TYPE
  thermalCharacteristic: Float
  energyConsumptionContainsWarmWater: Boolean
  energyEfficiencyClass: ENERGY_EFFICIENCY_CLASS
}

type ListingDescription {
  object: String
  amenities: String
  location: String
  other: String
}

type ListingContractDetails {
  currency: String
  rent: Float
  totalMonthlyRent: Float
  parkingRent: Float
  deposit: Float
  heatingCostsIncluded: Boolean
  utilityCosts: Float
  heatingCosts: Float
  petsAllowed: String
  displayAmount: Float
  hasCommission: Boolean
  commission: String
  commissionNote: String
  commissionType: String
}

enum UNIT_TYPE {
  APARTMENT
  HOUSE
  PARKING
  OFFICE
  STORE
  GASTRONOMY
  INDUSTRY
  SPECIAL_PURPOSE
  LAN
}

enum LISTING_TYPE {
  RENT_APARTMENT
  SELL_APARTMENT
  RENT_SHORT_TERM_APARTMENT
  RENT_HOUSE
  SELL_HOUSE
  RENT_PARKING
  SELL_PARKING
  RENT_RESIDENTIAL_LAND
  SELL_RESIDENTIAL_LAND
  RENT_OFFICE
  SELL_OFFICE
  RENT_STORE
  SELL_STORE
  RENT_GASTRONOMY
  SELL_GASTRONOMY
  RENT_INDUSTRY
  SELL_INDUSTRY
  RENT_SPECIAL_PURPOSE
  SELL_SPECIAL_PURPOSE
  RENT_COMMERCIAL_LAND
  SELL_COMMERCIAL_LAND
}

enum LISTING_STATUS {
  OPEN_FOR_CANDIDATES
  OPEN_FOR_APPLICANTS
  CONTRACTING_STARTED
  CONTRACTING_COMPLETED
  MOVE_IN_COMPLETED
  IS_INACTIVE
  IS_ARCHIVED
}

enum CANDIDATE_SOURCE {
  APPLIED_EVERREAL
  MANUAL_EVERREAL_CANDIDATE
  MANUAL_EVERREAL_SCHEDULED
  MANUAL_EVERREAL_APPLICANT
  IMMOSCOUT24
  WG_GESUCHT
  IMMOWELT
  IMMONET
  IVD24
  NWZ
  OPENIMMO_GENERIC
  EBAY
  OFFLINE_CONTRACT
}

input ListingFilter {
  from: Date
  to: Date
  candidateSources: [CANDIDATE_SOURCE]
  companyId: String
  propertyGroupId: String
  propertyId: String
  ownerId: String
  listingId: String
  external: Boolean
  fullSearch: String
  isArchived: Boolean
  isActive: Boolean
  internalAdvertiseId: String
  availableFrom: Date
  externalPropertyId: String
  scoringTemplateId: String
  propertyCity: String
  propertyName: String
  propertyStreet: String
  listingType: LISTING_TYPE
  status: LISTING_STATUS
  responsibleFullName: String
  unitName: String
  unitId: String
  externalUnitId: String
  unitType: UNIT_TYPE
  priceMin: Float
  priceMax: Float
  roomsMin: Int
  roomsMax: Int
  surfaceMin: Int
  surfaceMax: Int
  livingSurfaceMin: Int
  livingSurfaceMax: Int
  heightMax: Int
  heightMin: Int
  listingResponsibleUserId: String
  projectId: String
  candidateEmail: String
  candidateIsWinner: Boolean
}

input ListingFilterListPaging {
  filter: ListingFilter
  paging: GraphPaging
  sort: GraphSorting
}

input ListingCountsFilter {
  userId: String
  companyId: String
}

Usage:

Query:

  query listingsQuery(
    $from: Date
    $to: Date
    $companyId: String
    $propertyId: String
    $propertyGroupId: String
    $ownerId: String
    $listingId: String
    $isArchived: Boolean
    $isActive: Boolean
    $fullSearch: String
  ) {
    listings(
      input: {
        paging: { take: 100, skip: 0 }
        filter: {
          from: $from
          to: $to
          companyId: $companyId
          propertyGroupId: $propertyGroupId
          propertyId: $propertyId
          ownerId: $ownerId
          listingId: $listingId
          isArchived: $isArchived
          isActive: $isActive
          fullSearch: $fullSearch
        }
      }
    ) {
      id
      title
      type
      isArchived
      isActive
      companyId
      amenities{
        amenitiesIncluded
        qualityOfAmenities
        parking {type quantity}
        energyPerformanceCertificateAvailability
        energyCertificateCreationDate
        buildingEnergyRatingType
        thermalCharacteristic
        energyConsumptionContainsWarmWater
        energyEfficiencyClass
      }
      coverPicture {
        name
        resourceId
        resourcePath
        size
        type
        order
        isCoverPicture
      }
      pictures  {
        name
        resourceId
        resourcePath
        size
        type
        order
        isCoverPicture
      }
      documents   {
        name
        resourceId
        resourcePath
        size
        type
        order
        isCoverPicture
      }
      floorplans  {
        name
        resourceId
        resourcePath
        size
        type
        order
        isCoverPicture
      }
      property {
        objectId
        name
        category
        subtype
        type
        ownershipType
        fullAddress
      }
      unit {
        id
        objectId
        name
        category
        type
        subtype
        leasingStatusEnum
        leasingStatusesEnum
        statusesEnum
        floorNumber
        surface
        livingSurface
        netFloorSurface
        hasMainStorage
      }
      contractDetails {
        currency
        rent
        totalMonthlyRent
        parkingRent
        deposit
        heatingCostsIncluded
        utilityCosts
        heatingCosts
        petsAllowed
        displayAmount
        hasCommission
        commission
        commissionNote
        commissionType
      }
    }
  }

Variables:

You can used any variable in ListingFilter to

{
  "listingId": "fce90f3a-b8e4-4bc6-b6c0-2539acef5cdc",
  "propertyId": "e7cde0a1-9708-4fce-b36e-d8b8bcaa695f",
  "isActive": true,
  "isArchived": false,
  "fullSearch": "Hermannstrasse"
}

Should l be something like this.

curl --location --request POST 'https://acme.everreal.co/api/reporting/graphql' \
--header 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI2ZTdhZmRlOC0xODFjLTQyNzUtYjY1NC1lNmJmZTZiMTZhZWIiLCJzdWIiOiI0MTQ2OWVjMS0yMjkzLTRjMjMtYWVmNy1lZjA4YzBkZTU0ZjEiLCJleHAiOjE2NTU3Mjc2NDEsImlhdCI6MTY1NTcyNDA0MX0.VbA7zl36QrIxRdFVKPluKC0PGrvS_4IFcWUajVQQLfDR6fsXArD8Q83btZ6Fz1UUjloRjFMmfugtIvDIRF1TvQBnDJFyx5568tpDg-H5nSRQ0iQ0fv8mRIGQWdigkXozo2FjHYO1alzU44GVcRx4JxABclexeDjKqeRklr5Gbb-z4fa_jbnMfB4z9mCK0nmy08igMzAB6Zgy0-yHuMpj6aXU-GNL1ti50sDVgNiQRDXUEZN2vor1S9c3sUYA521vBkszvWEXRgM_2ndV8sR8L-Tsma331ojL3PvEm1UNGjVj_yE6RhHIqdwxF7KsqhiUHjFKzgESLSOl3yIUTE10uw' \
--header 'Content-Type: application/json' \
--header 'Cookie: accept-language=en-US' \
--data-raw '{"query":"  query listingsQuery(\n    $from: Date\n    $to: Date\n    $companyId: String\n    $propertyId: String\n    $propertyGroupId: String\n    $ownerId: String\n    $listingId: String\n    $isArchived: Boolean\n    $isActive: Boolean\n    $fullSearch: String\n  ) {\n    listings(\n      input: {\n        paging: { take: 100, skip: 0 }\n        filter: {\n          from: $from\n          to: $to\n          companyId: $companyId\n          propertyGroupId: $propertyGroupId\n          propertyId: $propertyId\n          ownerId: $ownerId\n          listingId: $listingId\n          isArchived: $isArchived\n          isActive: $isActive\n          fullSearch: $fullSearch\n        }\n      }\n    ) {\n      id\n      title\n      type\n      isArchived\n      isActive\n      companyId\n      coverPicture {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      pictures  {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      documents   {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      floorplans  {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      property {\n        id\n        objectId\n        name\n        category\n        subtype\n        type\n        ownershipType\n        fullAddress\n      }\n      unit {\n           id\n            objectId\n            name\n            category\n            type\n            subtype\n            leasingStatusEnum\n            leasingStatusesEnum\n            statusesEnum\n            floorNumber\n            surface\n            livingSurface\n            netFloorSurface\n            hasMainStorage\n      }\n      contractDetails {\n        currency\n        rent\n        totalMonthlyRent\n        parkingRent\n        deposit\n        heatingCostsIncluded\n        utilityCosts\n        heatingCosts\n        petsAllowed\n        displayAmount\n        hasCommission\n        commission\n        commissionNote\n        commissionType\n      }\n    }\n  }","variables":{"listingId":"fce90f3a-b8e4-4bc6-b6c0-2539acef5cdc","propertyId":"e7cde0a1-9708-4fce-b36e-d8b8bcaa695f","isActive":true,"isArchived":false,"fullSearch":"Hermannstrasse"}}'
var myHeaders = new Headers();
myHeaders.append("authorization", "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI2ZTdhZmRlOC0xODFjLTQyNzUtYjY1NC1lNmJmZTZiMTZhZWIiLCJzdWIiOiI0MTQ2OWVjMS0yMjkzLTRjMjMtYWVmNy1lZjA4YzBkZTU0ZjEiLCJleHAiOjE2NTU3Mjc2NDEsImlhdCI6MTY1NTcyNDA0MX0.VbA7zl36QrIxRdFVKPluKC0PGrvS_4IFcWUajVQQLfDR6fsXArD8Q83btZ6Fz1UUjloRjFMmfugtIvDIRF1TvQBnDJFyx5568tpDg-H5nSRQ0iQ0fv8mRIGQWdigkXozo2FjHYO1alzU44GVcRx4JxABclexeDjKqeRklr5Gbb-z4fa_jbnMfB4z9mCK0nmy08igMzAB6Zgy0-yHuMpj6aXU-GNL1ti50sDVgNiQRDXUEZN2vor1S9c3sUYA521vBkszvWEXRgM_2ndV8sR8L-Tsma331ojL3PvEm1UNGjVj_yE6RhHIqdwxF7KsqhiUHjFKzgESLSOl3yIUTE10uw");
myHeaders.append("Content-Type", "application/json");

var graphql = JSON.stringify({
  query: "  query listingsQuery(\n    $from: Date\n    $to: Date\n    $companyId: String\n    $propertyId: String\n    $propertyGroupId: String\n    $ownerId: String\n    $listingId: String\n    $isArchived: Boolean\n    $isActive: Boolean\n    $fullSearch: String\n  ) {\n    listings(\n      input: {\n        paging: { take: 100, skip: 0 }\n        filter: {\n          from: $from\n          to: $to\n          companyId: $companyId\n          propertyGroupId: $propertyGroupId\n          propertyId: $propertyId\n          ownerId: $ownerId\n          listingId: $listingId\n          isArchived: $isArchived\n          isActive: $isActive\n          fullSearch: $fullSearch\n        }\n      }\n    ) {\n      id\n      title\n      type\n      isArchived\n      isActive\n      companyId\n      coverPicture {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      pictures  {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      documents   {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      floorplans  {\n            name\n            resourceId\n            resourcePath\n            size\n            type\n            order\n            isCoverPicture\n      }\n      property {\n        id\n        objectId\n        name\n        category\n        subtype\n        type\n        ownershipType\n        fullAddress\n      }\n      unit {\n           id\n            objectId\n            name\n            category\n            type\n            subtype\n            leasingStatusEnum\n            leasingStatusesEnum\n            statusesEnum\n            floorNumber\n            surface\n            livingSurface\n            netFloorSurface\n            hasMainStorage\n      }\n      contractDetails {\n        currency\n        rent\n        totalMonthlyRent\n        parkingRent\n        deposit\n        heatingCostsIncluded\n        utilityCosts\n        heatingCosts\n        petsAllowed\n        displayAmount\n        hasCommission\n        commission\n        commissionNote\n        commissionType\n      }\n    }\n  }",
  variables: {"listingId":"fce90f3a-b8e4-4bc6-b6c0-2539acef5cdc","propertyId":"e7cde0a1-9708-4fce-b36e-d8b8bcaa695f","isActive":true,"isArchived":false,"fullSearch":"Hermannstrasse"}
})
var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: graphql,
  redirect: 'follow'
};

fetch("https://acme.everreal.co/api/reporting/graphql", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Mutation

Mutations are responsible to update a specific operations like activating, deactivating listing or archiving or unarchiving listing.

type Mutation {
  updateListing(listing: ListingInput): Listing
}

Here are details on the capabilities of different mutations

  • updateListing: Is used to perform update on an listing with the help of a listing Id, this will help is performing some basic operations listed below

Schema Definition

input ListingInput {
  id: String!
  action: LISTING_ACTIONS!
}

enum LISTING_ACTIONS {
  ACTIVATE_LISTING
  DEACTIVATE_LISTING
  ARCHIVE_LISTING
  UNARCHIVE_LISTING
}

Below we are providing a full example how to update listing, all this information is not required, only the ones that was using ! notation previously.


mutation {
  updateListing(
    listing: {
      id: "42b751a6-3eb6-4e48-a0d1-8e9959151672"
      action: ACTIVATE_LISTING
    }
  ) {
    id
  }
}
curl --location --request POST 'http://<subdomain>.everreal.co/api/reporting/graphql' \
--header 'Authorization: Bearer ....' \
--header 'Content-Type: application/json' \
--header 'Cookie: accept-language=de-DE' \
--data-raw '{"query":"\r\nmutation {\r\n  updateListing(\r\n    listing: {\r\n      id: \"42b751a6-3eb6-4e48-a0d1-8e9959151672\"\r\n      action: ACTIVATE_LISTING\r\n    }\r\n  ) {\r\n    id\r\n  }\r\n}","variables":{}}'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer ....");
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Cookie", "accept-language=de-DE");

var graphql = JSON.stringify({
  query: "\r\nmutation {\r\n  updateListing(\r\n    listing: {\r\n      id: \"42b751a6-3eb6-4e48-a0d1-8e9959151670\"\r\n      action: ACTIVATE_LISTING\r\n    }\r\n  ) {\r\n    id\r\n  }\r\n}",
  variables: {}
})
var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: graphql,
  redirect: 'follow'
};

fetch("http://<subdomain>.everreal.co/api/reporting/graphql", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
Ideal CSV Structure
https://resources.everreal.co