Shops & stores in Santa Pola

From ready-to-wear to souvenirs to take home, Santa Pola brings together 57 shops and stores — a round of addresses for a shopping stroll without the car.

Joyería Rodes

★ 4.9

In central Santa Pola, Joyería Rodes brings together jewellery, watches and accessories, with the reassurance of a long-established business. A place for a gift, a repair or a special piece, among the shopping streets of the town centre.

See on map →

Erredé Joyeros

★ 5.0

In central Santa Pola, Erredé Joyeros brings together jewellery, watches and fine pieces. A place for a gift, an occasion to mark or a treat, with the assurance of a long-established house.

See on map →

Bambú Moda y Complementos

★ 4.4

In central Santa Pola, Bambú Moda y Complementos offers women's clothing and accessories with an eclectic selection. A boutique to fit into a morning of shopping in the heart of the high street.

See on map →

Hempunity CBD

Specialist CBD and vape shop. Wide range of hemp-based products: oils, flowers, cosmetics, e-liquids. Knowledgeable staff.

See on map →

PAPERS

★ 4.7

In central Santa Pola, Papers is a handy stationery shop: school supplies, photocopies and small gifts. Open morning and evening, the address for last-minute needs.

See on map →

Sonidos y Letras

★ 4.0

Well-liked general bookshop in the town centre. Novels, press, comics and children's books available throughout the week.

See on map →

Papelería Guilló

★ 4.8

In central Santa Pola, Papelería Guilló is a neighbourhood stationery shop known for its warm welcome. Supplies, press and everyday services — a town classic.

See on map →

Marvimundo

★ 4.5

In central Santa Pola, on Carrer d'Elx, Marvimundo is a perfumery and cosmetics shop: fragrances, skincare and beauty products at accessible prices. A handy address for a treat or a gift.

See on map →

Perfumarte Santa Pola

★ 5.0

In central Santa Pola, Perfumarte is a perfumery with personalised service and a carefully chosen selection of fragrances and skincare. A reliable address for a scent or a gift.

See on map →

Yainoe

★ 4.6

In central Santa Pola, Yainoe is a welcoming neighbourhood perfumery: fragrances and cosmetics at gentle prices. One to fit into a shopping stroll in the town centre.

See on map →

Torsor Perfumes

★ 5.0

In Gran Alacant, Torsor Perfumes offers a selection of quality fragrances in a pleasant setting. The handy perfumery for local residents.

See on map →

ALE-HOP

★ 4.3

National gift and novelty chain, always full of surprises. Perfect for an unusual souvenir or gift idea.

See on map →

Sin Horas - Pola Shop

★ 4.5

In central Santa Pola, Sin Horas (Pola Shop) is a well-stocked bazaar: Santa Pola souvenirs, beach items and affordable small gifts. Handy for a keepsake or a quick fix.

See on map →

SPARTA SANTA POLA

★ 5.0

In central Santa Pola, Sparta is the collectors' shop: figurines, games, cards and pop culture. A haven for enthusiasts, worth a look for a find or a geeky gift.

See on map →

KAI COAST

★ 5.0

In central Santa Pola, Kai Coast offers souvenirs and gifts with a selection of marine and local items. A lovely spot to take home a keepsake of the coast.

See on map →

samaez

★ 5.0

In central Santa Pola, Samaez is a shop for original gifts: personalised presents and creative items. Worth a look for a gift idea that stands out.

See on map →

Australian Store

★ 4.9

In central Santa Pola, Australian Store goes for summery women's fashion with Australian influences: relaxed style and easy-to-wear pieces. One for a shopping stroll.

See on map →

Estanco Nº2 Santa Pola

★ 4.6

In central Santa Pola, this tobacconist-newsagent brings together cigarettes, newspapers, stamps and phone top-ups. A handy stop with convenient hours.

See on map →

Hempunity CBD SANTA POLA

★ 4.7

In central Santa Pola, Hempunity offers a wide range of hemp products: flowers, oils, cosmetics and e-liquids, with advice on hand. The town's CBD address.

See on map →

Galegobricks

★ 5.0

In central Santa Pola, Galegobricks is the toy and LEGO shop: sets and pieces for all ages. A stop that will delight families and brick lovers.

See on map →

Mimusso Santa Pola

★ 4.8

In central Santa Pola, Mimusso is an inclusive, on-trend women's fashion boutique: clothing designed for all body types, in a welcoming atmosphere.

See on map →

La Casa

★ 4.9

In central Santa Pola, La Casa is a women's fashion boutique with an elegant style and carefully selected collections. A go-to shopping stop in town.

See on map →

Marieta Moda

