API Reference

Complete reference for all available API endpoints. All endpoints require authentication via x-api-key header unless noted otherwise.

Base URL: http://localhost:3000

POST/api/v1/score

Score any Canadian address or coordinate pair for sign placement viability. Returns an overall score (0-100), letter grade, and per-factor breakdown across 7 dimensions. Supports custom weight profiles.

Request Body

FieldTypeRequiredDescription
addressstringNoStreet address to score (use this OR lat/lng)
latnumberNoLatitude (use with lng instead of address)
lngnumberNoLongitude (use with lat instead of address)
weightsobjectNoCustom weight profile — keys: vehicleTraffic, roadClass, populationDensity, income, poiDensity, pedestrian, transit. Values must sum to 1.0

Response

FieldTypeDescription
overallScorenumberComposite score 0-100
gradestringLetter grade (A+, A, B+, B, C+, C, D, F)
addressstringResolved display address
latnumberLatitude
lngnumberLongitude
factorScoresobjectPer-factor breakdown with score, weight, label, and raw value
dataSourcesobjectAttribution for each data source used

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/score \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"address":"example","lat":"value","lng":"value","weights":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/score", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"address":"example","lat":"value","lng":"value","weights":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/score",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"address":"example","lat":"value","lng":"value","weights":"value"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTMissing address or lat/lng, or geocoding failed
401UNAUTHORIZEDMissing or invalid API key
POST/api/v1/compare

Score 2-5 locations in parallel and return results sorted by score with a winner highlighted.

Request Body

FieldTypeRequiredDescription
locationsarrayYesArray of 2-5 objects, each with { address } or { lat, lng }
weightsobjectNoCustom weight profile applied to all locations

Response

FieldTypeDescription
resultsarrayArray of score results sorted by overallScore descending
winnerobjectThe highest-scoring location

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/compare \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"locations":"value","weights":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/compare", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"locations":"value","weights":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/compare",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"locations":"value","weights":"value"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTMust provide 2-5 locations
401UNAUTHORIZEDMissing or invalid API key
POST/api/v1/ai/query

Natural language interface for sign placement queries. Extracts intent, suggests addresses, and geocodes results. Example: 'Find good sign spots near downtown Toronto for a cafe'.

Request Body

FieldTypeRequiredDescription
querystringYesNatural language question about sign placement

Response

FieldTypeDescription
intentstringClassified intent: find_locations, score_location, compare, general_question
citystringExtracted city or region
businessTypestringExtracted business type
suggestedAddressesarrayUp to 3 specific addresses to score
geocodedLocationsarrayGeocoded lat/lng for each suggested address
explanationstringAI reasoning
suggestedWeightsobjectOptimized scoring weights if applicable

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/ai/query \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"query":"example"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/ai/query", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"query":"example"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/ai/query",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"query":"example"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTMissing query or ANTHROPIC_API_KEY not configured
POST/api/v1/ai/weights

Generate an optimized scoring weight profile based on a business description. Returns factor weights that sum to 1.0, a profile name, and explanation.

Request Body

FieldTypeRequiredDescription
businessDescriptionstringYesDescription of the business type and context

Response

FieldTypeDescription
weightsobjectWeight object with keys: vehicleTraffic, roadClass, populationDensity, income, poiDensity, pedestrian, transit
profileNamestringShort name for the generated profile
explanationstring2-3 sentences explaining the weight choices

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/ai/weights \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"businessDescription":"example"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/ai/weights", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"businessDescription":"example"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/ai/weights",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"businessDescription":"example"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTMissing businessDescription or ANTHROPIC_API_KEY not configured
POST/api/v1/ai/recommend

Given a location score result, recommends the best sign type (Channel Letters, Pylon Signs, etc.) with reasoning, alternatives, and placement tips.

Request Body

FieldTypeRequiredDescription
scoreResultobjectYesFull score result from /api/v1/score
businessTypestringNoOptional business type for more targeted recommendations

Response

FieldTypeDescription
primaryRecommendationobject{ type, reason } — best sign type
alternativesarrayArray of { type, reason } alternatives
tipsarrayActionable placement tips
estimatedImpactstringExpected visibility statement

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/ai/recommend \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"scoreResult":"value","businessType":"example"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/ai/recommend", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"scoreResult":"value","businessType":"example"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/ai/recommend",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"scoreResult":"value","businessType":"example"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTMissing scoreResult or ANTHROPIC_API_KEY not configured
GET/api/v1/projects

Returns all projects for the authenticated user, ordered by most recently updated. Includes saved location coordinates for each project.

Response

