Versões
Unstable
API
Imóvel

/unstable/imoveis/home

Method: GET

Essa rota recebe os imóveis que foram selecionados no painel de integrações (opens in a new tab) no campo "Site" com a tag "Home"

Ela aceita duas Query Strings opcionais:

types.ts
limit?: number
availableFor?: "VENDA" | "LOCACAO"

O parâmetro limit define a quantidade máxima de imóveis que será retornada.

Caso availableFor seja VENDA serão excluídos os imóveis que não estão disponíveis para venda.

Caso availableFor seja LOCACAO serão excluídos os imóveis que não estão disponíveis para locação.

Retorna uma lista de CardProperty

actions.ts
export async function getHomeProperties({
  limit,
  availableFor,
}: {
  limit: number;
  availableFor: AvailableFor;
}) {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(
    `${BASE_URL}/${VERSION}/imoveis/home?limit=${limit}&availablefor=${availableFor}`,
    { headers, ...CONFIG },
  );
  if (response.ok) return (await response.json()) as CardProperty[];
  return [];
}

/unstable/imoveis/destaque

Method: GET

Essa rota recebe os imóveis que foram selecionados no painel de integrações (opens in a new tab) no campo "Site" com a tag "Destaque"

Ela aceita uma Query String opcional:

types.ts
limit?: number

O parâmetro limit define a quantidade máxima de imóveis que será retornada.

Retorna uma lista de CardProperty

actions.ts
export async function getHighlights({
  limit,
}: {
  limit: number;
}) {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(
    `${BASE_URL}/${VERSION}/imoveis/home?limit=${limit}`,
    { headers, ...CONFIG },
  );
  if (response.ok) return (await response.json()) as CardProperty[];
  return [];
}

/unstable/imoveis/similar

Method: GET

Essa rota recebe os imóveis que foram selecionados no painel de integrações (opens in a new tab) no campo "Site" e que tenham similaridade com o imóvel selecionado pela query string. A busca compara tipologia, distância, e o delta de preço e área.

Ela aceita três Query Strings:

types.ts
id: string
limit?: number
availableFor: "VENDA" | "LOCACAO"

O parâmetro id é obrigatório. Deve ser o id do imóvel com o qual se deseja comparar.

O parâmetro limit é opcional define a quantidade máxima de imóveis que será retornada.

O parâmetro availableFor é obrigatório.

Caso availableFor seja VENDA serão excluídos os imóveis que não estão disponíveis para venda.

Caso availableFor seja LOCACAO serão excluídos os imóveis que não estão disponíveis para locação.

Retorna uma lista de CardProperty

actions.ts
export async function getSimilar({
  id,
  limit,
  availableFor,
}: {
  id: string;
  limit: number;
  availableFor: AvailableFor;
}) {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(
    `https://www.usenonstop.com/api/unstable/imoveis/similar?id=${id}&limit=${limit}&availableFor=${availableFor}`,
    { headers },
  );
 
  if (response.ok) return (await response.json()) as CardProperty[];
  return [];
}

/unstable/imoveis/urls

Method: GET

Essa rota recebe URLs criadas com foco em SEO para todos os imóveis que foram selecionados no painel de integrações (opens in a new tab). Essas URLs podem ser utilizadas para criação de páginas estáticas.

Se você estiver usando Next.js (opens in a new tab) é simples como:

src/app/imovel/[url]/page.tsx
export async function generateStaticParams() {
  const urls = await getUrls();
 
  return urls.map((url) => ({ url }));
}
actions.ts
export async function getUrls() {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
 
  const response = await fetch(
    "https://www.usenonstop.com/api/unstable/imoveis/urls",
    { headers },
  );
 
  if (response.ok) return (await response.json()) as string[];
  return [];
}

/unstable/imoveis/[id]

Method: GET

Essa rota recebe as informações completas de um imóvel. Utilize o código nonStop como id (ex. PG5SM). Na URL criada pela nonStop o id é o último campo.

Por exemplo: apartamento-tipo-para-locacao-com-4-quartos-moema-sao-paulo-sp-id-PG5SM.

Retorna uma Property

actions.ts
export async function getProperty(base36Id: string) {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(`https://www.usenonstop.com/api/unstable/imoveis/${base36Id}`, {
    headers
  });
 
  if (response.ok) return (await response.json()) as Property;
  return null;
}

/unstable/imoveis/estados

Method: GET

Essa rota recebe uma lista de todos os estados que contém imóveis selecionados no painel de integrações (opens in a new tab). Essa lista pode ser utilizada para alimentar um dropdown nos filtros de busca por exemplo.

Retorna uma lista de UF

actions.ts
export async function getStates() {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch("https://www.usenonstop.com/api/unstable/imoveis/estados", {
    headers
  });
 
  if (response.ok) return (await response.json()) as UF[];
  return null;
}

