diff --git a/.env.example b/.env.example index ddb75f3f4a..27030223c0 100644 --- a/.env.example +++ b/.env.example @@ -37,8 +37,7 @@ FACEBOOK_SECRET=41860e58c256a3d7ad8267d3c1939a4a # FB Pixel ID is optional if you are trying to do customer rtracking FACEBOOK_PIXEL_ID= -FOURSQUARE_ID=2STROLSFBMZLAHG3IBA141EM2HGRF0IRIBB4KXMOGA2EH3JG -FOURSQUARE_SECRET=UAABFAWTIHIUFBL0PDC3TDMSXJF2GTGWLD3BES1QHXKAIYQB +FOURSQUARE_APIKEY=foursquare-service-key GITHUB_ID=cb448b1d4f0c743a1e36 GITHUB_SECRET=815aa4606f476444691c5f1c16b9c70da6714dc6 diff --git a/README.md b/README.md index f9e0065631..a3df4e5b73 100644 --- a/README.md +++ b/README.md @@ -220,13 +220,15 @@ Obtain SMTP credentials from a provider for transactional emails. Set the SMTP_U -- Go to Foursquare for Developers and log in -- Click on **My Apps** in the top menu -- Click the **Create A New App** button -- Enter _App Name_, _Welcome page url_, -- For **Redirect URI**: your BASE_URL value followed by /auth/foursquare/callback (i.e. `http://localhost:8080/auth/foursquare/callback` ) -- Click **Save Changes** -- Copy and paste _Client ID_ and _Client Secret_ keys into `.env` file +- Go to Foursquare for Developers and log in + +- Click on **Create a new project** button +- Enter your _Organization_ and _Project Name_ +- Click **Create** +- Navigate to your project +- Click **Settings** in the left-hand-side menu +- Generate a Service API Key +- Copy and paste the Service API Key as `FOURSQUARE_APIKEY` in your `.env` file
diff --git a/controllers/api.js b/controllers/api.js index 60c51d84e9..09dc63a083 100644 --- a/controllers/api.js +++ b/controllers/api.js @@ -15,7 +15,6 @@ const googlesheets = require('@googleapis/sheets'); const validator = require('validator'); const { Configuration: LobConfiguration, LetterEditable, LettersApi, ZipEditable, ZipLookupsApi } = require('@lob/lob-typescript-sdk'); const fs = require('fs'); - /** * GET /api * List of API examples. @@ -30,31 +29,43 @@ exports.getApi = (req, res) => { * GET /api/foursquare * Foursquare API example. */ -exports.getFoursquare = async (req, res, next) => { +exports.getFoursquare = async (req, res) => { try { - const headers = { - Authorization: `${process.env.FOURSQUARE_APIKEY}`, + const options = { + method: 'GET', + headers: { + accept: 'application/json', + 'X-Places-Api-Version': '2025-06-17', + authorization: `Bearer ${process.env.FOURSQUARE_APIKEY}`, + }, + }; + + const fetchJson = async (url, fetchOptions, label) => { + const response = await fetch(url, fetchOptions); + if (!response.ok) { + const text = await response.text().catch(() => ''); + throw new Error(`${label} failed: ${response.status} ${response.statusText} - ${text}`); + } + return response.json(); }; - const [trendingVenuesRes, venueDetailRes, venuePhotosRes] = await Promise.all([ - fetch('https://api.foursquare.com/v3/places/search?ll=47.609657,-122.342148&limit=10', { - headers, - }).then((res) => res.json()), - fetch('https://api.foursquare.com/v3/places/427ea800f964a520b1211fe3', { - headers, - }).then((res) => res.json()), - fetch('https://api.foursquare.com/v3/places/427ea800f964a520b1211fe3/photos', { - headers, - }).then((res) => res.json()), + const [trendingVenuesRes, venueDetailRes] = await Promise.all([ + fetchJson('https://places-api.foursquare.com/places/search?ll=47.609657,-122.342148&limit=10', options, 'Foursquare search'), + fetchJson('https://places-api.foursquare.com/places/427ea800f964a520b1211fe3', options, 'Foursquare venue detail'), ]); res.render('api/foursquare', { - title: 'Foursquare API (v3)', - trendingVenues: trendingVenuesRes.results, + title: 'Foursquare Places API', + trendingVenues: trendingVenuesRes.results || [], venueDetail: venueDetailRes, - venuePhotos: venuePhotosRes.slice(0, 9), // Limit the photos to 9 }); } catch (error) { - next(error); + console.error('Foursquare API Error:', error); + return res.status(500).render('api/foursquare', { + title: 'Foursquare Places API', + trendingVenues: [], + venueDetail: null, + error: 'Failed to fetch Foursquare data', + }); } }; diff --git a/test/e2e/foursquare.e2e.test.js b/test/e2e/foursquare.e2e.test.js new file mode 100644 index 0000000000..e1fd286e7f --- /dev/null +++ b/test/e2e/foursquare.e2e.test.js @@ -0,0 +1,124 @@ +process.env.API_TEST_FILE = 'e2e/foursquare.e2e.test.js'; +const { test, expect } = require('@playwright/test'); +const { registerTestInManifest, isInManifest } = require('../tools/fixture-helpers'); + +// Self-register this test in the manifest when recording +registerTestInManifest('e2e/foursquare.e2e.test.js'); + +// Skip this file during replay if it's not in the manifest +if (process.env.API_MODE === 'replay' && !isInManifest('e2e/foursquare.e2e.test.js')) { + console.log('[fixtures] skipping e2e/foursquare.e2e.test.js as it is not in manifest for replay mode - 2 tests'); + test.skip(true, 'Not in manifest for replay mode'); +} + +test.describe('Foursquare Places API Integration', () => { + let sharedPage; + + test.beforeAll(async ({ browser }) => { + sharedPage = await browser.newPage(); + await sharedPage.goto('/api/foursquare'); + await sharedPage.waitForLoadState('networkidle'); + }); + + test.afterAll(async () => { + if (sharedPage) await sharedPage.close(); + }); + + test('should render Trending Venues table with data', async () => { + // Table basics + const table = sharedPage.locator('table.table.table-striped.table-bordered'); + await expect(table).toBeVisible(); + + const headers = table.locator('thead th'); + await expect(headers).toHaveCount(5); + await expect(headers.nth(1)).toContainText('Name'); + await expect(headers.nth(2)).toContainText('Category'); + await expect(headers.nth(3)).toContainText('Address'); + await expect(headers.nth(4)).toContainText('Distance'); + + // Should have 10 result rows (API limit for busy Downtown Seattle location) + const rows = table.locator('tbody tr'); + const rowCount = await rows.count(); + expect(rowCount).toBe(10); + + // Validate first row structure and formats + const firstRowCells = rows.first().locator('td'); + await expect(firstRowCells).toHaveCount(5); + + // Icon cell: must have an icon image + const iconImgCount = await firstRowCells.nth(0).locator('img').count(); + expect(iconImgCount).toBeGreaterThan(0); + const icon = firstRowCells.nth(0).locator('img'); + await expect(icon).toHaveAttribute('src', /https?:\/\//); + await expect(icon).toHaveAttribute('alt', /\w+/); + const w = parseInt(await icon.getAttribute('width'), 10); + const h = parseInt(await icon.getAttribute('height'), 10); + expect(w).toBeGreaterThanOrEqual(32); + expect(w).toBeLessThanOrEqual(64); + expect(h).toBe(w); + + // Name cell: non-empty + const venueName = (await firstRowCells.nth(1).textContent()).trim(); + expect(venueName.length).toBeGreaterThan(0); + + // Category cell: non-empty + const categoryText = (await firstRowCells.nth(2).textContent()).trim(); + expect(categoryText.length).toBeGreaterThan(0); + + // Address cell: non-empty + const addrText = (await firstRowCells.nth(3).textContent()).trim(); + expect(addrText.length).toBeGreaterThan(0); + + // Distance cell: numeric + const distanceText = (await firstRowCells.nth(4).textContent()).trim(); + expect(distanceText).toMatch(/^\d+$/); + }); + + test('should render Venue Details with name, category, and coordinates', async () => { + // Section header + await expect(sharedPage.locator('h3.text-primary', { hasText: 'Venue Details' })).toBeVisible(); + + // The details paragraph contains name, optional category, and location + lat/long + const detailsPara = sharedPage.locator('h3.text-primary:has-text("Venue Details") + p'); + await expect(detailsPara).toBeVisible(); + + // Name element + const nameElement = detailsPara.locator('i u'); + await expect(nameElement).toBeVisible(); + const detailName = (await nameElement.textContent()).trim(); + expect(detailName.length).toBeGreaterThan(0); + + // Check expected hardcoded values from Downtown Seattle location (ll=47.609657,-122.342148) + const detailsText = await detailsPara.textContent(); + + // Extract and validate longitude (allow wiggle room for minor GIS changes) + const longitudeMatch = detailsText.match(/longitude:\s*([-\d.]+)/i); + expect(longitudeMatch).toBeTruthy(); + const longitude = parseFloat(longitudeMatch[1]); + expect(longitude).toBeGreaterThan(-122.35); + expect(longitude).toBeLessThan(-122.33); + + // Extract and validate latitude (allow wiggle room for minor GIS changes) + const latitudeMatch = detailsText.match(/latitude:\s*([-\d.]+)/i); + expect(latitudeMatch).toBeTruthy(); + const latitude = parseFloat(latitudeMatch[1]); + expect(latitude).toBeGreaterThan(47.6); + expect(latitude).toBeLessThan(47.62); + + // Related venues: check for Pike Place Market with 10+ related venues + const relatedVenuesPara = sharedPage.locator('p', { hasText: 'Related venues or businesses to' }); + await expect(relatedVenuesPara).toBeVisible(); + const relatedVenuesText = await relatedVenuesPara.textContent(); + expect(relatedVenuesText).toContain('Pike Place Market'); + + // Extract the comma-separated list from the next paragraph + const relatedListPara = relatedVenuesPara.locator('+ p'); + await expect(relatedListPara).toBeVisible(); + const relatedListText = (await relatedListPara.textContent()).trim(); + const relatedVenuesList = relatedListText + .split(',') + .map((v) => v.trim()) + .filter((v) => v.length > 0); + expect(relatedVenuesList.length).toBeGreaterThanOrEqual(10); + }); +}); diff --git a/test/fixtures/GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2F427ea800f964a520b1211fe3.json b/test/fixtures/GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2F427ea800f964a520b1211fe3.json new file mode 100644 index 0000000000..3651976fe7 --- /dev/null +++ b/test/fixtures/GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2F427ea800f964a520b1211fe3.json @@ -0,0 +1,855 @@ +{ + "fsq_place_id": "427ea800f964a520b1211fe3", + "latitude": 47.609334087942955, + "longitude": -122.34147579532495, + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "date_created": "2005-05-09", + "date_refreshed": "2025-10-27", + "email": "info@pikeplacemarket.org", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330081011003" }, + "link": "/places/427ea800f964a520b1211fe3", + "location": { "address": "85 Pike St", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "85 Pike St (at Pine St), Seattle, WA 98101" }, + "name": "Pike Place Market", + "placemaker_url": "https://foursquare.com/placemakers/review-place/427ea800f964a520b1211fe3", + "related_places": { + "children": [ + { + "fsq_place_id": "68c3cd83a33d853805869d81", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d103951735", "name": "Clothing Store", "short_name": "Apparel", "plural_name": "Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_", "suffix": ".png" } }], + "name": "Fashion with Trends" + }, + { + "fsq_place_id": "4a6e24f6f964a52007d41fe3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }], + "name": "Pike Place Chowder" + }, + { + "fsq_place_id": "595d37622be425119f41fdaf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } }], + "name": "Gateway To Mystical Tibet" + }, + { + "fsq_place_id": "5c0c2839e55d8b002bec0864", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d15a941735", "name": "Garden", "short_name": "Garden", "plural_name": "Gardens", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/garden_", "suffix": ".png" } }], + "name": "The Secret Garden" + }, + { + "fsq_place_id": "5c0c5e3a9e3b65002c77457c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d116951735", "name": "Antique Store", "short_name": "Antiques", "plural_name": "Antique Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/antique_", "suffix": ".png" } }], + "name": "Animal Gifts & Collextibles" + }, + { + "fsq_place_id": "439b0d38f964a520db2b1fe3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1cd941735", "name": "South American Restaurant", "short_name": "South American", "plural_name": "South American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/argentinian_", "suffix": ".png" } }], + "name": "Copacabana" + }, + { + "fsq_place_id": "574882b9498e2cca0de19f2c", + "categories": [{ "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } }], + "name": "Tiny’s Organic Hot Apple Cider" + }, + { + "fsq_place_id": "4582b235f964a5207c3f1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d142941735", "name": "Asian Restaurant", "short_name": "Asian", "plural_name": "Asian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/asian_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1df931735", "name": "BBQ Joint", "short_name": "BBQ", "plural_name": "BBQ Joints", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bbqalt_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } } + ], + "name": "Mee Sum Pastry" + }, + { + "fsq_place_id": "6276e76835c7ab40d09e0c46", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d15b941735", "name": "Farm", "short_name": "Farm", "plural_name": "Farms", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/farm_", "suffix": ".png" } } + ], + "name": "Cuaresma R&L Farm" + }, + { + "fsq_place_id": "6700798c5024253ac7e9224f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d165941735", "name": "Scenic Lookout", "short_name": "Scenic Lookout", "plural_name": "Scenic Lookouts", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/sceniclookout_", "suffix": ".png" } }], + "name": "Overlook Walk" + }, + { + "fsq_place_id": "4ea5ee17b80336cb0348c68f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f9931735", "name": "Road", "short_name": "Road", "plural_name": "Roads", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/highway_", "suffix": ".png" } }], + "name": "Post Alley" + }, + { + "fsq_place_id": "5924a2743149b933a0bba7b4", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d164941735", "name": "Plaza", "short_name": "Plaza", "plural_name": "Plazas", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/plaza_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1f7941735", "name": "Flea Market", "short_name": "Flea Market", "plural_name": "Flea Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/fleamarket_", "suffix": ".png" } } + ], + "name": "The Pike Place MarketFront" + }, + { + "fsq_place_id": "635d8e050082821c2c84110a", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11e951735", "name": "Cheese Store", "short_name": "Cheese Store", "plural_name": "Cheese Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_cheese_", "suffix": ".png" } }], + "name": "The Cheese Box" + }, + { + "fsq_place_id": "4fa97891e4b07650f7b12097", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c1941735", "name": "Mexican Restaurant", "short_name": "Mexican", "plural_name": "Mexican Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mexican_", "suffix": ".png" } }], + "name": "Los Agaves Mexican Street Food" + }, + { + "fsq_place_id": "5722a9df498efc35a195867c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c9941735", "name": "Ice Cream Parlor", "short_name": "Ice Cream", "plural_name": "Ice Cream Parlors", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/icecream_", "suffix": ".png" } }], + "name": "Shug's Soda Fountain and Ice Cream" + }, + { + "fsq_place_id": "685c6d51264921158658aa02", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d114951735", "name": "Bookstore", "short_name": "Bookstore", "plural_name": "Bookstores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/bookstore_", "suffix": ".png" } }], + "name": "Pine Books" + }, + { + "fsq_place_id": "4b8593a9f964a5207e6631e3", + "categories": [ + { "fsq_category_id": "4eb1bd1c3b7b55596b4a748f", "name": "Filipino Restaurant", "short_name": "Filipino", "plural_name": "Filipino Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/filipino_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d118951735", "name": "Grocery Store", "short_name": "Grocery Store", "plural_name": "Grocery Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_grocery_", "suffix": ".png" } } + ], + "name": "Oriental Mart" + }, + { "fsq_place_id": "58d96a9e409f565903fa6399", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "4a96e520f964a520702720e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d111941735", "name": "Japanese Restaurant", "short_name": "Japanese", "plural_name": "Japanese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/japanese_", "suffix": ".png" } }], + "name": "Umai Sushi Teriyaki" + }, + { "fsq_place_id": "58d96a720037eb26cc623292", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5762e95e498e2dd19def67cd", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d12f941735", "name": "Library", "short_name": "Library", "plural_name": "Libraries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/library_", "suffix": ".png" } }], + "name": "FOLIO: The Seattle Athenaeum" + }, + { + "fsq_place_id": "52a7bdff11d264bf08c940dd", + "categories": [ + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b25", "name": "Knitting Store", "short_name": "Knitting Supplies", "plural_name": "Knitting Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } } + ], + "name": "So Much Yarn" + }, + { + "fsq_place_id": "5bf604ba598e64002c2984c6", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d111941735", "name": "Japanese Restaurant", "short_name": "Japanese", "plural_name": "Japanese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/japanese_", "suffix": ".png" } }], + "name": "Unai Sushi & Teriyaki" + }, + { + "fsq_place_id": "668aeba01d73f81bbb98fa66", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c1941735", "name": "Mexican Restaurant", "short_name": "Mexican", "plural_name": "Mexican Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mexican_", "suffix": ".png" } }], + "name": "El Mixteco" + }, + { + "fsq_place_id": "4c9faa8a2fb1a143bbeaf540", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d114951735", "name": "Bookstore", "short_name": "Bookstore", "plural_name": "Bookstores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/bookstore_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d10d951735", "name": "Record Store", "short_name": "Record Store", "plural_name": "Record Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/record_shop_", "suffix": ".png" } } + ], + "name": "Lionheart Bookstore & Records" + }, + { "fsq_place_id": "58d96a5bc0c89b2d9f98060f", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "62ec0cea495f6e5349e94a14", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }], + "name": "Bite Society" + }, + { + "fsq_place_id": "614f82bfb2119e03fb370a9d", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d102951735", "name": "Fashion Accessories Store", "short_name": "Fashion Accessories Store", "plural_name": "Fashion Accessories Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_accessories_", "suffix": ".png" } } + ], + "name": "Eclipse Hat Shop" + }, + { + "fsq_place_id": "62f9771ef26ef62eb249cc65", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Lor Garden" + }, + { + "fsq_place_id": "419e8900f964a520301e1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1d0941735", "name": "Dessert Shop", "short_name": "Desserts", "plural_name": "Dessert Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/dessert_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } } + ], + "name": "Le Panier" + }, + { + "fsq_place_id": "5aae7807a22db7227b2a7bb3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d110941735", "name": "Italian Restaurant", "short_name": "Italian", "plural_name": "Italian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/italian_", "suffix": ".png" } }], + "name": "Pasta Casalinga" + }, + { + "fsq_place_id": "47f20627f964a520954e1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d110941735", "name": "Italian Restaurant", "short_name": "Italian", "plural_name": "Italian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/italian_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } } + ], + "name": "The Pasta Bar" + }, + { + "fsq_place_id": "5b564b40054e29002cef59e8", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d123941735", "name": "Wine Bar", "short_name": "Wine Bar", "plural_name": "Wine Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/winery_", "suffix": ".png" } }], + "name": "Northwest Tastings" + }, + { + "fsq_place_id": "66880e34f675c97a48ff2d83", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d179941735", "name": "Bagel Shop", "short_name": "Bagels", "plural_name": "Bagel Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bagels_", "suffix": ".png" } }], + "name": "Bagel Pop" + }, + { + "fsq_place_id": "4b4e3163f964a520b7e426e3", + "categories": [ + { "fsq_category_id": "4d4ae6fc7a7b7dea34424761", "name": "Fried Chicken Joint", "short_name": "Fried Chicken", "plural_name": "Fried Chicken Joints", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/friedchicken_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d16e941735", "name": "Fast Food Restaurant", "short_name": "Fast Food", "plural_name": "Fast Food Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/fastfood_", "suffix": ".png" } } + ], + "name": "Chicken Valley" + }, + { + "fsq_place_id": "511ac39fe4b0c7092df6617c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1d0941735", "name": "Dessert Shop", "short_name": "Desserts", "plural_name": "Dessert Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/dessert_", "suffix": ".png" } }], + "name": "Indi Chocolate" + }, + { + "fsq_place_id": "6276e7ce6210f9141d155c05", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d15b941735", "name": "Farm", "short_name": "Farm", "plural_name": "Farms", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/farm_", "suffix": ".png" } } + ], + "name": "Cuaresma R&L Farm" + }, + { "fsq_place_id": "4a9441bff964a520f02020e3", "categories": [{ "fsq_category_id": "4bf58dd8d48988d146941735", "name": "Deli", "short_name": "Deli", "plural_name": "Delis", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/deli_", "suffix": ".png" } }], "name": "Michou" }, + { + "fsq_place_id": "4ae38a67f964a5206b9621e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11d951735", "name": "Butcher", "short_name": "Butcher", "plural_name": "Butchers", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_butcher_", "suffix": ".png" } }], + "name": "fero's meat market" + }, + { "fsq_place_id": "58d96a4c02b60e791e4176cc", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "440daad8f964a52096301fe3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }], + "name": "Starbucks" + }, + { + "fsq_place_id": "4b1b1d8cf964a52049f823e3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d118951735", "name": "Grocery Store", "short_name": "Grocery Store", "plural_name": "Grocery Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_grocery_", "suffix": ".png" } } + ], + "name": "Sosio's Fruit and Produce" + }, + { + "fsq_place_id": "4c33791fed37a593816a6d03", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1fb941735", "name": "Hobby Store", "short_name": "Hobbies", "plural_name": "Hobby Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/hobbyshop_", "suffix": ".png" } }], + "name": "Old Seattle Paperworks" + }, + { "fsq_place_id": "58d96b7e7d66be79a60a8cda", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5bad843c73fe25002cd1df40", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Santos Farms" + }, + { + "fsq_place_id": "49ee65a3f964a52058681fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "5293a7563cf9994f4e043a44", "name": "Russian Restaurant", "short_name": "Russian", "plural_name": "Russian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/russian_", "suffix": ".png" } } + ], + "name": "Piroshky Piroshky" + }, + { "fsq_place_id": "58d96a6c9ab66307e1769c5a", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5990c95b4940bc65f0dfc026", + "categories": [ + { "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1cb941735", "name": "Food Truck", "short_name": "Food Truck", "plural_name": "Food Trucks", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/streetfood_", "suffix": ".png" } } + ], + "name": "Roasted Corn" + }, + { + "fsq_place_id": "62c04eaf8c88c7194f5714c6", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d179941735", "name": "Bagel Shop", "short_name": "Bagels", "plural_name": "Bagel Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bagels_", "suffix": ".png" } }], + "name": "Bagelbop" + }, + { + "fsq_place_id": "477ce324f964a520234d1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d115941735", "name": "Middle Eastern Restaurant", "short_name": "Middle Eastern", "plural_name": "Middle Eastern Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/middleeastern_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1c0941735", "name": "Mediterranean Restaurant", "short_name": "Mediterranean", "plural_name": "Mediterranean Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mediterranean_", "suffix": ".png" } } + ], + "name": "Falafel King" + }, + { + "fsq_place_id": "5641140ccd108d476916ca18", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f9941735", "name": "Food and Beverage Retail", "short_name": "Food & Beverage", "plural_name": "Food and Beverage Retail", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/foodanddrink_", "suffix": ".png" } }], + "name": "Tiny's Organic" + }, + { + "fsq_place_id": "689e8c4db9cf5b176894c56c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d124941735", "name": "Office", "short_name": "Office", "plural_name": "Offices", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/default_", "suffix": ".png" } }], + "name": "The Salish Room" + }, + { + "fsq_place_id": "59220125c4df1d5708ba1560", + "categories": [{ "fsq_category_id": "58daa1558bbb0b01f18ec1d6", "name": "Art Studio", "short_name": "Art Studio", "plural_name": "Art Studios", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } }], + "name": "Jesse Link Gallery" + }, + { + "fsq_place_id": "68c9d7951ed0a44ad66351c5", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } }], + "name": "Pizza & Pasta Bar" + }, + { + "fsq_place_id": "51883255498e51f786d85a0a", + "categories": [ + { "fsq_category_id": "4d954b16a243a5684b65b473", "name": "Rest Area", "short_name": "Rest Areas", "plural_name": "Rest Areas", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/restarea_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d165941735", "name": "Scenic Lookout", "short_name": "Scenic Lookout", "plural_name": "Scenic Lookouts", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/sceniclookout_", "suffix": ".png" } } + ], + "name": "Waterfront Viewpoint" + }, + { + "fsq_place_id": "62a3ee720cea093979f7fb9d", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e2931735", "name": "Art Gallery", "short_name": "Art Gallery", "plural_name": "Art Galleries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } }], + "name": "Gallery Ergo" + }, + { "fsq_place_id": "58d96a79debdf62e17649a84", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "4ba52ffdf964a52057e938e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d112941735", "name": "Juice Bar", "short_name": "Juice Bar", "plural_name": "Juice Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/juicebar_", "suffix": ".png" } }], + "name": "Juice Emporium" + }, + { + "fsq_place_id": "5ccf6cc84acb19002c7b1b90", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d117951735", "name": "Candy Store", "short_name": "Candy Store", "plural_name": "Candy Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/candystore_", "suffix": ".png" } }], + "name": "Cobb's Pike Place Popcorn" + }, + { + "fsq_place_id": "4bc23a4d4cdfc9b61dcf9521", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "City Fish Co." + }, + { + "fsq_place_id": "59e548478c35dc3e57b97e90", + "categories": [{ "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } }], + "name": "Tiny's Organic Hot Apple Cider" + }, + { + "fsq_place_id": "66246edb29ceb661bfb4bbc4", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c9941735", "name": "Ice Cream Parlor", "short_name": "Ice Cream", "plural_name": "Ice Cream Parlors", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/icecream_", "suffix": ".png" } }], + "name": "Baxter & Frost" + }, + { + "fsq_place_id": "684dbad659d3f64cce97a8b3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Lee’s Garden" + }, + { + "fsq_place_id": "68c9d794251ab11151d2ec11", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } }], + "name": "Pizza & Pasta Bar" + }, + { + "fsq_place_id": "4a4bc093f964a520abac1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1fb941735", "name": "Hobby Store", "short_name": "Hobbies", "plural_name": "Hobby Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/hobbyshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1f3941735", "name": "Toy Store", "short_name": "Toys & Games", "plural_name": "Toy Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/toys_", "suffix": ".png" } }, + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b18", "name": "Comic Book Store", "short_name": "Comic Store", "plural_name": "Comic Book Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/comic_", "suffix": ".png" } } + ], + "name": "Golden Age Collectables" + }, + { + "fsq_place_id": "628ab065d6117e2150c3ac14", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Pike St. Coffee" + }, + { + "fsq_place_id": "4c2f6396213c2d7fbdb8305d", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d100951735", "name": "Pet Supplies Store", "short_name": "Pet Supplies Store", "plural_name": "Pet Supplies Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/pet_store_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Merry Tails" + }, + { + "fsq_place_id": "50d7a5a3e4b05909046d1938", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }, + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } } + ], + "name": "Quality Fruit" + }, + { + "fsq_place_id": "449addfdf964a5209c341fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d123941735", "name": "Wine Bar", "short_name": "Wine Bar", "plural_name": "Wine Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/winery_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d11e941735", "name": "Cocktail Bar", "short_name": "Cocktail", "plural_name": "Cocktail Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/cocktails_", "suffix": ".png" } } + ], + "name": "The Tasting Room" + }, + { "fsq_place_id": "58d96ad083622d210c61e79b", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "629f71fcf8b64237d81e23ce", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d116941735", "name": "Bar", "short_name": "Bar", "plural_name": "Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/pub_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } } + ], + "name": "Alibi Room" + }, + { + "fsq_place_id": "4a3c2d5df964a52038a11fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d14e941735", "name": "American Restaurant", "short_name": "American", "plural_name": "American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/default_", "suffix": ".png" } } + ], + "name": "Market Grill" + }, + { + "fsq_place_id": "51c1286f498e2505fd764fbe", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11e941735", "name": "Cocktail Bar", "short_name": "Cocktail", "plural_name": "Cocktail Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/cocktails_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d112941735", "name": "Juice Bar", "short_name": "Juice Bar", "plural_name": "Juice Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/juicebar_", "suffix": ".png" } } + ], + "name": "Rachel's Ginger Beer" + }, + { + "fsq_place_id": "63dec8d120aa934d836a9ef9", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Woodinville Farm Flowers" + }, + { + "fsq_place_id": "6421e2eb8eecbf34771acfff", + "categories": [ + { + "fsq_category_id": "4deefb944765f83613cdba6e", + "name": "Historic and Protected Site", + "short_name": "Historic and Protected Site", + "plural_name": "Historic and Protected Sites", + "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/historicsite_", "suffix": ".png" } + } + ], + "name": "Public Market Center Clock Sign" + }, + { + "fsq_place_id": "4b9d10c1f964a5208f8c36e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }], + "name": "Pike Place Bakery" + }, + { + "fsq_place_id": "49ef647df964a520ad681fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d119951735", "name": "Wine Store", "short_name": "Wine Store", "plural_name": "Wine Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_wineshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d11e951735", "name": "Cheese Store", "short_name": "Cheese Store", "plural_name": "Cheese Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_cheese_", "suffix": ".png" } } + ], + "name": "DeLaurenti Food & Wine" + }, + { + "fsq_place_id": "4ac7cd89f964a520d9b920e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c0941735", "name": "Mediterranean Restaurant", "short_name": "Mediterranean", "plural_name": "Mediterranean Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mediterranean_", "suffix": ".png" } }], + "name": "Turkish Delight" + }, + { + "fsq_place_id": "6521e256c6f3d2015723be6e", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ff941735", "name": "Miscellaneous Store", "short_name": "Store", "plural_name": "Miscellaneous Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }], + "name": "The Alabaster Owl" + }, + { + "fsq_place_id": "64c1462b75db9e2421a181fa", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1d0941735", "name": "Dessert Shop", "short_name": "Desserts", "plural_name": "Dessert Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/dessert_", "suffix": ".png" } }], + "name": "Hellenika Cultured Creamery" + }, + { + "fsq_place_id": "4de28f8b2271bfb8449e892c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d117951735", "name": "Candy Store", "short_name": "Candy Store", "plural_name": "Candy Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/candystore_", "suffix": ".png" } }], + "name": "Sweetie's" + }, + { + "fsq_place_id": "68b0d8c3b9bd4e2bafd7bec1", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Thai Tao Farm" + }, + { + "fsq_place_id": "4c34f0e34308b7132891c430", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d112941735", "name": "Juice Bar", "short_name": "Juice Bar", "plural_name": "Juice Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/juicebar_", "suffix": ".png" } }, + { "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } } + ], + "name": "Tiny's Organic" + }, + { + "fsq_place_id": "59ed1ad520795515ba5e1509", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d116951735", "name": "Antique Store", "short_name": "Antiques", "plural_name": "Antique Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/antique_", "suffix": ".png" } }], + "name": "Osara Commisary" + }, + { + "fsq_place_id": "6599b1a970e0dc308f87bd6c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Yang Farm" + }, + { + "fsq_place_id": "57d30787498e4af69643ce18", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Eighth Generation Flagship Store" + }, + { + "fsq_place_id": "59b44831be70782b657ae1b8", + "categories": [ + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b1c", "name": "Fruit and Vegetable Store", "short_name": "Fruit and Vegetable Store", "plural_name": "Fruit and Vegetable Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_grocery_", "suffix": ".png" } }, + { "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } } + ], + "name": "Sidhu Farms" + }, + { + "fsq_place_id": "5b941d4a57a537002c09077d", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d103951735", "name": "Clothing Store", "short_name": "Apparel", "plural_name": "Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_", "suffix": ".png" } }, + { "fsq_category_id": "58daa1558bbb0b01f18ec1d6", "name": "Art Studio", "short_name": "Art Studio", "plural_name": "Art Studios", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } } + ], + "name": "Basilic Textiles" + }, + { + "fsq_place_id": "47f245d1f964a520974e1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1c5941735", "name": "Sandwich Spot", "short_name": "Sandwich Spot", "plural_name": "Sandwich Spots", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/deli_", "suffix": ".png" } } + ], + "name": "Three Girls Bakery" + }, + { "fsq_place_id": "58d96a618ee5602ddf71d713", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5a774b2e9e3b651f75c3f6d9", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ff941735", "name": "Miscellaneous Store", "short_name": "Store", "plural_name": "Miscellaneous Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }], + "name": "Simply Lavender" + }, + { + "fsq_place_id": "4aa01f4cf964a520673e20e3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "Jack's Fish Spot" + }, + { + "fsq_place_id": "5963fe50018cbb34d91b1c35", + "categories": [{ "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }], + "name": "Careful It Bites" + }, + { + "fsq_place_id": "4bae650bf964a52093ac3be3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d119951735", "name": "Wine Store", "short_name": "Wine Store", "plural_name": "Wine Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_wineshop_", "suffix": ".png" } } + ], + "name": "La Buona Tavola - Truffle Cafe" + }, + { "fsq_place_id": "58d96a9a0aac7572b1a6d52f", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "624b4faee0f31740166c7f2a", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Artisan Glass Blowing" + }, + { + "fsq_place_id": "4c019a5b716bc9b6ad2dbc55", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d114951735", "name": "Bookstore", "short_name": "Bookstore", "plural_name": "Bookstores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/bookstore_", "suffix": ".png" } }], + "name": "BLMF Literary Saloon" + }, + { + "fsq_place_id": "4e275e2e149554c7742f17d0", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d124941735", "name": "Office", "short_name": "Office", "plural_name": "Offices", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1f9941735", "name": "Food and Beverage Retail", "short_name": "Food & Beverage", "plural_name": "Food and Beverage Retail", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/foodanddrink_", "suffix": ".png" } } + ], + "name": "Tiny's Organic" + }, + { + "fsq_place_id": "5d85527c85aecf0008de913a", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ff941735", "name": "Miscellaneous Store", "short_name": "Store", "plural_name": "Miscellaneous Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }], + "name": "The Everything Store" + }, + { + "fsq_place_id": "68a7a3f3af5e2f5ab4060e71", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d127941735", "name": "Meeting Room", "short_name": "Meeting Room", "plural_name": "Meeting Rooms", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/office_conferenceroom_", "suffix": ".png" } }], + "name": "The Classroom" + }, + { + "fsq_place_id": "5dd0686bf1a48400074146d5", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Double Dorjee" + }, + { + "fsq_place_id": "6382cc5bec755b618b6d0488", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f2931735", "name": "Performing Arts Venue", "short_name": "Performing Arts", "plural_name": "Performing Arts Venues", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/performingarts_", "suffix": ".png" } }], + "name": "Rabbit Box Theater" + }, + { + "fsq_place_id": "4a41576ff964a52027a51fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11e951735", "name": "Cheese Store", "short_name": "Cheese Store", "plural_name": "Cheese Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_cheese_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1bf941735", "name": "Mac and Cheese Joint", "short_name": "Mac and Cheese Joint", "plural_name": "Mac and Cheese Joints", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/macandcheese_", "suffix": ".png" } } + ], + "name": "Beecher's Handmade Cheese" + }, + { "fsq_place_id": "58d96a952eb9796c3af09c59", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5a19b89867e5f2622dbdebdf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Seattle Hats" + }, + { + "fsq_place_id": "6302c45c7b270c589032321f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Cafe Au Lait Dahlias" + }, + { + "fsq_place_id": "44e36b6bf964a5203d371fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d10c941735", "name": "French Restaurant", "short_name": "French", "plural_name": "French Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/french_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "Place Pigalle" + }, + { + "fsq_place_id": "4f514e1de4b0ef967033cf64", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d116951735", "name": "Antique Store", "short_name": "Antiques", "plural_name": "Antique Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/antique_", "suffix": ".png" } }], + "name": "2nd Hand Gala" + }, + { + "fsq_place_id": "4f52a4eee4b02d0eb3a8aeeb", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d105951735", "name": "Children's Clothing Store", "short_name": "Children's Clothing Store", "plural_name": "Children's Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_", "suffix": ".png" } } + ], + "name": "Boston Street Children's Shop" + }, + { + "fsq_place_id": "5a764d7f1cf2e146251883d4", + "categories": [{ "fsq_category_id": "5744ccdfe4b0c0459246b4dc", "name": "Shopping Plaza", "short_name": "Shopping Plaza", "plural_name": "Shopping Plazas", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/mall_", "suffix": ".png" } }], + "name": "Down Under" + }, + { + "fsq_place_id": "5de311c0fe97aa0007399445", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }], + "name": "The Magic In The Market" + }, + { + "fsq_place_id": "659a09cd0b378d3675f46fef", + "categories": [{ "fsq_category_id": "4def73e84765ae376e57713a", "name": "Portuguese Restaurant", "short_name": "Portuguese", "plural_name": "Portuguese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/portuguese_", "suffix": ".png" } }], + "name": "Lonely Siren" + }, + { + "fsq_place_id": "4582b276f964a5207d3f1fe3", + "categories": [ + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b2c", "name": "Herbs and Spices Store", "short_name": "Herbs and Spices Store", "plural_name": "Herbs and Spices Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Tenzing Momo" + }, + { + "fsq_place_id": "454c474af964a520bb3c1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d143941735", "name": "Breakfast Spot", "short_name": "Breakfast", "plural_name": "Breakfast Spots", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/breakfast_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d147941735", "name": "Diner", "short_name": "Diner", "plural_name": "Diners", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/diner_", "suffix": ".png" } } + ], + "name": "Lowell's Restaurant" + }, + { + "fsq_place_id": "49c2e1a6f964a5203c561fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d14e941735", "name": "American Restaurant", "short_name": "American", "plural_name": "American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/default_", "suffix": ".png" } } + ], + "name": "Athenian" + }, + { "fsq_place_id": "58d96ac8da54ae0f567959a1", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "6744f891e01c6807db3938aa", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d148941735", "name": "Donut Shop", "short_name": "Donuts", "plural_name": "Donut Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/donuts_", "suffix": ".png" } }], + "name": "Uli’s Apple Cider Donuts" + }, + { + "fsq_place_id": "6166347d1a6d742808ba683d", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Jungle Bean" + }, + { + "fsq_place_id": "4e74dcb0315188bfdc647599", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d102951735", "name": "Fashion Accessories Store", "short_name": "Fashion Accessories Store", "plural_name": "Fashion Accessories Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_accessories_", "suffix": ".png" } } + ], + "name": "Croshay Design" + }, + { + "fsq_place_id": "628ab06556bad27a379944fe", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Pike St. Coffee" + }, + { + "fsq_place_id": "689e590c6503d3418a48cfe1", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1d2941735", "name": "Sushi Restaurant", "short_name": "Sushi", "plural_name": "Sushi Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/sushi_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d145941735", "name": "Chinese Restaurant", "short_name": "Chinese", "plural_name": "Chinese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/asian_", "suffix": ".png" } } + ], + "name": "Umai Sushi &Teriyaki" + }, + { + "fsq_place_id": "58e2d589f63c54423edeb9ee", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Ruby's Gift Shop" + }, + { + "fsq_place_id": "4d210e79b69c6dcbd0db7595", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "Woodring Orchards" + }, + { + "fsq_place_id": "4aca405df964a5200bc120e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d10e941735", "name": "Greek Restaurant", "short_name": "Greek", "plural_name": "Greek Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/greek_", "suffix": ".png" } }], + "name": "Mr D's Greek Delicacies" + }, + { "fsq_place_id": "58d96a875804ea0704a62c92", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "54b16f17498e2617e20e1838", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }], + "name": "Mariscos México" + }, + { + "fsq_place_id": "5b0b192c916bc1002c45359f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Cha Doua’s Garden" + }, + { + "fsq_place_id": "5c104bab829b0c002caf9f5e", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d103951735", "name": "Clothing Store", "short_name": "Apparel", "plural_name": "Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_", "suffix": ".png" } }], + "name": "Aiiden" + }, + { + "fsq_place_id": "5c71c13458002c002cb60933", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "Truffle Queen" + }, + { + "fsq_place_id": "64a080f7acca8210e042ce22", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d111951735", "name": "Jewelry Store", "short_name": "Jewelry", "plural_name": "Jewelry Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/jewelry_", "suffix": ".png" } }, + { "fsq_category_id": "58daa1558bbb0b01f18ec1d6", "name": "Art Studio", "short_name": "Art Studio", "plural_name": "Art Studios", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } } + ], + "name": "Magpie Mouse Studios" + }, + { + "fsq_place_id": "4b95ac9cf964a520e2ae34e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1fb941735", "name": "Hobby Store", "short_name": "Hobbies", "plural_name": "Hobby Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/hobbyshop_", "suffix": ".png" } }], + "name": "Pike Place Magic Shop" + }, + { + "fsq_place_id": "4ad21dcdf964a5207adf20e3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { + "fsq_category_id": "4bf58dd8d48988d1d3941735", + "name": "Vegan and Vegetarian Restaurant", + "short_name": "Vegan and Vegetarian Restaurant", + "plural_name": "Vegan and Vegetarian Restaurants", + "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/vegetarian_", "suffix": ".png" } + } + ], + "name": "Cinnamon Works" + }, + { + "fsq_place_id": "4d0f9817cf09a143fe63260f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }], + "name": "Totem Smokehouse Smoked Salmon" + }, + { + "fsq_place_id": "4ba3fa5ef964a520c57338e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11d951735", "name": "Butcher", "short_name": "Butcher", "plural_name": "Butchers", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_butcher_", "suffix": ".png" } }], + "name": "Don & Joe's Meats" + }, + { + "fsq_place_id": "4bf960cb4a67c928f2b826cf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }], + "name": "Pike Place Fish Market" + }, + { + "fsq_place_id": "4b295179f964a520d49c24e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "MarketSpice" + }, + { + "fsq_place_id": "53d7e31d498ebdc66811f697", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Martin Family Orchards" + }, + { + "fsq_place_id": "6754f0680f5cf64c8639d9f2", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } }, + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b26", "name": "Textiles Store", "short_name": "Textiles Store", "plural_name": "Textiles Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }, + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b25", "name": "Knitting Store", "short_name": "Knitting Supplies", "plural_name": "Knitting Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } } + ], + "name": "Yarn Dragon" + }, + { + "fsq_place_id": "4bf9739f4a67c92837e026cf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d123951735", "name": "Smoke Shop", "short_name": "Smoke Shop", "plural_name": "Smoke Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/tobacco_", "suffix": ".png" } }], + "name": "Tobacco Patch" + }, + { + "fsq_place_id": "4c6fe5539375a09315280537", + "categories": [ + { "fsq_category_id": "52e81612bcbc57f1066b79ed", "name": "Outdoor Sculpture", "short_name": "Outdoor Sculpture", "plural_name": "Outdoor Sculptures", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/sculpture_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d12d941735", "name": "Monument", "short_name": "Monument", "plural_name": "Monuments", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/government_monument_", "suffix": ".png" } } + ], + "name": "Rachel the Pig at Pike Place Market" + }, + { + "fsq_place_id": "6881fae9aa6688540a5c01ff", + "categories": [{ "fsq_category_id": "63be6904847c3692a84b9b2b", "name": "Automotive Service", "short_name": "Automotive Service", "plural_name": "Automotive Services", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/automotive_", "suffix": ".png" } }], + "name": "Sapir Construction" + }, + { + "fsq_place_id": "4beed475e24d20a14b6e7314", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d110951735", "name": "Hair Salon", "short_name": "Hair Salon", "plural_name": "Hair Salons", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/salon_barber_", "suffix": ".png" } }], + "name": "Sergio's Barber Shop" + }, + { + "fsq_place_id": "474acec2f964a520994c1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d147941735", "name": "Diner", "short_name": "Diner", "plural_name": "Diners", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/diner_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d14e941735", "name": "American Restaurant", "short_name": "American", "plural_name": "American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "Sound View Café" + }, + { + "fsq_place_id": "52991cb2498e0d9918eb12d9", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } }], + "name": "MarninSaylor" + }, + { + "fsq_place_id": "5c71c1349e0d54003978395e", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "Truffle Queen" + } + ] + }, + "social_media": { "facebook_id": "86493431461", "instagram": "pikeplacepublicmarket", "twitter": "pike_place" }, + "tel": "(206) 682-7453", + "website": "https://www.pikeplacemarket.org" +} diff --git a/test/fixtures/GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2Fsearch%3Fll%3D47.609657%252C-122.342148%26limit%3D10.json b/test/fixtures/GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2Fsearch%3Fll%3D47.609657%252C-122.342148%26limit%3D10.json new file mode 100644 index 0000000000..7340723782 --- /dev/null +++ b/test/fixtures/GET_https%3A%2F%2Fplaces-api.foursquare.com%2Fplaces%2Fsearch%3Fll%3D47.609657%252C-122.342148%26limit%3D10.json @@ -0,0 +1,1134 @@ +{ + "results": [ + { + "fsq_place_id": "419e8900f964a520301e1fe3", + "latitude": 47.6097907988089, + "longitude": -122.34225747070934, + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1d0941735", "name": "Dessert Shop", "short_name": "Desserts", "plural_name": "Dessert Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/dessert_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } } + ], + "date_created": "2004-11-20", + "date_refreshed": "2025-10-27", + "distance": 16, + "email": "info@lepanier.com", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330080021004" }, + "link": "/places/419e8900f964a520301e1fe3", + "location": { "address": "1902 Pike Pl", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "1902 Pike Pl (at Stewart St), Seattle, WA 98101" }, + "name": "Le Panier", + "placemaker_url": "https://foursquare.com/placemakers/review-place/419e8900f964a520301e1fe3", + "related_places": { + "parent": { + "fsq_place_id": "427ea800f964a520b1211fe3", + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Pike Place Market" + } + }, + "social_media": { "facebook_id": "112134218808196", "twitter": "lepanierbakery" }, + "tel": "(206) 441-3669", + "website": "https://www.lepanier.com" + }, + { + "fsq_place_id": "4a41576ff964a52027a51fe3", + "latitude": 47.60956997146841, + "longitude": -122.34185099601746, + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11e951735", "name": "Cheese Store", "short_name": "Cheese Store", "plural_name": "Cheese Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_cheese_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1bf941735", "name": "Mac and Cheese Joint", "short_name": "Mac and Cheese Joint", "plural_name": "Mac and Cheese Joints", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/macandcheese_", "suffix": ".png" } } + ], + "date_created": "2009-06-23", + "date_refreshed": "2025-10-26", + "distance": 24, + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330081011001" }, + "link": "/places/4a41576ff964a52027a51fe3", + "location": { "address": "1600 Pike Pl", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "1600 Pike Pl (Pine St), Seattle, WA 98101" }, + "name": "Beecher's Handmade Cheese", + "placemaker_url": "https://foursquare.com/placemakers/review-place/4a41576ff964a52027a51fe3", + "related_places": { + "parent": { + "fsq_place_id": "427ea800f964a520b1211fe3", + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Pike Place Market" + } + }, + "social_media": { "facebook_id": "90709154764", "instagram": "beecherscheese", "twitter": "beechersseattle" }, + "store_id": "", + "tel": "(206) 956-1964", + "website": "https://beechershandmadecheese.com/cafe/pike-place-market" + }, + { + "fsq_place_id": "49ee65a3f964a52058681fe3", + "latitude": 47.60986350454703, + "longitude": -122.34244033809314, + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "5293a7563cf9994f4e043a44", "name": "Russian Restaurant", "short_name": "Russian", "plural_name": "Russian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/russian_", "suffix": ".png" } } + ], + "date_created": "2009-04-22", + "date_refreshed": "2025-10-26", + "distance": 31, + "email": "cs@piroshkybakery.com", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330080021004" }, + "link": "/places/49ee65a3f964a52058681fe3", + "location": { "address": "1908 Pike Pl", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "1908 Pike Pl (btwn Virginia & Stewart St), Seattle, WA 98101" }, + "name": "Piroshky Piroshky", + "placemaker_url": "https://foursquare.com/placemakers/review-place/49ee65a3f964a52058681fe3", + "related_places": { + "parent": { + "fsq_place_id": "427ea800f964a520b1211fe3", + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Pike Place Market" + } + }, + "social_media": { "facebook_id": "145205242168363", "instagram": "piroshkypiroshky", "twitter": "PiroshkyBakery" }, + "tel": "(206) 441-6068", + "website": "http://piroshkybakery.com" + }, + { + "fsq_place_id": "4a9441bff964a520f02020e3", + "latitude": 47.60984075878839, + "longitude": -122.34240534518894, + "categories": [{ "fsq_category_id": "4bf58dd8d48988d146941735", "name": "Deli", "short_name": "Deli", "plural_name": "Delis", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/deli_", "suffix": ".png" } }], + "date_created": "2009-08-25", + "date_refreshed": "2025-10-27", + "distance": 28, + "email": "info@michoudeli.com", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330080021004" }, + "link": "/places/4a9441bff964a520f02020e3", + "location": { "address": "1904 Pike Pl", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "1904 Pike Pl, Seattle, WA 98101" }, + "name": "Michou", + "placemaker_url": "https://foursquare.com/placemakers/review-place/4a9441bff964a520f02020e3", + "related_places": { + "parent": { + "fsq_place_id": "427ea800f964a520b1211fe3", + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Pike Place Market" + } + }, + "social_media": { "facebook_id": "118607088203830" }, + "tel": "(206) 448-4758", + "website": "http://www.michoudeli.com" + }, + { + "fsq_place_id": "42accc80f964a5203f251fe3", + "latitude": 47.60965387058825, + "longitude": -122.34148136820502, + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d10c941735", "name": "French Restaurant", "short_name": "French", "plural_name": "French Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/french_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d16d941735", "name": "Café", "short_name": "Café", "plural_name": "Cafés", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/cafe_", "suffix": ".png" } } + ], + "date_created": "2005-06-13", + "date_refreshed": "2025-10-25", + "distance": 49, + "email": "bmunn@cafecampagne.com", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330081011000" }, + "link": "/places/42accc80f964a5203f251fe3", + "location": { "address": "1600 Post Aly", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "1600 Post Aly (at Pine St), Seattle, WA 98101" }, + "name": "Cafe Campagne", + "placemaker_url": "https://foursquare.com/placemakers/review-place/42accc80f964a5203f251fe3", + "related_places": {}, + "social_media": { "facebook_id": "43225062707", "twitter": "" }, + "store_id": "", + "tel": "(206) 728-2233", + "website": "https://cafecampagne.com" + }, + { + "fsq_place_id": "51c1286f498e2505fd764fbe", + "latitude": 47.609648331726504, + "longitude": -122.34142532549396, + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11e941735", "name": "Cocktail Bar", "short_name": "Cocktail", "plural_name": "Cocktail Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/cocktails_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d112941735", "name": "Juice Bar", "short_name": "Juice Bar", "plural_name": "Juice Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/juicebar_", "suffix": ".png" } } + ], + "date_created": "2013-06-19", + "date_refreshed": "2025-10-25", + "distance": 54, + "email": "rachel@rachelsgingerbeer.com", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330081011000" }, + "link": "/places/51c1286f498e2505fd764fbe", + "location": { "address": "1530 Post Aly", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "1530 Post Aly, Seattle, WA 98101" }, + "name": "Rachel's Ginger Beer", + "placemaker_url": "https://foursquare.com/placemakers/review-place/51c1286f498e2505fd764fbe", + "related_places": { + "parent": { + "fsq_place_id": "427ea800f964a520b1211fe3", + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Pike Place Market" + } + }, + "social_media": { "facebook_id": "193410837360450", "twitter": "rgbsoda" }, + "tel": "(206) 467-4924", + "website": "http://rachelsgingerbeer.com" + }, + { + "fsq_place_id": "427ea800f964a520b1211fe3", + "latitude": 47.609334087942955, + "longitude": -122.34147579532495, + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "date_created": "2005-05-09", + "date_refreshed": "2025-10-27", + "distance": 61, + "email": "info@pikeplacemarket.org", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330081011003" }, + "link": "/places/427ea800f964a520b1211fe3", + "location": { "address": "85 Pike St", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "85 Pike St (at Pine St), Seattle, WA 98101" }, + "name": "Pike Place Market", + "placemaker_url": "https://foursquare.com/placemakers/review-place/427ea800f964a520b1211fe3", + "related_places": { + "children": [ + { + "fsq_place_id": "68c3cd83a33d853805869d81", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d103951735", "name": "Clothing Store", "short_name": "Apparel", "plural_name": "Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_", "suffix": ".png" } }], + "name": "Fashion with Trends" + }, + { + "fsq_place_id": "4a6e24f6f964a52007d41fe3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }], + "name": "Pike Place Chowder" + }, + { + "fsq_place_id": "595d37622be425119f41fdaf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } }], + "name": "Gateway To Mystical Tibet" + }, + { + "fsq_place_id": "5c0c2839e55d8b002bec0864", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d15a941735", "name": "Garden", "short_name": "Garden", "plural_name": "Gardens", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/garden_", "suffix": ".png" } }], + "name": "The Secret Garden" + }, + { + "fsq_place_id": "5c0c5e3a9e3b65002c77457c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d116951735", "name": "Antique Store", "short_name": "Antiques", "plural_name": "Antique Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/antique_", "suffix": ".png" } }], + "name": "Animal Gifts & Collextibles" + }, + { + "fsq_place_id": "439b0d38f964a520db2b1fe3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1cd941735", "name": "South American Restaurant", "short_name": "South American", "plural_name": "South American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/argentinian_", "suffix": ".png" } }], + "name": "Copacabana" + }, + { + "fsq_place_id": "574882b9498e2cca0de19f2c", + "categories": [{ "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } }], + "name": "Tiny’s Organic Hot Apple Cider" + }, + { + "fsq_place_id": "4582b235f964a5207c3f1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d142941735", "name": "Asian Restaurant", "short_name": "Asian", "plural_name": "Asian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/asian_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1df931735", "name": "BBQ Joint", "short_name": "BBQ", "plural_name": "BBQ Joints", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bbqalt_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } } + ], + "name": "Mee Sum Pastry" + }, + { + "fsq_place_id": "6276e76835c7ab40d09e0c46", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d15b941735", "name": "Farm", "short_name": "Farm", "plural_name": "Farms", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/farm_", "suffix": ".png" } } + ], + "name": "Cuaresma R&L Farm" + }, + { + "fsq_place_id": "6700798c5024253ac7e9224f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d165941735", "name": "Scenic Lookout", "short_name": "Scenic Lookout", "plural_name": "Scenic Lookouts", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/sceniclookout_", "suffix": ".png" } }], + "name": "Overlook Walk" + }, + { + "fsq_place_id": "4ea5ee17b80336cb0348c68f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f9931735", "name": "Road", "short_name": "Road", "plural_name": "Roads", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/highway_", "suffix": ".png" } }], + "name": "Post Alley" + }, + { + "fsq_place_id": "5924a2743149b933a0bba7b4", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d164941735", "name": "Plaza", "short_name": "Plaza", "plural_name": "Plazas", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/plaza_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1f7941735", "name": "Flea Market", "short_name": "Flea Market", "plural_name": "Flea Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/fleamarket_", "suffix": ".png" } } + ], + "name": "The Pike Place MarketFront" + }, + { + "fsq_place_id": "635d8e050082821c2c84110a", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11e951735", "name": "Cheese Store", "short_name": "Cheese Store", "plural_name": "Cheese Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_cheese_", "suffix": ".png" } }], + "name": "The Cheese Box" + }, + { + "fsq_place_id": "4fa97891e4b07650f7b12097", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c1941735", "name": "Mexican Restaurant", "short_name": "Mexican", "plural_name": "Mexican Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mexican_", "suffix": ".png" } }], + "name": "Los Agaves Mexican Street Food" + }, + { + "fsq_place_id": "5722a9df498efc35a195867c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c9941735", "name": "Ice Cream Parlor", "short_name": "Ice Cream", "plural_name": "Ice Cream Parlors", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/icecream_", "suffix": ".png" } }], + "name": "Shug's Soda Fountain and Ice Cream" + }, + { + "fsq_place_id": "685c6d51264921158658aa02", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d114951735", "name": "Bookstore", "short_name": "Bookstore", "plural_name": "Bookstores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/bookstore_", "suffix": ".png" } }], + "name": "Pine Books" + }, + { + "fsq_place_id": "4b8593a9f964a5207e6631e3", + "categories": [ + { "fsq_category_id": "4eb1bd1c3b7b55596b4a748f", "name": "Filipino Restaurant", "short_name": "Filipino", "plural_name": "Filipino Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/filipino_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d118951735", "name": "Grocery Store", "short_name": "Grocery Store", "plural_name": "Grocery Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_grocery_", "suffix": ".png" } } + ], + "name": "Oriental Mart" + }, + { "fsq_place_id": "58d96a9e409f565903fa6399", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "4a96e520f964a520702720e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d111941735", "name": "Japanese Restaurant", "short_name": "Japanese", "plural_name": "Japanese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/japanese_", "suffix": ".png" } }], + "name": "Umai Sushi Teriyaki" + }, + { "fsq_place_id": "58d96a720037eb26cc623292", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5762e95e498e2dd19def67cd", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d12f941735", "name": "Library", "short_name": "Library", "plural_name": "Libraries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/library_", "suffix": ".png" } }], + "name": "FOLIO: The Seattle Athenaeum" + }, + { + "fsq_place_id": "52a7bdff11d264bf08c940dd", + "categories": [ + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b25", "name": "Knitting Store", "short_name": "Knitting Supplies", "plural_name": "Knitting Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } } + ], + "name": "So Much Yarn" + }, + { + "fsq_place_id": "5bf604ba598e64002c2984c6", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d111941735", "name": "Japanese Restaurant", "short_name": "Japanese", "plural_name": "Japanese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/japanese_", "suffix": ".png" } }], + "name": "Unai Sushi & Teriyaki" + }, + { + "fsq_place_id": "668aeba01d73f81bbb98fa66", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c1941735", "name": "Mexican Restaurant", "short_name": "Mexican", "plural_name": "Mexican Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mexican_", "suffix": ".png" } }], + "name": "El Mixteco" + }, + { + "fsq_place_id": "4c9faa8a2fb1a143bbeaf540", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d114951735", "name": "Bookstore", "short_name": "Bookstore", "plural_name": "Bookstores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/bookstore_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d10d951735", "name": "Record Store", "short_name": "Record Store", "plural_name": "Record Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/record_shop_", "suffix": ".png" } } + ], + "name": "Lionheart Bookstore & Records" + }, + { "fsq_place_id": "58d96a5bc0c89b2d9f98060f", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "62ec0cea495f6e5349e94a14", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }], + "name": "Bite Society" + }, + { + "fsq_place_id": "614f82bfb2119e03fb370a9d", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d102951735", "name": "Fashion Accessories Store", "short_name": "Fashion Accessories Store", "plural_name": "Fashion Accessories Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_accessories_", "suffix": ".png" } } + ], + "name": "Eclipse Hat Shop" + }, + { + "fsq_place_id": "62f9771ef26ef62eb249cc65", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Lor Garden" + }, + { + "fsq_place_id": "419e8900f964a520301e1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1d0941735", "name": "Dessert Shop", "short_name": "Desserts", "plural_name": "Dessert Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/dessert_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } } + ], + "name": "Le Panier" + }, + { + "fsq_place_id": "5aae7807a22db7227b2a7bb3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d110941735", "name": "Italian Restaurant", "short_name": "Italian", "plural_name": "Italian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/italian_", "suffix": ".png" } }], + "name": "Pasta Casalinga" + }, + { + "fsq_place_id": "47f20627f964a520954e1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d110941735", "name": "Italian Restaurant", "short_name": "Italian", "plural_name": "Italian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/italian_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } } + ], + "name": "The Pasta Bar" + }, + { + "fsq_place_id": "5b564b40054e29002cef59e8", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d123941735", "name": "Wine Bar", "short_name": "Wine Bar", "plural_name": "Wine Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/winery_", "suffix": ".png" } }], + "name": "Northwest Tastings" + }, + { + "fsq_place_id": "66880e34f675c97a48ff2d83", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d179941735", "name": "Bagel Shop", "short_name": "Bagels", "plural_name": "Bagel Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bagels_", "suffix": ".png" } }], + "name": "Bagel Pop" + }, + { + "fsq_place_id": "4b4e3163f964a520b7e426e3", + "categories": [ + { "fsq_category_id": "4d4ae6fc7a7b7dea34424761", "name": "Fried Chicken Joint", "short_name": "Fried Chicken", "plural_name": "Fried Chicken Joints", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/friedchicken_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d16e941735", "name": "Fast Food Restaurant", "short_name": "Fast Food", "plural_name": "Fast Food Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/fastfood_", "suffix": ".png" } } + ], + "name": "Chicken Valley" + }, + { + "fsq_place_id": "511ac39fe4b0c7092df6617c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1d0941735", "name": "Dessert Shop", "short_name": "Desserts", "plural_name": "Dessert Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/dessert_", "suffix": ".png" } }], + "name": "Indi Chocolate" + }, + { + "fsq_place_id": "6276e7ce6210f9141d155c05", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d15b941735", "name": "Farm", "short_name": "Farm", "plural_name": "Farms", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/farm_", "suffix": ".png" } } + ], + "name": "Cuaresma R&L Farm" + }, + { "fsq_place_id": "4a9441bff964a520f02020e3", "categories": [{ "fsq_category_id": "4bf58dd8d48988d146941735", "name": "Deli", "short_name": "Deli", "plural_name": "Delis", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/deli_", "suffix": ".png" } }], "name": "Michou" }, + { + "fsq_place_id": "4ae38a67f964a5206b9621e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11d951735", "name": "Butcher", "short_name": "Butcher", "plural_name": "Butchers", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_butcher_", "suffix": ".png" } }], + "name": "fero's meat market" + }, + { "fsq_place_id": "58d96a4c02b60e791e4176cc", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "440daad8f964a52096301fe3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }], + "name": "Starbucks" + }, + { + "fsq_place_id": "4b1b1d8cf964a52049f823e3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d118951735", "name": "Grocery Store", "short_name": "Grocery Store", "plural_name": "Grocery Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_grocery_", "suffix": ".png" } } + ], + "name": "Sosio's Fruit and Produce" + }, + { + "fsq_place_id": "4c33791fed37a593816a6d03", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1fb941735", "name": "Hobby Store", "short_name": "Hobbies", "plural_name": "Hobby Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/hobbyshop_", "suffix": ".png" } }], + "name": "Old Seattle Paperworks" + }, + { "fsq_place_id": "58d96b7e7d66be79a60a8cda", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5bad843c73fe25002cd1df40", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Santos Farms" + }, + { + "fsq_place_id": "49ee65a3f964a52058681fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "5293a7563cf9994f4e043a44", "name": "Russian Restaurant", "short_name": "Russian", "plural_name": "Russian Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/russian_", "suffix": ".png" } } + ], + "name": "Piroshky Piroshky" + }, + { "fsq_place_id": "58d96a6c9ab66307e1769c5a", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5990c95b4940bc65f0dfc026", + "categories": [ + { "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1cb941735", "name": "Food Truck", "short_name": "Food Truck", "plural_name": "Food Trucks", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/streetfood_", "suffix": ".png" } } + ], + "name": "Roasted Corn" + }, + { + "fsq_place_id": "62c04eaf8c88c7194f5714c6", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d179941735", "name": "Bagel Shop", "short_name": "Bagels", "plural_name": "Bagel Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bagels_", "suffix": ".png" } }], + "name": "Bagelbop" + }, + { + "fsq_place_id": "477ce324f964a520234d1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d115941735", "name": "Middle Eastern Restaurant", "short_name": "Middle Eastern", "plural_name": "Middle Eastern Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/middleeastern_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1c0941735", "name": "Mediterranean Restaurant", "short_name": "Mediterranean", "plural_name": "Mediterranean Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mediterranean_", "suffix": ".png" } } + ], + "name": "Falafel King" + }, + { + "fsq_place_id": "5641140ccd108d476916ca18", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f9941735", "name": "Food and Beverage Retail", "short_name": "Food & Beverage", "plural_name": "Food and Beverage Retail", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/foodanddrink_", "suffix": ".png" } }], + "name": "Tiny's Organic" + }, + { + "fsq_place_id": "689e8c4db9cf5b176894c56c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d124941735", "name": "Office", "short_name": "Office", "plural_name": "Offices", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/default_", "suffix": ".png" } }], + "name": "The Salish Room" + }, + { + "fsq_place_id": "59220125c4df1d5708ba1560", + "categories": [{ "fsq_category_id": "58daa1558bbb0b01f18ec1d6", "name": "Art Studio", "short_name": "Art Studio", "plural_name": "Art Studios", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } }], + "name": "Jesse Link Gallery" + }, + { + "fsq_place_id": "68c9d7951ed0a44ad66351c5", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } }], + "name": "Pizza & Pasta Bar" + }, + { + "fsq_place_id": "51883255498e51f786d85a0a", + "categories": [ + { "fsq_category_id": "4d954b16a243a5684b65b473", "name": "Rest Area", "short_name": "Rest Areas", "plural_name": "Rest Areas", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/restarea_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d165941735", "name": "Scenic Lookout", "short_name": "Scenic Lookout", "plural_name": "Scenic Lookouts", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/sceniclookout_", "suffix": ".png" } } + ], + "name": "Waterfront Viewpoint" + }, + { + "fsq_place_id": "62a3ee720cea093979f7fb9d", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e2931735", "name": "Art Gallery", "short_name": "Art Gallery", "plural_name": "Art Galleries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } }], + "name": "Gallery Ergo" + }, + { "fsq_place_id": "58d96a79debdf62e17649a84", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "4ba52ffdf964a52057e938e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d112941735", "name": "Juice Bar", "short_name": "Juice Bar", "plural_name": "Juice Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/juicebar_", "suffix": ".png" } }], + "name": "Juice Emporium" + }, + { + "fsq_place_id": "5ccf6cc84acb19002c7b1b90", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d117951735", "name": "Candy Store", "short_name": "Candy Store", "plural_name": "Candy Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/candystore_", "suffix": ".png" } }], + "name": "Cobb's Pike Place Popcorn" + }, + { + "fsq_place_id": "4bc23a4d4cdfc9b61dcf9521", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "City Fish Co." + }, + { + "fsq_place_id": "59e548478c35dc3e57b97e90", + "categories": [{ "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } }], + "name": "Tiny's Organic Hot Apple Cider" + }, + { + "fsq_place_id": "66246edb29ceb661bfb4bbc4", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c9941735", "name": "Ice Cream Parlor", "short_name": "Ice Cream", "plural_name": "Ice Cream Parlors", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/icecream_", "suffix": ".png" } }], + "name": "Baxter & Frost" + }, + { + "fsq_place_id": "684dbad659d3f64cce97a8b3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Lee’s Garden" + }, + { + "fsq_place_id": "68c9d794251ab11151d2ec11", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } }], + "name": "Pizza & Pasta Bar" + }, + { + "fsq_place_id": "4a4bc093f964a520abac1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1fb941735", "name": "Hobby Store", "short_name": "Hobbies", "plural_name": "Hobby Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/hobbyshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1f3941735", "name": "Toy Store", "short_name": "Toys & Games", "plural_name": "Toy Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/toys_", "suffix": ".png" } }, + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b18", "name": "Comic Book Store", "short_name": "Comic Store", "plural_name": "Comic Book Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/comic_", "suffix": ".png" } } + ], + "name": "Golden Age Collectables" + }, + { + "fsq_place_id": "628ab065d6117e2150c3ac14", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Pike St. Coffee" + }, + { + "fsq_place_id": "4c2f6396213c2d7fbdb8305d", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d100951735", "name": "Pet Supplies Store", "short_name": "Pet Supplies Store", "plural_name": "Pet Supplies Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/pet_store_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Merry Tails" + }, + { + "fsq_place_id": "50d7a5a3e4b05909046d1938", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }, + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } } + ], + "name": "Quality Fruit" + }, + { + "fsq_place_id": "449addfdf964a5209c341fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d123941735", "name": "Wine Bar", "short_name": "Wine Bar", "plural_name": "Wine Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/winery_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d11e941735", "name": "Cocktail Bar", "short_name": "Cocktail", "plural_name": "Cocktail Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/cocktails_", "suffix": ".png" } } + ], + "name": "The Tasting Room" + }, + { "fsq_place_id": "58d96ad083622d210c61e79b", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "629f71fcf8b64237d81e23ce", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d116941735", "name": "Bar", "short_name": "Bar", "plural_name": "Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/pub_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ca941735", "name": "Pizzeria", "short_name": "Pizza", "plural_name": "Pizzerias", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/pizza_", "suffix": ".png" } } + ], + "name": "Alibi Room" + }, + { + "fsq_place_id": "4a3c2d5df964a52038a11fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d14e941735", "name": "American Restaurant", "short_name": "American", "plural_name": "American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/default_", "suffix": ".png" } } + ], + "name": "Market Grill" + }, + { + "fsq_place_id": "51c1286f498e2505fd764fbe", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11e941735", "name": "Cocktail Bar", "short_name": "Cocktail", "plural_name": "Cocktail Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/nightlife/cocktails_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d112941735", "name": "Juice Bar", "short_name": "Juice Bar", "plural_name": "Juice Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/juicebar_", "suffix": ".png" } } + ], + "name": "Rachel's Ginger Beer" + }, + { + "fsq_place_id": "63dec8d120aa934d836a9ef9", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Woodinville Farm Flowers" + }, + { + "fsq_place_id": "6421e2eb8eecbf34771acfff", + "categories": [ + { + "fsq_category_id": "4deefb944765f83613cdba6e", + "name": "Historic and Protected Site", + "short_name": "Historic and Protected Site", + "plural_name": "Historic and Protected Sites", + "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/historicsite_", "suffix": ".png" } + } + ], + "name": "Public Market Center Clock Sign" + }, + { + "fsq_place_id": "4b9d10c1f964a5208f8c36e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }], + "name": "Pike Place Bakery" + }, + { + "fsq_place_id": "49ef647df964a520ad681fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d119951735", "name": "Wine Store", "short_name": "Wine Store", "plural_name": "Wine Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_wineshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d11e951735", "name": "Cheese Store", "short_name": "Cheese Store", "plural_name": "Cheese Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_cheese_", "suffix": ".png" } } + ], + "name": "DeLaurenti Food & Wine" + }, + { + "fsq_place_id": "4ac7cd89f964a520d9b920e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1c0941735", "name": "Mediterranean Restaurant", "short_name": "Mediterranean", "plural_name": "Mediterranean Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/mediterranean_", "suffix": ".png" } }], + "name": "Turkish Delight" + }, + { + "fsq_place_id": "6521e256c6f3d2015723be6e", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ff941735", "name": "Miscellaneous Store", "short_name": "Store", "plural_name": "Miscellaneous Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }], + "name": "The Alabaster Owl" + }, + { + "fsq_place_id": "64c1462b75db9e2421a181fa", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1d0941735", "name": "Dessert Shop", "short_name": "Desserts", "plural_name": "Dessert Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/dessert_", "suffix": ".png" } }], + "name": "Hellenika Cultured Creamery" + }, + { + "fsq_place_id": "4de28f8b2271bfb8449e892c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d117951735", "name": "Candy Store", "short_name": "Candy Store", "plural_name": "Candy Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/candystore_", "suffix": ".png" } }], + "name": "Sweetie's" + }, + { + "fsq_place_id": "68b0d8c3b9bd4e2bafd7bec1", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Thai Tao Farm" + }, + { + "fsq_place_id": "4c34f0e34308b7132891c430", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d112941735", "name": "Juice Bar", "short_name": "Juice Bar", "plural_name": "Juice Bars", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/juicebar_", "suffix": ".png" } }, + { "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } } + ], + "name": "Tiny's Organic" + }, + { + "fsq_place_id": "59ed1ad520795515ba5e1509", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d116951735", "name": "Antique Store", "short_name": "Antiques", "plural_name": "Antique Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/antique_", "suffix": ".png" } }], + "name": "Osara Commisary" + }, + { + "fsq_place_id": "6599b1a970e0dc308f87bd6c", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Yang Farm" + }, + { + "fsq_place_id": "57d30787498e4af69643ce18", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Eighth Generation Flagship Store" + }, + { + "fsq_place_id": "59b44831be70782b657ae1b8", + "categories": [ + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b1c", "name": "Fruit and Vegetable Store", "short_name": "Fruit and Vegetable Store", "plural_name": "Fruit and Vegetable Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_grocery_", "suffix": ".png" } }, + { "fsq_category_id": "56aa371be4b08b9a8d57350b", "name": "Food Stand", "short_name": "Food Stand", "plural_name": "Food Stands", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/movingtarget_", "suffix": ".png" } } + ], + "name": "Sidhu Farms" + }, + { + "fsq_place_id": "5b941d4a57a537002c09077d", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d103951735", "name": "Clothing Store", "short_name": "Apparel", "plural_name": "Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_", "suffix": ".png" } }, + { "fsq_category_id": "58daa1558bbb0b01f18ec1d6", "name": "Art Studio", "short_name": "Art Studio", "plural_name": "Art Studios", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } } + ], + "name": "Basilic Textiles" + }, + { + "fsq_place_id": "47f245d1f964a520974e1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1c5941735", "name": "Sandwich Spot", "short_name": "Sandwich Spot", "plural_name": "Sandwich Spots", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/deli_", "suffix": ".png" } } + ], + "name": "Three Girls Bakery" + }, + { "fsq_place_id": "58d96a618ee5602ddf71d713", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5a774b2e9e3b651f75c3f6d9", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ff941735", "name": "Miscellaneous Store", "short_name": "Store", "plural_name": "Miscellaneous Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }], + "name": "Simply Lavender" + }, + { + "fsq_place_id": "4aa01f4cf964a520673e20e3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "Jack's Fish Spot" + }, + { + "fsq_place_id": "5963fe50018cbb34d91b1c35", + "categories": [{ "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }], + "name": "Careful It Bites" + }, + { + "fsq_place_id": "4bae650bf964a52093ac3be3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d119951735", "name": "Wine Store", "short_name": "Wine Store", "plural_name": "Wine Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_wineshop_", "suffix": ".png" } } + ], + "name": "La Buona Tavola - Truffle Cafe" + }, + { "fsq_place_id": "58d96a9a0aac7572b1a6d52f", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "624b4faee0f31740166c7f2a", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Artisan Glass Blowing" + }, + { + "fsq_place_id": "4c019a5b716bc9b6ad2dbc55", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d114951735", "name": "Bookstore", "short_name": "Bookstore", "plural_name": "Bookstores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/bookstore_", "suffix": ".png" } }], + "name": "BLMF Literary Saloon" + }, + { + "fsq_place_id": "4e275e2e149554c7742f17d0", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d124941735", "name": "Office", "short_name": "Office", "plural_name": "Offices", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1f9941735", "name": "Food and Beverage Retail", "short_name": "Food & Beverage", "plural_name": "Food and Beverage Retail", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/foodanddrink_", "suffix": ".png" } } + ], + "name": "Tiny's Organic" + }, + { + "fsq_place_id": "5d85527c85aecf0008de913a", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ff941735", "name": "Miscellaneous Store", "short_name": "Store", "plural_name": "Miscellaneous Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }], + "name": "The Everything Store" + }, + { + "fsq_place_id": "68a7a3f3af5e2f5ab4060e71", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d127941735", "name": "Meeting Room", "short_name": "Meeting Room", "plural_name": "Meeting Rooms", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/office_conferenceroom_", "suffix": ".png" } }], + "name": "The Classroom" + }, + { + "fsq_place_id": "5dd0686bf1a48400074146d5", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Double Dorjee" + }, + { + "fsq_place_id": "6382cc5bec755b618b6d0488", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1f2931735", "name": "Performing Arts Venue", "short_name": "Performing Arts", "plural_name": "Performing Arts Venues", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/performingarts_", "suffix": ".png" } } + ], + "name": "Rabbit Box Theater" + }, + { + "fsq_place_id": "4a41576ff964a52027a51fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11e951735", "name": "Cheese Store", "short_name": "Cheese Store", "plural_name": "Cheese Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_cheese_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1bf941735", "name": "Mac and Cheese Joint", "short_name": "Mac and Cheese Joint", "plural_name": "Mac and Cheese Joints", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/macandcheese_", "suffix": ".png" } } + ], + "name": "Beecher's Handmade Cheese" + }, + { "fsq_place_id": "58d96a952eb9796c3af09c59", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "5a19b89867e5f2622dbdebdf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Seattle Hats" + }, + { + "fsq_place_id": "6302c45c7b270c589032321f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Cafe Au Lait Dahlias" + }, + { + "fsq_place_id": "44e36b6bf964a5203d371fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d10c941735", "name": "French Restaurant", "short_name": "French", "plural_name": "French Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/french_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "Place Pigalle" + }, + { + "fsq_place_id": "4f514e1de4b0ef967033cf64", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d116951735", "name": "Antique Store", "short_name": "Antiques", "plural_name": "Antique Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/antique_", "suffix": ".png" } }], + "name": "2nd Hand Gala" + }, + { + "fsq_place_id": "4f52a4eee4b02d0eb3a8aeeb", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d105951735", "name": "Children's Clothing Store", "short_name": "Children's Clothing Store", "plural_name": "Children's Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_kids_", "suffix": ".png" } } + ], + "name": "Boston Street Children's Shop" + }, + { + "fsq_place_id": "5a764d7f1cf2e146251883d4", + "categories": [{ "fsq_category_id": "5744ccdfe4b0c0459246b4dc", "name": "Shopping Plaza", "short_name": "Shopping Plaza", "plural_name": "Shopping Plazas", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/mall_", "suffix": ".png" } }], + "name": "Down Under" + }, + { + "fsq_place_id": "5de311c0fe97aa0007399445", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } }], + "name": "The Magic In The Market" + }, + { + "fsq_place_id": "659a09cd0b378d3675f46fef", + "categories": [{ "fsq_category_id": "4def73e84765ae376e57713a", "name": "Portuguese Restaurant", "short_name": "Portuguese", "plural_name": "Portuguese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/portuguese_", "suffix": ".png" } }], + "name": "Lonely Siren" + }, + { + "fsq_place_id": "4582b276f964a5207d3f1fe3", + "categories": [ + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b2c", "name": "Herbs and Spices Store", "short_name": "Herbs and Spices Store", "plural_name": "Herbs and Spices Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Tenzing Momo" + }, + { + "fsq_place_id": "454c474af964a520bb3c1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d143941735", "name": "Breakfast Spot", "short_name": "Breakfast", "plural_name": "Breakfast Spots", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/breakfast_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d147941735", "name": "Diner", "short_name": "Diner", "plural_name": "Diners", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/diner_", "suffix": ".png" } } + ], + "name": "Lowell's Restaurant" + }, + { + "fsq_place_id": "49c2e1a6f964a5203c561fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d14e941735", "name": "American Restaurant", "short_name": "American", "plural_name": "American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/default_", "suffix": ".png" } } + ], + "name": "Athenian" + }, + { "fsq_place_id": "58d96ac8da54ae0f567959a1", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "6744f891e01c6807db3938aa", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d148941735", "name": "Donut Shop", "short_name": "Donuts", "plural_name": "Donut Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/donuts_", "suffix": ".png" } }], + "name": "Uli’s Apple Cider Donuts" + }, + { + "fsq_place_id": "6166347d1a6d742808ba683d", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Jungle Bean" + }, + { + "fsq_place_id": "4e74dcb0315188bfdc647599", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d102951735", "name": "Fashion Accessories Store", "short_name": "Fashion Accessories Store", "plural_name": "Fashion Accessories Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_accessories_", "suffix": ".png" } } + ], + "name": "Croshay Design" + }, + { + "fsq_place_id": "628ab06556bad27a379944fe", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } } + ], + "name": "Pike St. Coffee" + }, + { + "fsq_place_id": "689e590c6503d3418a48cfe1", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d1d2941735", "name": "Sushi Restaurant", "short_name": "Sushi", "plural_name": "Sushi Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/sushi_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d145941735", "name": "Chinese Restaurant", "short_name": "Chinese", "plural_name": "Chinese Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/asian_", "suffix": ".png" } } + ], + "name": "Umai Sushi &Teriyaki" + }, + { + "fsq_place_id": "58e2d589f63c54423edeb9ee", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d128951735", "name": "Gift Store", "short_name": "Gift Store", "plural_name": "Gift Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/giftshop_", "suffix": ".png" } }], + "name": "Ruby's Gift Shop" + }, + { + "fsq_place_id": "4d210e79b69c6dcbd0db7595", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "Woodring Orchards" + }, + { + "fsq_place_id": "4aca405df964a5200bc120e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d10e941735", "name": "Greek Restaurant", "short_name": "Greek", "plural_name": "Greek Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/greek_", "suffix": ".png" } }], + "name": "Mr D's Greek Delicacies" + }, + { "fsq_place_id": "58d96a875804ea0704a62c92", "categories": [], "name": "Chain Music Press" }, + { + "fsq_place_id": "54b16f17498e2617e20e1838", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } }], + "name": "Mariscos México" + }, + { + "fsq_place_id": "5b0b192c916bc1002c45359f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }], + "name": "Cha Doua’s Garden" + }, + { + "fsq_place_id": "5c104bab829b0c002caf9f5e", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d103951735", "name": "Clothing Store", "short_name": "Apparel", "plural_name": "Clothing Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/apparel_", "suffix": ".png" } }], + "name": "Aiiden" + }, + { + "fsq_place_id": "5c71c13458002c002cb60933", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "Truffle Queen" + }, + { + "fsq_place_id": "64a080f7acca8210e042ce22", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d111951735", "name": "Jewelry Store", "short_name": "Jewelry", "plural_name": "Jewelry Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/jewelry_", "suffix": ".png" } }, + { "fsq_category_id": "58daa1558bbb0b01f18ec1d6", "name": "Art Studio", "short_name": "Art Studio", "plural_name": "Art Studios", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/arts_entertainment/artgallery_", "suffix": ".png" } } + ], + "name": "Magpie Mouse Studios" + }, + { + "fsq_place_id": "4b95ac9cf964a520e2ae34e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1fb941735", "name": "Hobby Store", "short_name": "Hobbies", "plural_name": "Hobby Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/hobbyshop_", "suffix": ".png" } }], + "name": "Pike Place Magic Shop" + }, + { + "fsq_place_id": "4ad21dcdf964a5207adf20e3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d16a941735", "name": "Bakery", "short_name": "Bakery", "plural_name": "Bakeries", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/bakery_", "suffix": ".png" } }, + { + "fsq_category_id": "4bf58dd8d48988d1d3941735", + "name": "Vegan and Vegetarian Restaurant", + "short_name": "Vegan and Vegetarian Restaurant", + "plural_name": "Vegan and Vegetarian Restaurants", + "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/vegetarian_", "suffix": ".png" } + } + ], + "name": "Cinnamon Works" + }, + { + "fsq_place_id": "4d0f9817cf09a143fe63260f", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }], + "name": "Totem Smokehouse Smoked Salmon" + }, + { + "fsq_place_id": "4ba3fa5ef964a520c57338e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d11d951735", "name": "Butcher", "short_name": "Butcher", "plural_name": "Butchers", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_butcher_", "suffix": ".png" } }], + "name": "Don & Joe's Meats" + }, + { + "fsq_place_id": "4bf960cb4a67c928f2b826cf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d10e951735", "name": "Fish Market", "short_name": "Fish Market", "plural_name": "Fish Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_fishmarket_", "suffix": ".png" } }], + "name": "Pike Place Fish Market" + }, + { + "fsq_place_id": "4b295179f964a520d49c24e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "MarketSpice" + }, + { + "fsq_place_id": "53d7e31d498ebdc66811f697", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d11b951735", "name": "Flower Store", "short_name": "Flower Store", "plural_name": "Flower Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/flowershop_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Martin Family Orchards" + }, + { + "fsq_place_id": "6754f0680f5cf64c8639d9f2", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } }, + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b26", "name": "Textiles Store", "short_name": "Textiles Store", "plural_name": "Textiles Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } }, + { "fsq_category_id": "52f2ab2ebcbc57f1066b8b25", "name": "Knitting Store", "short_name": "Knitting Supplies", "plural_name": "Knitting Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/default_", "suffix": ".png" } } + ], + "name": "Yarn Dragon" + }, + { + "fsq_place_id": "4bf9739f4a67c92837e026cf", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d123951735", "name": "Smoke Shop", "short_name": "Smoke Shop", "plural_name": "Smoke Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/tobacco_", "suffix": ".png" } }], + "name": "Tobacco Patch" + }, + { + "fsq_place_id": "4c6fe5539375a09315280537", + "categories": [ + { "fsq_category_id": "52e81612bcbc57f1066b79ed", "name": "Outdoor Sculpture", "short_name": "Outdoor Sculpture", "plural_name": "Outdoor Sculptures", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/parks_outdoors/sculpture_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d12d941735", "name": "Monument", "short_name": "Monument", "plural_name": "Monuments", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/building/government_monument_", "suffix": ".png" } } + ], + "name": "Rachel the Pig at Pike Place Market" + }, + { + "fsq_place_id": "6881fae9aa6688540a5c01ff", + "categories": [{ "fsq_category_id": "63be6904847c3692a84b9b2b", "name": "Automotive Service", "short_name": "Automotive Service", "plural_name": "Automotive Services", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/automotive_", "suffix": ".png" } }], + "name": "Sapir Construction" + }, + { + "fsq_place_id": "4beed475e24d20a14b6e7314", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d110951735", "name": "Hair Salon", "short_name": "Hair Salon", "plural_name": "Hair Salons", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/salon_barber_", "suffix": ".png" } }], + "name": "Sergio's Barber Shop" + }, + { + "fsq_place_id": "474acec2f964a520994c1fe3", + "categories": [ + { "fsq_category_id": "4bf58dd8d48988d147941735", "name": "Diner", "short_name": "Diner", "plural_name": "Diners", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/diner_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d14e941735", "name": "American Restaurant", "short_name": "American", "plural_name": "American Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/default_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1ce941735", "name": "Seafood Restaurant", "short_name": "Seafood", "plural_name": "Seafood Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/seafood_", "suffix": ".png" } } + ], + "name": "Sound View Café" + }, + { + "fsq_place_id": "52991cb2498e0d9918eb12d9", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d127951735", "name": "Arts and Crafts Store", "short_name": "Arts and Crafts Store", "plural_name": "Arts and Crafts Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/artstore_", "suffix": ".png" } }], + "name": "MarninSaylor" + }, + { + "fsq_place_id": "5c71c1349e0d54003978395e", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1f5941735", "name": "Gourmet Store", "short_name": "Gourmet", "plural_name": "Gourmet Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_gourmet_", "suffix": ".png" } }], + "name": "Truffle Queen" + } + ] + }, + "social_media": { "facebook_id": "86493431461", "instagram": "pikeplacepublicmarket", "twitter": "pike_place" }, + "tel": "(206) 682-7453", + "website": "https://www.pikeplacemarket.org" + }, + { + "fsq_place_id": "564e6ed5498eb69070554f79", + "latitude": 47.6099251, + "longitude": -122.3415442, + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1d2941735", "name": "Sushi Restaurant", "short_name": "Sushi", "plural_name": "Sushi Restaurants", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/sushi_", "suffix": ".png" } }], + "date_created": "2015-11-20", + "date_refreshed": "2025-10-20", + "distance": 54, + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330081011000" }, + "link": "/places/564e6ed5498eb69070554f79", + "location": { "address": "86 Pine St", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "86 Pine St, Seattle, WA 98101" }, + "name": "Sushi Kashiba", + "placemaker_url": "https://foursquare.com/placemakers/review-place/564e6ed5498eb69070554f79", + "related_places": { + "parent": { + "fsq_place_id": "4b36f319f964a520823e25e3", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1fa931735", "name": "Hotel", "short_name": "Hotel", "plural_name": "Hotels", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/travel/hotel_", "suffix": ".png" } }], + "name": "Inn at the Market" + } + }, + "social_media": { "facebook_id": "188220664854130", "twitter": "sushikashiba" }, + "tel": "(206) 441-8844", + "website": "https://sushikashiba.com" + }, + { + "fsq_place_id": "4a8af0f9f964a520f30a20e3", + "latitude": 47.6095888496472, + "longitude": -122.34164820146991, + "categories": [ + { "fsq_category_id": "58daa1558bbb0b01f18ec1b4", "name": "Kitchen Supply Store", "short_name": "Kitchen Supply", "plural_name": "Kitchen Supply Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_butcher_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1f8941735", "name": "Furniture and Home Store", "short_name": "Furniture and Home Store", "plural_name": "Furniture and Home Stores", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/furniture_", "suffix": ".png" } } + ], + "chains": [{ "fsq_chain_id": "5b1ff49775eee4002bc1cec8", "name": "Sur La Table" }], + "date_created": "2009-08-18", + "date_refreshed": "2025-10-23", + "distance": 38, + "email": "slt001@surlatable.com", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330081011001" }, + "link": "/places/4a8af0f9f964a520f30a20e3", + "location": { "address": "84 Pine St", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "84 Pine St (at Post Alley), Seattle, WA 98101" }, + "name": "Sur La Table", + "placemaker_url": "https://foursquare.com/placemakers/review-place/4a8af0f9f964a520f30a20e3", + "related_places": {}, + "social_media": { "twitter": "Sur_La_Table" }, + "store_id": "1", + "tel": "(206) 448-2244", + "website": "http://www.surlatable.com" + }, + { + "fsq_place_id": "440daad8f964a52096301fe3", + "latitude": 47.609988295775516, + "longitude": -122.34262556938519, + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }], + "chains": [{ "fsq_chain_id": "556f676fbd6a75a99038d8ec", "name": "Starbucks" }], + "date_created": "2006-03-07", + "date_refreshed": "2025-10-27", + "distance": 51, + "email": "info@starbucks.com", + "extended_location": { "dma": "Seattle-Tacoma", "census_block_id": "530330080021004" }, + "link": "/places/440daad8f964a52096301fe3", + "location": { "address": "1912 Pike Pl", "locality": "Seattle", "region": "WA", "postcode": "98101", "country": "US", "formatted_address": "1912 Pike Pl, Seattle, WA 98101" }, + "name": "Starbucks", + "placemaker_url": "https://foursquare.com/placemakers/review-place/440daad8f964a52096301fe3", + "related_places": { + "parent": { + "fsq_place_id": "427ea800f964a520b1211fe3", + "categories": [ + { "fsq_category_id": "50be8ee891d4fa8dcc7199a7", "name": "Market", "short_name": "Market", "plural_name": "Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/market_", "suffix": ".png" } }, + { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } + ], + "name": "Pike Place Market" + }, + "children": [ + { + "fsq_place_id": "5ef390608ad2500008537a55", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }], + "name": "1912 Pike Pl" + }, + { + "fsq_place_id": "5ef390b673640900084473e7", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }], + "name": "1912 Pile Pl" + }, + { + "fsq_place_id": "5ef390618556300008cbf9cb", + "categories": [{ "fsq_category_id": "4bf58dd8d48988d1e0931735", "name": "Coffee Shop", "short_name": "Coffee Shop", "plural_name": "Coffee Shops", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/food/coffeeshop_", "suffix": ".png" } }], + "name": "1912 Pike Pl" + } + ] + }, + "social_media": { "facebook_id": "22092443056", "instagram": "starbucks", "twitter": "starbucks" }, + "store_id": "301-67", + "tel": "(206) 448-8762", + "website": "https://www.starbucks.com" + } + ], + "context": { "geo_bounds": { "circle": { "center": { "latitude": 47.609657, "longitude": -122.342148 }, "radius": 600 } } } +} diff --git a/test/fixtures/fixture_manifest.json b/test/fixtures/fixture_manifest.json new file mode 100644 index 0000000000..1f60bb3661 --- /dev/null +++ b/test/fixtures/fixture_manifest.json @@ -0,0 +1,12 @@ +[ + "e2e-nokey/github-api.e2e.test.js", + "e2e-nokey/pubchem.e2e.test.js", + "e2e-nokey/scraping.e2e.test.js", + "e2e-nokey/wikipedia.e2e.test.js", + "e2e/chart.e2e.test.js", + "e2e/foursquare.e2e.test.js", + "e2e/nyt.e2e.test.js", + "e2e/openai-moderation.e2e.test.js", + "e2e/trakt.e2e.test.js", + "e2e/giphy.e2e.test.js" +] diff --git a/test/tools/fixture-helpers.js b/test/tools/fixture-helpers.js new file mode 100644 index 0000000000..beab8dc9dd --- /dev/null +++ b/test/tools/fixture-helpers.js @@ -0,0 +1,66 @@ +const crypto = require('node:crypto'); +const fs = require('node:fs'); +const path = require('node:path'); + +const MANIFEST_PATH = path.resolve(__dirname, '..', 'fixtures', 'fixture_manifest.json'); + +function hashBody(body) { + try { + const h = crypto.createHash('sha1'); + if (Buffer.isBuffer(body)) { + h.update(body); + } else if (typeof body === 'string') { + h.update(body); + } else if (body && typeof body === 'object') { + h.update(JSON.stringify(body)); + } else if (body != null) { + h.update(String(body)); + } + return h.digest('hex').slice(0, 12); + } catch { + return 'nohash'; + } +} + +function keyFor(method, url, body) { + const upper = String(method || 'GET').toUpperCase(); + const parsed = new URL(url); + const sensitiveParams = ['apikey', 'api_key', 'api-key', 'key', 'token']; + sensitiveParams.forEach((param) => parsed.searchParams.delete(param)); + const cleanUrl = `${parsed.origin}${parsed.pathname}${parsed.search}`; + // Encode, then replace Windows-forbidden filename characters with _ + const safe = encodeURIComponent(cleanUrl).replace(/[<>:"/\\|?*]/g, '_'); + if (upper === 'GET') { + return `${upper}_${safe}.json`; + } + const hash = hashBody(body); + return `${upper}_${safe}_${hash}.json`; +} + +function registerTestInManifest(testFile) { + try { + if (process.env.API_MODE !== 'record') return; + let list = []; + try { + list = JSON.parse(fs.readFileSync(MANIFEST_PATH, 'utf8')); + if (!Array.isArray(list)) list = []; + } catch {} + if (!list.includes(testFile)) { + list.push(testFile); + fs.writeFileSync(MANIFEST_PATH, JSON.stringify(list, null, 2)); + } + } catch {} +} + +function isInManifest(id) { + try { + if (!id) return false; + if (!fs.existsSync(MANIFEST_PATH)) return false; + const list = JSON.parse(fs.readFileSync(MANIFEST_PATH, 'utf8')); + return Array.isArray(list) && list.includes(id); + } catch { + return false; + } +} + +module.exports = { hashBody, keyFor, registerTestInManifest, isInManifest }; diff --git a/test/tools/server-axios-fixtures.js b/test/tools/server-axios-fixtures.js new file mode 100644 index 0000000000..d7c1663eb3 --- /dev/null +++ b/test/tools/server-axios-fixtures.js @@ -0,0 +1,76 @@ +/** + * Server-side Axios API Fixture System + * + * This module uses Axios interceptors to record and replay HTTP responses for server-side + * API calls made by Express controllers. It enables deterministic testing without requiring + * live API credentials or network access. + * + * How it works: + * - RECORD MODE (API_MODE=record): Axios response interceptor captures successful responses + * and saves JSON data to test/fixtures/ using sanitized URL-based filenames. + * - REPLAY MODE (API_MODE=replay): Axios request interceptor short-circuits requests by + * returning saved fixture data. If fixture exists, it rejects the request with a special + * marker (isAxiosFixture:true), which the response error interceptor converts back to a + * successful response. Falls back to real axios if fixture is missing (unless + * API_STRICT_REPLAY=1, which blocks all non-fixture requests). + * + * Installation: This module is automatically installed in test/tools/start-with-memory-db.js + * before the Express app loads, ensuring all server-side axios calls are intercepted. + * + * Fixture keys: Generated by keyFor() helper, which sanitizes URLs (strips sensitive query + * params like apikey/token) and adds body hashes for POST requests to ensure uniqueness. + * + * See also: server-fetch-fixtures.js (same pattern for fetch), fixture-helpers.js (shared utilities) + */ + +const fs = require('node:fs'); +const path = require('node:path'); +const axios = require('axios'); +const { keyFor } = require('./fixture-helpers'); + +const FIXTURES_DIR = path.resolve(__dirname, '..', 'fixtures'); + +function installServerAxiosFixtures({ mode = process.env.API_MODE } = {}) { + const strict = process.env.API_STRICT_REPLAY === '1'; + + if (mode === 'record') { + axios.interceptors.response.use((response) => { + try { + const { config, headers, data } = response; + const ct = (headers && headers['content-type']) || ''; + if (typeof data === 'object' || ct.toLowerCase().includes('application/json')) { + const file = path.join(FIXTURES_DIR, keyFor(config.method || 'GET', config.url, config.data)); + fs.writeFileSync(file, typeof data === 'string' ? data : JSON.stringify(data), 'utf8'); + } + } catch {} + return response; + }); + } else if (mode === 'replay') { + axios.interceptors.request.use((config) => { + try { + const file = path.join(FIXTURES_DIR, keyFor(config.method || 'GET', config.url, config.data)); + if (fs.existsSync(file)) { + const data = JSON.parse(fs.readFileSync(file, 'utf8')); + console.log(`[fixtures] server replay ${(config.method || 'GET').toUpperCase()} ${config.url}`); + return Promise.reject({ + isAxiosFixture: true, + config, + response: { config, status: 200, statusText: 'OK', headers: { 'content-type': 'application/json' }, data, request: {} }, + }); + } + if (strict) { + console.warn(`[fixtures] server strict-replay missing: ${(config.method || 'GET').toUpperCase()} ${config.url} — blocking network`); + throw new Error(`Strict replay: missing fixture for ${(config.method || 'GET').toUpperCase()} ${config.url}`); + } + } catch {} + return config; + }); + + axios.interceptors.response.use( + (response) => response, + (error) => (error?.isAxiosFixture ? Promise.resolve(error.response) : Promise.reject(error)), + ); + } +} + +module.exports = { installServerAxiosFixtures }; diff --git a/test/tools/server-fetch-fixtures.js b/test/tools/server-fetch-fixtures.js new file mode 100644 index 0000000000..1da5a85bcb --- /dev/null +++ b/test/tools/server-fetch-fixtures.js @@ -0,0 +1,77 @@ +/** + * Server-side fetch() API Fixture System + * + * This module monkey-patches the global fetch() function to record and replay HTTP responses + * for server-side API calls made by Express controllers. It enables deterministic testing + * without requiring live API credentials or network access. + * + * How it works: + * - RECORD MODE (API_MODE=record): Intercepts fetch() calls, executes them normally, and saves + * JSON responses to test/fixtures/ using sanitized URL-based filenames. + * - REPLAY MODE (API_MODE=replay): Intercepts fetch() calls and returns saved fixtures instead + * of making real network requests. Falls back to real fetch if fixture is missing (unless + * API_STRICT_REPLAY=1, which blocks all non-fixture requests). + * + * Installation: This module is automatically installed in test/tools/start-with-memory-db.js + * before the Express app loads, ensuring all server-side fetch calls are intercepted. + * + * Fixture keys: Generated by keyFor() helper, which sanitizes URLs (strips sensitive query + * params like apikey/token) and adds body hashes for POST requests to ensure uniqueness. + * + * See also: server-axios-fixtures.js (same pattern for axios), fixture-helpers.js (shared utilities) + */ + +const fs = require('node:fs'); +const path = require('node:path'); +const { keyFor } = require('./fixture-helpers'); + +const FIXTURES_DIR = path.resolve(__dirname, '..', 'fixtures'); + +function installServerApiFixtures({ mode = process.env.API_MODE } = {}) { + const strict = process.env.API_STRICT_REPLAY === '1'; + + const origFetch = globalThis.fetch; + + if (mode === 'record') { + globalThis.fetch = async (input, init = {}) => { + const res = await origFetch(input, init); + try { + const url = typeof input === 'string' ? input : input.url; + const method = (init.method || 'GET').toUpperCase(); + const ct = (res.headers.get('content-type') || '').toLowerCase(); + if (ct.includes('application/json')) { + const body = await res.clone().text(); + const file = path.join(FIXTURES_DIR, keyFor(method, url, init.body)); + fs.writeFileSync(file, body, 'utf8'); + } + } catch {} + return res; + }; + return; + } + + if (mode === 'replay') { + globalThis.fetch = async (input, init = {}) => { + try { + const url = typeof input === 'string' ? input : input.url; + const method = (init.method || 'GET').toUpperCase(); + const file = path.join(FIXTURES_DIR, keyFor(method, url, init.body)); + if (fs.existsSync(file)) { + const body = fs.readFileSync(file, 'utf8'); + console.log(`[fixtures] server replay ${method} ${url}`); + return new Response(body, { + status: 200, + headers: { 'content-type': 'application/json; charset=utf-8' }, + }); + } + if (strict) { + console.warn(`[fixtures] server strict-replay missing: ${method} ${url} — blocking network`); + throw new Error(`Strict replay: missing fixture for ${method} ${url}`); + } + } catch {} + return origFetch(input, init); + }; + } +} + +module.exports = { installServerApiFixtures }; diff --git a/views/api/foursquare.pug b/views/api/foursquare.pug index ee5bc088e9..989369393a 100644 --- a/views/api/foursquare.pug +++ b/views/api/foursquare.pug @@ -7,56 +7,48 @@ block content | Foursquare API .btn-group.mb-4.d-flex(role='group') - a.btn.btn-primary.w-100(href='https://location.foursquare.com/developer', target='_blank') + a.btn.btn-primary.w-100(href='https://foursquare.com/developer', target='_blank') i.far.fa-check-square.fa-sm.me-2 | Developer Info a.btn.btn-primary.w-100(href='https://docs.foursquare.com/', target='_blank') i.fas.fa-code-branch.fa-sm.me-2 | API Docs - h3.text-primary Trending Venues - p Near longitude: -122.342148, latitude: 47.609657 - table.table.table-striped.table-bordered - thead - tr - th.d-xs - th Name - th.d-xs.d-sm Category - th.d-xs Address - th.d-xs Distance (meters) - th.d-xs Open Now ? - tbody - each venue in trendingVenues + if error + .alert.alert-danger.mt-3 #{ error } + else + h3.text-primary Trending Venues + p Near longitude: -122.342148, latitude: 47.609657 + table.table.table-striped.table-bordered + thead tr - td.d-xs - if venue.categories && venue.categories.length > 0 - img(src=venue.categories[0].icon.prefix + '32' + venue.categories[0].icon.suffix, alt=venue.categories[0].name, width='32', height='32') - else - | N/A - td= venue.name - td.d-xs.d-sm= venue.categories && venue.categories.length > 0 ? venue.categories[0].name : 'N/A' - td.d-xs= venue.location.formatted_address || 'N/A' - td.d-xs= venue.distance - td.d-xs= venue.closed_bucket || 'Unknown' - br - h3.text-primary Venue Details - p - i - u #{ venueDetail.name } - if venueDetail.categories && venueDetail.categories.length > 0 + th.d-xs + th Name + th.d-xs.d-sm Category + th.d-xs Address + th.d-xs Distance (meters) + tbody + each venue in trendingVenues + tr + td.d-xs + if venue.categories && venue.categories.length > 0 + img(src=venue.categories[0].icon.prefix + '32' + venue.categories[0].icon.suffix, alt=venue.categories[0].name, width='32', height='32') + else + | N/A + td= venue.name + td.d-xs.d-sm= venue.categories && venue.categories.length > 0 ? venue.categories[0].name : 'N/A' + td.d-xs= venue.location.formatted_address || 'N/A' + td.d-xs= venue.distance + br + h3.text-primary Venue Details + p + i + u #{ venueDetail.name } + if venueDetail.categories && venueDetail.categories.length > 0 + | + | is a #{ venueDetail.categories[0].name } | - | is a #{ venueDetail.categories[0].name } - | - | located at #{ venueDetail.location.address || 'N/A' }, #{ venueDetail.location.locality || 'N/A' }, #{ venueDetail.location.region || 'N/A' }. (longitude: #{ venueDetail.geocodes.main.longitude }, latitude: #{ venueDetail.geocodes.main.latitude }) - if venueDetail.related_places - if venueDetail.related_places.children && venueDetail.related_places.children.length > 0 - p Related venues or businesses to #{ venueDetail.name }, which are mostly in the same building or the immediate area are: - p(style='margin-left: 20px; white-space: pre-wrap') #{ venueDetail.related_places.children.map(place => place.name).join(', ') } - if venuePhotos && venuePhotos.length > 0 - h4.text-secondary Photo Gallery - | #{ venueDetail.name } - .row - each photo in venuePhotos - .col-md-4 - img.img-thumbnail(src=photo.prefix + '400x400' + photo.suffix, alt=venueDetail.name, width='100%') - else - p No photos available. + | located at #{ venueDetail.location.address || 'N/A' }, #{ venueDetail.location.locality || 'N/A' }, #{ venueDetail.location.region || 'N/A' }. (longitude: #{ venueDetail.longitude }, latitude: #{ venueDetail.latitude }) + if venueDetail.related_places + if venueDetail.related_places.children && venueDetail.related_places.children.length > 0 + p Related venues or businesses to #{ venueDetail.name }, which are mostly in the same building or the immediate area are: + p(style='margin-left: 20px; white-space: pre-wrap') #{ venueDetail.related_places.children.map(place => place.name).join(', ') }