FieldTypeDescription
idstringProject UUID
namestringProject name
descriptionstringProject description
locationsarrayArray of { lat, lng } for saved locations
createdAtstringISO 8601 creation timestamp

Code Examples

cURL

curl -X GET http://localhost:3000/api/v1/projects \
  -H "x-api-key: sk_your_api_key"

JavaScript

const response = await fetch("http://localhost:3000/api/v1/projects", {
  method: "GET",
  headers: {
      "x-api-key": "sk_your_api_key"
  },
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.get(
    "http://localhost:3000/api/v1/projects",
    headers={"x-api-key":"sk_your_api_key"},
)

print(response.json())

Errors

StatusCodeDescription
401UNAUTHORIZEDNot authenticated
POST/api/v1/projects

Create a new project to organize scored locations.

Request Body

FieldTypeRequiredDescription
namestringYesProject name
descriptionstringNoOptional description

Response

FieldTypeDescription
idstringNew project UUID
namestringProject name

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/projects \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"name":"example","description":"example"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/projects", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"name":"example","description":"example"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/projects",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"name":"example","description":"example"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTProject name is required
401UNAUTHORIZEDNot authenticated
GET/api/v1/projects/:id

Get a project by ID with all its saved locations, scores, and grades.

Response

FieldTypeDescription
idstringProject UUID
namestringProject name
locationsarraySaved locations with lat, lng, address, score, grade, monitored status

Code Examples

cURL

curl -X GET http://localhost:3000/api/v1/projects/:id \
  -H "x-api-key: sk_your_api_key"

JavaScript

const response = await fetch("http://localhost:3000/api/v1/projects/:id", {
  method: "GET",
  headers: {
      "x-api-key": "sk_your_api_key"
  },
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.get(
    "http://localhost:3000/api/v1/projects/:id",
    headers={"x-api-key":"sk_your_api_key"},
)

print(response.json())

Errors

StatusCodeDescription
404NOT_FOUNDProject not found or not owned by user
POST/api/v1/projects/:id/locations

Add a location to a project. The location is automatically scored and the result cached.

Request Body

FieldTypeRequiredDescription
addressstringNoAddress (use this OR lat/lng)
latnumberNoLatitude
lngnumberNoLongitude
notesstringNoOptional notes

Response

FieldTypeDescription
idstringSaved location UUID
latestScorenumberScore (0-100)
latestScoreGradestringLetter grade

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/projects/:id/locations \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"address":"example","lat":"value","lng":"value","notes":"example"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/projects/:id/locations", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"address":"example","lat":"value","lng":"value","notes":"example"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/projects/:id/locations",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"address":"example","lat":"value","lng":"value","notes":"example"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTMust provide address or lat/lng
404NOT_FOUNDProject not found
POST/api/v1/projects/:id/share

Create a time-limited shareable link for a project (default 30-day expiry).

Request Body

FieldTypeRequiredDescription
expiresInDaysnumberNoLink expiry in days (default 30)

Response

FieldTypeDescription
shareUrlstringFull shareable URL
expiresAtstringISO 8601 expiration timestamp

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/projects/:id/share \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"expiresInDays":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/projects/:id/share", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"expiresInDays":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/projects/:id/share",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"expiresInDays":"value"},
)

print(response.json())

Errors

StatusCodeDescription
404NOT_FOUNDProject not found
GET/api/v1/products

Returns all active sign products with their variants (sizes, materials, prices).

Response

FieldTypeDescription
idstringProduct UUID
namestringProduct name
slugstringURL-friendly slug
categorystringSign category
basePriceMinnumberMinimum price across variants
basePriceMaxnumberMaximum price across variants
variantsarrayArray of product variants with size, material, price

Code Examples

cURL

curl -X GET http://localhost:3000/api/v1/products \
  -H "x-api-key: sk_your_api_key"

JavaScript

const response = await fetch("http://localhost:3000/api/v1/products", {
  method: "GET",
  headers: {
      "x-api-key": "sk_your_api_key"
  },
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.get(
    "http://localhost:3000/api/v1/products",
    headers={"x-api-key":"sk_your_api_key"},
)

print(response.json())
GET/api/v1/products/:id

Get a single product by ID with full details and all variants.

Response

FieldTypeDescription
idstringProduct UUID
namestringProduct name
descriptionstringFull product description
variantsarrayAll available variants

Code Examples

cURL

curl -X GET http://localhost:3000/api/v1/products/:id \
  -H "x-api-key: sk_your_api_key"

JavaScript

const response = await fetch("http://localhost:3000/api/v1/products/:id", {
  method: "GET",
  headers: {
      "x-api-key": "sk_your_api_key"
  },
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.get(
    "http://localhost:3000/api/v1/products/:id",
    headers={"x-api-key":"sk_your_api_key"},
)

print(response.json())

Errors

StatusCodeDescription
404NOT_FOUNDProduct not found
GET/api/v1/cart

Returns the authenticated user's shopping cart with product details for each item.

Response

FieldTypeDescription
idstringCart item UUID
quantitynumberItem quantity
productNamestringProduct name
sizeLabelstringSize variant label
pricestringUnit price
locationContextobjectOptional { lat, lng, address, score }

Code Examples

cURL

curl -X GET http://localhost:3000/api/v1/cart \
  -H "x-api-key: sk_your_api_key"

JavaScript

const response = await fetch("http://localhost:3000/api/v1/cart", {
  method: "GET",
  headers: {
      "x-api-key": "sk_your_api_key"
  },
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.get(
    "http://localhost:3000/api/v1/cart",
    headers={"x-api-key":"sk_your_api_key"},
)

print(response.json())

Errors

StatusCodeDescription
401UNAUTHORIZEDNot authenticated
POST/api/v1/cart

Add a product variant to the cart. If the variant is already in the cart, the quantity is incremented.

Request Body

FieldTypeRequiredDescription
productVariantIdstringYesUUID of the product variant
quantitynumberNoQuantity to add (default 1)
locationContextobjectNoOptional { lat, lng, address, score } for location-aware ordering

Response

FieldTypeDescription
idstringCart item UUID
quantitynumberUpdated quantity

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/cart \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"productVariantId":"example","quantity":"value","locationContext":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/cart", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"productVariantId":"example","quantity":"value","locationContext":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/cart",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"productVariantId":"example","quantity":"value","locationContext":"value"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTproductVariantId is required
401UNAUTHORIZEDNot authenticated
PATCH/api/v1/cart

Update the quantity of a cart item.

Request Body

FieldTypeRequiredDescription
cartItemIdstringYesCart item UUID to update
quantitynumberYesNew quantity (must be >= 1)

Response

FieldTypeDescription
idstringCart item UUID
quantitynumberUpdated quantity

Code Examples

cURL

curl -X PATCH http://localhost:3000/api/v1/cart \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"cartItemId":"example","quantity":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/cart", {
  method: "PATCH",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"cartItemId":"example","quantity":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.patch(
    "http://localhost:3000/api/v1/cart",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"cartItemId":"example","quantity":"value"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTcartItemId and positive quantity are required
404NOT_FOUNDCart item not found
DELETE/api/v1/cart

Remove an item from the cart by ID (query param ?id= or JSON body { cartItemId }).

Request Body

FieldTypeRequiredDescription
cartItemIdstringYesCart item UUID to remove

Response

FieldTypeDescription
deletedbooleantrue if successfully removed

Code Examples

cURL

curl -X DELETE http://localhost:3000/api/v1/cart \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"cartItemId":"example"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/cart", {
  method: "DELETE",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"cartItemId":"example"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.delete(
    "http://localhost:3000/api/v1/cart",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"cartItemId":"example"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTCart item id is required
404NOT_FOUNDCart item not found
GET/api/v1/orders

Returns all orders for the authenticated user with items and product names.

Response

FieldTypeDescription
idstringOrder UUID
statusstringOrder status: ordered, in_production, shipped, installed
totalstringOrder total
trackingNumberstringShipping tracking number (if shipped)
itemsarrayOrder line items with product details
createdAtstringISO 8601 order timestamp

Code Examples

cURL

curl -X GET http://localhost:3000/api/v1/orders \
  -H "x-api-key: sk_your_api_key"

JavaScript

const response = await fetch("http://localhost:3000/api/v1/orders", {
  method: "GET",
  headers: {
      "x-api-key": "sk_your_api_key"
  },
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.get(
    "http://localhost:3000/api/v1/orders",
    headers={"x-api-key":"sk_your_api_key"},
)

print(response.json())

Errors

StatusCodeDescription
401UNAUTHORIZEDNot authenticated
POST/api/v1/quotes

Submit a request for a custom sign quote. Provide sign type, size, requirements, and optional location.

Request Body

FieldTypeRequiredDescription
signTypestringYesType of sign (e.g., Channel Letters, Monument Sign)
sizeEstimatestringNoApproximate size
requirementsstringYesDetailed requirements and special instructions
locationAddressstringNoInstallation address
locationLatnumberNoInstallation latitude
locationLngnumberNoInstallation longitude

Response

FieldTypeDescription
idstringQuote request UUID
statusstringQuote status (pending)

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/quotes \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"signType":"example","sizeEstimate":"example","requirements":"example","locationAddress":"example","locationLat":"value","locationLng":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/quotes", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"signType":"example","sizeEstimate":"example","requirements":"example","locationAddress":"example","locationLat":"value","locationLng":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/quotes",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"signType":"example","sizeEstimate":"example","requirements":"example","locationAddress":"example","locationLat":"value","locationLng":"value"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTsignType and requirements are required
401UNAUTHORIZEDNot authenticated
POST/api/v1/roi

Estimate the return on investment for a sign placement based on location score, sign type, and cost.

Request Body

FieldTypeRequiredDescription
overallScorenumberYesVista Score (0-100)
signCostnumberYesEstimated sign cost in dollars
monthlyRevenuenumberNoExpected monthly revenue impact

Response

FieldTypeDescription
estimatedDailyImpressionsnumberEstimated daily viewer impressions
estimatedMonthlyValuenumberEstimated monthly advertising value
paybackMonthsnumberEstimated months to recoup investment
roiPercentagenumberAnnualized ROI percentage

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/roi \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"overallScore":"value","signCost":"value","monthlyRevenue":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/roi", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"overallScore":"value","signCost":"value","monthlyRevenue":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/roi",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"overallScore":"value","signCost":"value","monthlyRevenue":"value"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESToverallScore and signCost are required
POST/api/v1/reports/score

Generate a branded PDF Vista Score report for a location. Requires Pro plan or above.

Request Body

FieldTypeRequiredDescription
addressstringNoAddress to report on (use this OR lat/lng)
latnumberNoLatitude
lngnumberNoLongitude

Response

FieldTypeDescription
reportUrlstringURL to download the generated PDF
expiresAtstringURL expiration timestamp

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/reports/score \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"address":"example","lat":"value","lng":"value"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/reports/score", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"address":"example","lat":"value","lng":"value"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/reports/score",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"address":"example","lat":"value","lng":"value"},
)

print(response.json())

Errors

StatusCodeDescription
400BAD_REQUESTMissing address or coordinates
403FORBIDDENPDF reports require Pro plan or above
GET/api/v1/notifications

Returns the 50 most recent notifications for the authenticated user.

Response

FieldTypeDescription
idstringNotification UUID
typestringType: scoreChange, dataUpdate, competitor, quoteResponse, orderStatus, system
titlestringNotification title
messagestringNotification body
readbooleanWhether the notification has been read
createdAtstringISO 8601 timestamp

Code Examples

cURL

curl -X GET http://localhost:3000/api/v1/notifications \
  -H "x-api-key: sk_your_api_key"

JavaScript

const response = await fetch("http://localhost:3000/api/v1/notifications", {
  method: "GET",
  headers: {
      "x-api-key": "sk_your_api_key"
  },
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.get(
    "http://localhost:3000/api/v1/notifications",
    headers={"x-api-key":"sk_your_api_key"},
)

print(response.json())

Errors

StatusCodeDescription
401UNAUTHORIZEDNot authenticated
POST/api/v1/prospects

Enterprise feature: discover businesses that could benefit from signage in a given area. Searches by city, coordinates, or radius.

Request Body

FieldTypeRequiredDescription
citystringNoCity name to search
latnumberNoCenter latitude for radius search
lngnumberNoCenter longitude for radius search
radiusKmnumberNoSearch radius in km (default 5)
businessTypestringNoFilter by business type

Response

FieldTypeDescription
prospectsarrayArray of business prospects with name, address, type, and nearby Vista Score

Code Examples

cURL

curl -X POST http://localhost:3000/api/v1/prospects \
  -H "x-api-key: sk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"city":"example","lat":"value","lng":"value","radiusKm":"value","businessType":"example"}'

JavaScript

const response = await fetch("http://localhost:3000/api/v1/prospects", {
  method: "POST",
  headers: {
      "x-api-key": "sk_your_api_key",
      "Content-Type": "application/json"
  },
  body: JSON.stringify({"city":"example","lat":"value","lng":"value","radiusKm":"value","businessType":"example"}),
});

const data = await response.json();
console.log(data);

Python

import requests

response = requests.post(
    "http://localhost:3000/api/v1/prospects",
    headers={"x-api-key":"sk_your_api_key","Content-Type":"application/json"},
    json={"city":"example","lat":"value","lng":"value","radiusKm":"value","businessType":"example"},
)

print(response.json())

Errors

StatusCodeDescription
401UNAUTHORIZEDNot authenticated
403FORBIDDENRequires Enterprise plan