/unstable/imoveis/cidades

Method: GET

Essa rota recebe uma lista de todas as cidades que contém imóveis selecionados no painel de integrações (opens in a new tab).
Essa lista pode ser utilizada para alimentar um autocomplete nos filtros de busca por exemplo.

Ela aceita três Query Strings opcionais:

types.ts
state?: UF | null
query?: string | null
limit?: number

O parâmetro state restringe a busca pelo estado selecionado.

O parâmetro query faz uma busca de texto pelo termo e retorna as cidades correspondentes.

Retorna uma lista de cidades como string.

actions.ts
export async function getCities({
  state,
  query,
  limit = 10,
}: {
  state?: string | null;
  query?: string | null;
  limit?: number;
}) {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(
    `${BASE_URL}/${VERSION}/imoveis/cidades?state=${state}&query=${query}&limit=${limit}`,
    { headers, ...CONFIG },
  );
  if (response.ok) return (await response.json()) as string[];
  return null;
}

/unstable/imoveis/bairros

Method: GET

Essa rota recebe uma lista de todos os bairros que contém imóveis selecionados no painel de integrações (opens in a new tab). Eles vêm ordenados por relevância (os bairros com mais imóveis vêm primeiro).

Essa lista pode ser utilizada para criar links para as páginas dos imóveis mais relevantes ou para alimentar um dropdown/autocomplete com as opções para filtro.

Ela aceita cinco Query Strings opcionais:

types.ts
state?: UF | null
city?: string | null
query?: string | null
limit?: number
areas?: string[]

O parâmetro state restringe a busca pelo estado selecionado.

O parâmetro city restringe a busca pela cidade selecionada.

O parâmetro query faz uma busca de texto pelo termo e retorna os bairros correspondentes.

O parâmetro limit define a quantidade máxima de bairros que será retornada.

O parâmetro areas exclui da resposta os bairros da lista. Dessa forma você pode selecionar diversos bairros em um autocomplete e continuar recebendo uma quantidade de resultados na resposta compatível com o limit, desconsiderando os bairros que já foram selecionados.

Retorna uma lista de bairros como string.

actions.ts
export async function getAreas({
  state,
  city,
  query,
  areas = [],
}: {
  state?: UF;
  city?: string;
  query?: string;
  areas?: string[];
}) {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(
    `https://www.usenonstop.com/api/unstable/imoveis/bairros?state=${state}&city=${city}&limit=${limit}
&query=${query}&areas=${areas.join(",")}`,
    { headers },
  );
  if (response.ok) return (await response.json()) as string[];
  return [];
}

/unstable/imoveis/ruas

Method: GET

Essa rota recebe uma lista de todas as ruas que contém imóveis selecionados no painel de integrações (opens in a new tab). Elas vêm ordenadas por relevância (as ruas com mais imóveis vêm primeiro).

Essa lista pode ser utilizada para criar links para as páginas dos imóveis mais relevantes ou para alimentar um dropdown/autocomplete com as opções para filtro.

Ela aceita as seguintes Query Strings opcionais:

types.ts
state?: UF | null
city?: string | null
area?: string | null
query?: string | null
limit?: number
streets?: string[]

O parâmetro state restringe a busca pelo estado selecionado.

O parâmetro city restringe a busca pela cidade selecionada.

O parâmetro area restringe a busca pelo bairro selecionado.

O parâmetro query faz uma busca de texto pelo termo e retorna as ruas correspondentes.

O parâmetro limit define a quantidade máxima de bairros que será retornada.

O parâmetro streets exclui da resposta as ruas da lista. Dessa forma você pode selecionar diversas ruas em um autocomplete e continuar recebendo uma quantidade de resultados na resposta compatível com o limit, desconsiderando as ruas que já foram selecionadas.

Retorna uma lista de ruas como string.

actions.ts
export async function getStreets({
  state,
  city,
  area,
  query,
  limit,
  streets = [],
}: {
  state?: UF;
  city?: string;
  area?: string;
  query?: string;
  limit?: number;
  streets?: string[];
}) {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(
    `https://www.usenonstop.com/api/unstable/imoveis/ruas?state=${state}&city=${city}
    &area=${area}&limit=${limit}&query=${query}&streets=${streets.join(",")}`,
    { headers },
  );
  if (response.ok) return (await response.json()) as string[];
  return [];
}

/unstable/imoveis/minmax

Method: GET

Essa rota recebe um objeto com os valores mínimos e máximos para alguns campos dos imóveis selecionados no painel de integrações (opens in a new tab).