★ 5.0

In central Santa Pola, Marieta Moda is a local favourite for its colourful outfits, accessories and friendly service. Worth a look for a touch of summer in the wardrobe.

See on map →

Lupita Store

★ 4.8

In central Santa Pola, Lupita Store offers women's clothing and accessories in a summery, relaxed spirit. Just right for dressing the Santa Pola way.

See on map →

40 Grados

★ 4.1

In central Santa Pola, 40 Grados is a popular fashion shop with accessible collections and a relaxed feel. A good bet for everyday looks.

See on map →

Blanco Perla

★ 5.0

In central Santa Pola, Blanco Perla cultivates a clean style and a minimalist women's fashion selection. The address for lovers of understated, quality pieces.

See on map →

Xekeway Moll Santa Pola

★ 4.4

In central Santa Pola, Xekeway offers trendy collections at reasonable prices. A good option for refreshing your wardrobe without overspending.

See on map →

Fresas Moda y Complementos

★ 4.8

In central Santa Pola, Fresas Moda y Complementos goes for colourful outfits and original accessories. The summery spirit of Santa Pola, for a shopping stroll.

See on map →

El Armario De Carlitos

★ 4.5

In central Santa Pola, El Armario de Carlitos offers unisex fashion with original pieces and friendly service. An address for stepping off the beaten track.

See on map →

7 Colores Santa Pola

★ 5.0

In central Santa Pola, 7 Colores dresses children in colourful, cheerful, quality clothing. A delight for the little ones and peace of mind for parents.

See on map →

Koala Bay Santa Pola

★ 5.0

In the heart of Santa Pola's Marina, Koala Bay is the beachwear shop: swimwear, sarongs and beach clothing with a surf-and-lifestyle vibe. Your summer ally.

See on map →

Silvan's

★ 5.0

In central Santa Pola, Silvan's offers refined collections and highly personalised service. The town's more dressed-up women's fashion address.

See on map →

Pola Punt

★ 4.8

In central Santa Pola, Pola Punt specialises in knitwear and delicate textiles. A careful selection for those who like understated elegance.

See on map →

Gallud moda

★ 4.4

In central Santa Pola, Gallud Moda dresses men in classic and casual styles, with attentive service. A good menswear address in town.

See on map →

Moda kids

★ 4.8

In central Santa Pola, Moda Kids offers colourful, practical collections for children at good value. Handy for dressing the little ones.

See on map →

Natalie Piel

★ 4.6

In central Santa Pola, Natalie Piel offers leather footwear and accessories, balancing comfort and style. A lovely selection of seasonal models.

See on map →

Tendencias

★ 4.6

In central Santa Pola, Tendencias follows the season's trends in footwear and accessories, with regularly refreshed collections.

See on map →

Zapateria Atrevida

★ 4.4

In central Santa Pola, Zapatería Atrevida offers bold, original women's footwear. The shop for those who like something different.

See on map →

Raiz

★ 5.0

In central Santa Pola, Raiz combines personalised service, a careful selection and local spirit in footwear and accessories. A lovely town-centre address.

See on map →

Natural Shoes

★ 4.3

Near Playa de Levante, Natural Shoes focuses on comfortable, foot-friendly footwear. Ideal for those who prioritise wellbeing and posture.

See on map →

MIA&ROCK

★ 4.9

In central Santa Pola, Mia&Rock offers trendy footwear with a rock-and-fashion edge, refreshed each season.

See on map →

Sprinter

★ 4.2

Major national sports chain, well stocked with footwear, clothing and equipment for all sports. Regular promotions.

See on map →

Be Urban Running

★ 4.2

Near Playa de Levante, Be Urban Running is the runners' shop: technical footwear, running gear and streetwear, with expert advice. The place to kit up before a run.

See on map →

See also our full interactive guide to Santa Pola.