actions.ts
export async function getMinMax() {
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  const response = await fetch(
    "https://www.usenonstop.com/api/unstable/imoveis/minmax",
    { headers },
  );
  if (response.ok) return (await response.json()) as Record<MinMaxField,MinMax>;
  return {
    sale: { min: null, max: null },
    longStay: { min: null, max: null },
    usefulArea: { min: null, max: null },
    landArea: { min: null, max: null },
    floor: { min: null, max: null },
  };
}

/unstable/imoveis/todos

Method: POST

Essa rota recebe uma lista de todos os imóveis selecionados no painel de integrações (opens in a new tab).

Essa lista pode ser utilizada para criar a página de busca de imóveis do site de uma imobiliária.

Ela aceita as seguintes Query Strings:

types.ts
availableFor: "VENDA" | "LOCACAO"
currentPage?: number //default: 1
perPage?: number //default: 10
sortBy?: PropertySort //default: "_id"
sortOrder?: 1 | -1 //default: 1
search?: string
minVal?: number
maxVal?: number
minUseful?: number
maxUseful?: number
minLand?: number
maxLand?: number
minFloor?: number
maxFloor?: number
minTax?: number
maxTax?: number
minCondo?: number
maxCondo?: number
minBaths?: number
minRooms?: number
minSuites?: number
minParkingLots?: number
accepts?: Accepts[]
status?: Status[]
type?: PropertyType[]
use?: Use[]
face?: Face[]
state?: UF
city?: string
areas?: string[]
condoFeatures?: FilterCondoFeature[]
features?: FilterFeature[]
userSlug?: string
selected?: string[]
perimeters?: string[]

O parâmetro currentPage é obrigatório define a página atual da paginação.

O parâmetro perPage é obrigatório define a quantidade de resultados por página da paginação.

O parâmetro availableFor é obrigatório e irá remover os imóveis que não estejam disponíveis para a transação selecionada.

Os parâmetros sortBy e sortOrder são obrigatórios definem a ordenação dos resultados. sortBy é o campo e 1 para crescente ou -1 para decrescente.

O parâmetro search é obrigatório e é usado para realizar uma busca nos seguintes campos: endereço, condomínio, código nonStop, código imobiliária.

Os parâmetros minVal e maxVal são opcionais e irão definir os limites de preço de acordo com o tipo de transação selecionada (venda ou locação).

Os parâmetros minUseful e maxUseful são opcionais e irão definir os limites para área útil dos imóveis.

Os parâmetros minLand e maxLand são opcionais e irão definir os limites para área de terreno dos imóveis.

Os parâmetros minFloor e maxFloor são opcionais e irão definir os limites para o andar dos imóveis.

Os parâmetros minTax e maxTax são opcionais e irão definir os limites para o valor do IPTU.

Os parâmetros minCondo e maxCondo são opcionais e irão definir os limites para o valor da taxa de condomínio.

O parâmetro minBaths é opcional e irá definir a quantidade mínima de banheiros.

O parâmetro minSuites é opcional e irá definir a quantidade mínima de suítes.

O parâmetro minParkingLots é opcional e irá definir a quantidade mínima de vagas de garagem.

O parâmetro accepts é opcional e irá filtrar por imóveis que aceitem permuta, financiamento, ou ambos.

O parâmetro status é opcional e irá filtrar por imóveis que estejam em um dos status selecionados.

O parâmetro type é opcional e irá filtrar por imóveis que sejam de uma das tipologias selecionadas.

O parâmetro use é opcional e irá filtrar por imóveis comerciais ou residenciais.

O parâmetro face é opcional e irá filtrar por imóveis com face para alguma das direções selecionadas.

O parâmetro state é opcional e irá filtrar os imóveis no estado selecionado.

O parâmetro city é opcional e irá filtrar os imóveis na cidade selecionada.

O parâmetro areas é opcional e irá filtrar os imóveis nos bairros selecionados.

O parâmetro condoFeatures é opcional e irá filtrar os imóveis que tenham todas as características selecionadas no condomínio.

O parâmetro features é opcional e irá filtrar os imóveis que tenham todas as características selecionadas.

O parâmetro userSlug é opcional e irá filtrar os imóveis onde o usuário em questão seja gestor primário ou secundário.

O parâmetro selected é opcional e aceita uma lista de base36Ids. Essa informação é usada para retornar os imóveis selecionados no mapa.

O parâmetro perimeters é opcional e aceita uma lista de perímetros codificados pela função: google.maps.geometry.encoding.encodePath(). Podem ser convertidos novamente em LatLngTuple[][] pela função: google.maps.geometry.encoding.decodePath()

Retorna um objeto com a lista de CardProperty que serão exibidas na paginação e o total de resultados.