Choisir la langue
🇫🇷
Français
Santa Pola. Découverte.
🇪🇸
Español
Santa Pola. Descubierta.
🇬🇧
English
Santa Pola. Explored.
(function () { if (window === window.top) return; const allowedParentOrigins = ["https://www.perplexity.ai","https://perplexity.ai","https://testing.perplexity.ai","https://staging.perplexity.ai","https://*.preview.i.perplexity.ai","http://localhost:3000","http://127.0.0.1:3000","http://localhost:5173","http://127.0.0.1:5173"]; const MAX_FONT_BYTES = 500 * 1024; const MAX_TOTAL_FONT_BYTES = 2 * 1024 * 1024; let scrollForwarding = false; let scrollRaf = 0; let trustedTopOrigin = null; // Allow entries like "https://*.preview.i.perplexity.ai" — the wildcard // matches a single DNS label (no dots), so "https://*.foo" cannot stretch // across multiple labels. function matchesAllowedOrigin(origin) { if (!origin) return false; for (const entry of allowedParentOrigins) { if (!entry.includes("*")) { if (entry === origin) return true; continue; } const pattern = new RegExp( "^" + entry.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^.]+") + "$", ); if (pattern.test(origin)) return true; } return false; } // Trust decision: when the sender is same-origin-visible (event.origin is a // real origin like https://www.perplexity.ai) we trust event.origin directly. // When event.origin is "null" (opaque broker srcdoc), we fall back to the // broker's stamped `parentOrigin` to identify the top window. The fallback // is claim-only — we rely on the browser's native `targetOrigin` enforcement // on the response path (see postToTrustedTop) to ensure replies can't be // delivered to anyone but the actual top window of that claimed origin. function getTrustedParentOrigin(event) { const forwardedParentOrigin = typeof event.data.parentOrigin === "string" ? event.data.parentOrigin : null; const parentOrigin = event.origin === "null" ? forwardedParentOrigin : event.origin; return matchesAllowedOrigin(parentOrigin) ? parentOrigin : null; } // All responses go to window.top with targetOrigin = the allowlisted origin. // An attacker that iframes us inside their own null-origin broker can claim // any parentOrigin they like, but the browser will drop the reply whenever // the real top's origin doesn't match — so the screenshot never leaves. function postToTrustedTop(message) { if (!trustedTopOrigin) return; try { window.top.postMessage(message, trustedTopOrigin); } catch (_error) {} } function inlineAll(original, clone) { if (original.nodeType !== 1 || clone.nodeType !== 1) return; try { const computedStyle = getComputedStyle(original); // cssText on a computed style is the serialized declaration in modern // Chromium/Safari — a single read beats enumerating ~400 longhand // properties. Firefox returns "" here, so we fall back on empty. const serialized = computedStyle.cssText; if (serialized) { clone.style.cssText = serialized; } else { const parts = new Array(computedStyle.length); for (let index = 0; index < computedStyle.length; index += 1) { const property = computedStyle[index]; parts[index] = `${property}:${computedStyle.getPropertyValue(property)};`; } clone.style.cssText = parts.join(""); } } catch (_error) {} const originalChildren = original.children; const clonedChildren = clone.children; for ( let index = 0; index < originalChildren.length && index < clonedChildren.length; index += 1 ) { inlineAll(originalChildren[index], clonedChildren[index]); } } function extractFontUrl(srcValue) { const matches = [ ...srcValue.matchAll( /url\(["']?([^"')]+)["']?\)(?:\s*format\(["']?([^"')]+)["']?\))?/gi, ), ]; if (matches.length === 0) return null; const woff2 = matches.find((m) => m[2] && m[2].toLowerCase().includes("woff2")); if (woff2) return woff2[1]; const woff = matches.find((m) => m[2] && m[2].toLowerCase().includes("woff")); if (woff) return woff[1]; return matches[0][1]; } // Cache resolved font URL -> data URI across captures. Fonts on a page // essentially never change, and a batch run emits multiple captures back to // back — without this we'd refetch + re-base64 every time. const fontDataUriCache = new Map(); const SRC_DECLARATION_RE = /src\s*:\s*[^;}]+/i; async function fetchAsDataUri(url) { if (fontDataUriCache.has(url)) return fontDataUriCache.get(url); let dataUri = null; try { const response = await fetch(url, { mode: "cors", credentials: "omit" }); if (response.ok) { const blob = await response.blob(); if (blob.size <= MAX_FONT_BYTES) { dataUri = await new Promise((resolve) => { const reader = new FileReader(); reader.onloadend = () => resolve(typeof reader.result === "string" ? reader.result : null); reader.onerror = () => resolve(null); reader.readAsDataURL(blob); }); } } } catch (_error) { dataUri = null; } fontDataUriCache.set(url, dataUri); return dataUri; } function collectFontFaceRuleTexts() { const rules = []; for (const sheet of document.styleSheets) { let cssRules; try { cssRules = sheet.cssRules; } catch (_error) { continue; } if (!cssRules) continue; for (const rule of cssRules) { const cssText = rule.cssText || ""; if (cssText.startsWith("@font-face")) rules.push(cssText); } } return rules; } async function buildInlinedFontCss() { const ruleTexts = collectFontFaceRuleTexts(); if (ruleTexts.length === 0) return null; const resolved = ruleTexts.map((cssText) => { if (!SRC_DECLARATION_RE.test(cssText)) return null; const srcMatch = cssText.match(/src\s*:\s*([^;}]+)[;}]/i); if (!srcMatch) return null; const url = extractFontUrl(srcMatch[1]); if (!url) return null; try { return { cssText, url: new URL(url, document.baseURI).href }; } catch (_error) { return null; } }); const dataUris = await Promise.all( resolved.map((entry) => (entry ? fetchAsDataUri(entry.url) : Promise.resolve(null))), ); const inlined = []; let totalBytes = 0; for (let index = 0; index < resolved.length; index += 1) { const entry = resolved[index]; const dataUri = dataUris[index]; if (!entry || !dataUri) continue; const approxBytes = dataUri.length * 0.75; if (totalBytes + approxBytes > MAX_TOTAL_FONT_BYTES) break; totalBytes += approxBytes; inlined.push(entry.cssText.replace(SRC_DECLARATION_RE, `src: url("${dataUri}")`)); } return inlined.length > 0 ? inlined.join("\n") : null; } function stripExternal(clone) { const images = clone.querySelectorAll("img"); for (let index = 0; index < images.length; index += 1) { const src = images[index].getAttribute("src"); if (src && !src.startsWith("data:")) images[index].removeAttribute("src"); } const elements = clone.querySelectorAll("*"); for (let index = 0; index < elements.length; index += 1) { const style = elements[index].style.cssText; if (style && style.includes("url(")) { elements[index].style.cssText = style.replace( /url\(["']?(?!data:)[^)"']*["']?\)/gi, "none", ); } } } function emitScroll() { scrollRaf = 0; if (!scrollForwarding) return; postToTrustedTop({ type: "INLINE_EDIT_SCROLL", scrollX: window.scrollX, scrollY: window.scrollY, }); } window.addEventListener( "scroll", function () { if (!scrollForwarding || scrollRaf) return; scrollRaf = requestAnimationFrame(emitScroll); }, { passive: true, capture: true }, ); async function handleCaptureRequest(event) { const requestId = event.data.requestId; const scrollX = window.scrollX; const scrollY = window.scrollY; const width = window.innerWidth; const height = window.innerHeight; function postResult(dataUrl) { postToTrustedTop({ type: "INLINE_EDIT_SCREENSHOT_RESULT", requestId, dataUrl, scrollX, scrollY, }); } try { // Wait for any pending web fonts to resolve so both inline metrics and // the @font-face inlining below see the same loaded faces. if (document.fonts && document.fonts.ready) { try { await document.fonts.ready; } catch (_error) {} } const clone = document.documentElement.cloneNode(true); inlineAll(document.documentElement, clone); const removedNodes = clone.querySelectorAll("script,link[rel=\"stylesheet\"],style"); for (let index = 0; index < removedNodes.length; index += 1) { removedNodes[index].remove(); } stripExternal(clone); // Re-embed web fonts as data-URI @font-face rules so the SVG rasterizer // can resolve them — external font URLs aren't fetched during // foreignObject rendering, which would otherwise force a fallback face // and change text metrics. const inlinedFontCss = await buildInlinedFontCss(); if (inlinedFontCss) { const styleEl = document.createElement("style"); styleEl.textContent = inlinedFontCss; const head = clone.querySelector("head"); if (head) head.appendChild(styleEl); else clone.insertBefore(styleEl, clone.firstChild); } const html = new XMLSerializer().serializeToString(clone); const svg = `` + '' + `
` + `
` + html + "
"; const svgUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`; const image = new Image(); image.onload = function () { const canvas = document.createElement("canvas"); canvas.width = width; canvas.height = height; canvas.getContext("2d").drawImage(image, 0, 0); postResult(canvas.toDataURL("image/png")); }; image.onerror = function () { postResult(null); }; image.src = svgUrl; } catch (_error) { postResult(null); } } window.addEventListener("message", function (event) { if (!event.data) return; // Only accept messages from the direct parent frame. Blocks sibling / // unrelated-window postMessage senders that could otherwise reach us. if (event.source !== window.parent) return; const trustedParentOrigin = getTrustedParentOrigin(event); if (!trustedParentOrigin) return; trustedTopOrigin = trustedParentOrigin; if (event.data.type === "INLINE_EDIT_SCROLL_START") { scrollForwarding = true; emitScroll(); return; } if (event.data.type === "INLINE_EDIT_SCROLL_STOP") { scrollForwarding = false; if (scrollRaf) cancelAnimationFrame(scrollRaf); scrollRaf = 0; return; } if (event.data.type !== "INLINE_EDIT_CAPTURE_REQUEST") return; handleCaptureRequest(event); }); })();