actions.ts
export async function getAllProperties(body: PropertiesApiBody, query: PropertiesQuery) {
  const {
    perPage,
    currentPage,
    availableFor,
    sortBy,
    sortOrder,
    search,
    minVal,
    maxVal,
    minUseful,
    maxUseful,
    minLand,
    maxLand,
    minFloor,
    maxFloor
    minBaths,
    minRooms,
    minSuites,
    minParkingLots,
    accepts,
    use,
    userSlug,
    face,
    status,
    type,
    state,
    city,
    areas,
    condoFeatures,
    features,
    selected,
    perimeters
  } = query;
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  headers.append("Content-Type", "application/json");
  const response = await fetch(`https://www.usenonstop.com/api/unstable/imoveis/todos?
  perPage=${perPage}&currentPage=${currentPage}&availableFor=${availableFor}&sortBy=${sortBy}
  &sortOrder=${sortOrder}&search=${search}&minVal=${minVal}&maxVal=${maxVal}
  &minUseful=${minUseful}$maxUseful=${maxUseful}$minLand=${minLand}&maxLand=${maxLand}
  &minFloor=${minFloor}&maxFloor=${maxFloor}&minBaths=${minBaths}&minRooms${minRooms}
  &minSuites=${minSuites}&minParkingLots=${minParkingLots}&accepts=${accepts}&use=${use}
  &userSlug=${useSlug}&face=${face}&status=${status}&type=${type}&state=${state}&city=${city}
  &areas=${areas}&condoFeatures=${condoFeatures}&features=${features}&selected=${selected}
  &perimeters=${perimeters}`, {
    headers,
    method: "POST",
  });
 
  if (response.ok)
    return (await response.json()) as {
      properties: CardProperty[];
      total: number;
    };
  return {properties: [], total: 0};
}

/unstable/imoveis/markers

Method: POST

Essa rota recebe uma lista de marcadores clusterizados para mostrar no mapa. Os clusters são criados com todos os imóveis filtrados na rota /imoveis/todos. O campo selected mostra quais marcadores estão ativos no filtro de selectedProperties.

Ela aceita as seguintes Query Strings:

types.ts
availableFor: "VENDA" | "LOCACAO"
search?: string
minVal?: number
maxVal?: number
minUseful?: number
maxUseful?: number
minLand?: number
maxLand?: number
minFloor?: number
maxFloor?: number
minTax?: number
maxTax?: number
minCondo?: number
maxCondo?: number
minBaths?: number
minRooms?: number
minSuites?: number
minParkingLots?: number
accepts?: Accepts[]
status?: Status[]
type?: PropertyType[]
use?: Use[]
face?: Face[]
state?: UF
city?: string
areas?: string[]
condoFeatures?: FilterCondoFeature[]
features?: FilterFeature[]
userSlug?: string
selected?: string[]
perimeters?: string[]
zoom: number
bounds: string

O parâmetro zoom é obrigatório e recebe um número para configurar o zoom do mapa.

O parâmetro bounds é obrigatório e recebe uma string com uma string JSON no formato MapBounds.

O restante dos parâmetros daqui são os mesmos que são utilizados na rota /imoveis/todos

Retorna uma lista de Marker que serão exibidas na paginação e o total de resultados.

actions.ts
export async function getMarkers(body: MarkersApiBody) {
  const {
    availableFor,
    search,
    minVal,
    maxVal,
    minUseful,
    maxUseful,
    minLand,
    maxLand,
    minFloor,
    maxFloor,
    minBaths,
    minRooms,
    minSuites,
    minParkingLots,
    accepts,
    minTax,
    maxTax,
    minCondo,
    maxCondo,
    use,
    face,
    state,
    city,
    areas,
    condoFeatures,
    features,
    status,
    type,
    userSlug,
    selected,
    perimeters
    zoom,
    bounds
  } = query;
  const headers = new Headers();
  headers.append("Authorization", `Bearer ${env.NONSTOP_TOKEN}`);
  headers.append("Content-Type", "application/json");
  const response = await fetch(`https://www.usenonstop.com/api/unstable/imoveis/markers?
  availableFor=${availableFor}&search=${search}&minVal=${minVal}&maxVal=${maxVal}
  &minUseful=${minUseful}$maxUseful=${maxUseful}$minLand=${minLand}&maxLand=${maxLand}
  &minFloor=${minFloor}&maxFloor=${maxFloor}&minBaths=${minBaths}&minRooms${minRooms}
  &minSuites=${minSuites}&minParkingLots=${minParkingLots}&accepts=${accepts}&use=${use}
  &userSlug=${useSlug}&face=${face}&status=${status}&type=${type}&state=${state}&city=${city}
  &areas=${areas}&condoFeatures=${condoFeatures}&features=${features}&selected=${selected}
  &perimeters=${perimeters}&zoom=${zoom}&bounds=${bounds}`, {
    headers,
    method: "POST",
  });
  if (response.ok) return (await response.json()) as Marker[];
  return [];
}