LMAA Public API

Generated from the OpenAPI contract for version 1.1.0.

Public REST API for lmaa.space, a curated directory of independent online shops in Europe. The backend serves this document itself, so it ships with every deployment. Only externally useful public endpoints are listed, and dashboard endpoints, website-internal runtime endpoints, and side-effect endpoints are deliberately excluded.

All documented API responses return JSON wrapped in a { "data": ... } envelope. Errors use { "error": { "message": "..." } }. Rate-limited endpoints allow 100 read requests per minute per IP and include X-RateLimit-* response headers.

Integration guide

Integration essentials

Authentication

The public API needs no authentication. Every endpoint documented here is open, so a plain request without credentials works:

curl https://api.lmaa.space/api/v1/categories

Endpoints that require an account (the dashboard and all write operations) are deliberately left out of this reference.

Requests

All responses are JSON and wrap their payload in a data envelope:

{ "data": { "…": "…" } }

Read the payload from data rather than from the response root, so added top-level fields never break your client.

Errors

Errors use the HTTP status code plus an error object with a human-readable message:

{ "error": { "message": "Shop not found" } }

Treat any non-2xx status as a failure and surface error.message; do not parse the message text itself, as its wording can change.

Rate limits

Read endpoints allow 100 requests per minute per IP address.

Every rate-limited response carries X-RateLimit-* headers with your current allowance. When you exceed it, the API answers with 429 Too Many Requests, so wait for the window to reset before retrying.

Versioning

The API is versioned in the path. Everything documented here lives under /api/v1, and that prefix keeps its current behaviour.

Additive changes (new endpoints, new fields) can land at any time, so ignore unknown fields instead of rejecting them. Breaking changes would ship as a new path prefix.

OpenAPI contract

The public OpenAPI contract is available at /docs/openapi.json.

Public OpenAPI contract, v1.1.0

Loading OpenAPI contract

Shops

Public shop catalogue endpoints.

List Public Shops

GET/api/v1/shopsPublic endpoint

List public shops

Returns all active, publicly listed shops with their categories, shipping regions, public description, social profiles, and like count. Cached for 60 seconds.

Responses

200
Public shop list.
Content-Type:application/jsonResponse Object:ShopListEnvelope
429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/shops"

Get Public Shop

GET/api/v1/shops/{token}Public endpoint

Get one public shop

Returns a single public shop by its URL token, enriched with headquarters data and a short-lived like challenge token.

Parameters

tokenpathRequired
Public token from the lmaa.space URL. This is not the raw numeric shop ID.

Responses

400
Invalid shop token.
Content-Type:application/jsonResponse Object:ErrorEnvelope
404
Shop not found.
Content-Type:application/jsonResponse Object:ErrorEnvelope
429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/shops/{token}"

Categories

Public shop category endpoints.

List Public Categories

GET/api/v1/categoriesPublic endpoint

List public categories

Returns all shop categories with image metadata and the number of public shops assigned to each category. Cached privately for 30 seconds.

Responses

429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/categories"

Get Public Category

GET/api/v1/categories/{slug}Public endpoint

Get category shops

Returns one category and the public shops assigned to it. Use slugs from the category list endpoint.

Parameters

slugpathRequired
URL-safe category slug.

Responses

404
Category not found.
Content-Type:application/jsonResponse Object:ErrorEnvelope
429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/categories/{slug}"

Catalogue search endpoints.

Search Public Catalog

Filters

Location and shipping filter endpoints.

Get Public Filter Options

GET/api/v1/filter-optionsPublic endpoint

List available filter options

Returns currently available filter values derived from public shop headquarters. At the moment this contains countries.

Responses

429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/filter-options"

List Filtered Public Categories

GET/api/v1/filtered/categoriesPublic endpoint

List filtered categories

Returns categories with filtered shop counts plus the total number of shops matching the active filters.

Parameters

cityquery
City name used for distance filtering. When set, radius limits shops around the geocoded city.
radiusquery
Distance radius in kilometres for city filtering.
countryquery
Comma-separated ISO 3166-1 alpha-2 country codes, for example DE,AT.
regionquery
Comma-separated shipping region codes, for example DE,EU.

Responses

429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/filtered/categories"

Get Filtered Public Category

GET/api/v1/filtered/categories/{slug}Public endpoint

Get filtered category shops

Returns one category and only those shops in the category that match the active filters.

Parameters

slugpathRequired
URL-safe category slug.
cityquery
City name used for distance filtering. When set, radius limits shops around the geocoded city.
radiusquery
Distance radius in kilometres for city filtering.
countryquery
Comma-separated ISO 3166-1 alpha-2 country codes, for example DE,AT.
regionquery
Comma-separated shipping region codes, for example DE,EU.

Responses

404
Category not found.
Content-Type:application/jsonResponse Object:ErrorEnvelope
429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/filtered/categories/{slug}"

Search Filtered Public Catalog

List Filtered Public Shops

GET/api/v1/filtered/shopsPublic endpoint

List filtered public shops

Returns public shops filtered by city and radius, headquarters country, and shipping region. Results include latitude and longitude when headquarters coordinates are known.

Parameters

cityquery
City name used for distance filtering. When set, radius limits shops around the geocoded city.
radiusquery
Distance radius in kilometres for city filtering.
countryquery
Comma-separated ISO 3166-1 alpha-2 country codes, for example DE,AT.
regionquery
Comma-separated shipping region codes, for example DE,EU.

Responses

429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/filtered/shops"

Submission Checks

Read-only checks for submission forms.

Check Shop Url

GET/api/v1/check-urlPublic endpoint

Check shop URL availability

Checks whether a shop domain is unknown, blocked by a managed domain alert, already listed, previously rejected, queued for review, or invalid. Domain extraction uses the Public Suffix List via tldts.

Parameters

urlqueryRequired
Shop URL or hostname to check. Missing schemes are accepted by backend normalization.

Responses

200
URL availability result.
Content-Type:application/jsonResponse Object:CheckUrlEnvelope
429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/check-url"

Content

Externally shareable public content endpoints.

Get Public Rejection Notice

GET/api/v1/rejected/{token}Public endpoint

Get public rejection notice

Returns the public rejection notice for a rejected shop or submission. Tokens are 32-character lowercase hex strings.

Parameters

tokenpathRequired
Rejection notice token.

Responses

400
Invalid token format.
Content-Type:application/jsonResponse Object:ErrorEnvelope
404
Rejection notice not found.
Content-Type:application/jsonResponse Object:ErrorEnvelope
429
Rate limit exceeded.
Content-Type:application/jsonResponse Object:ErrorEnvelope

Example request

curl "https://api.lmaa.space/api/v1/rejected/{token}"

Schemas

CategoryDetail

A category together with every public shop filed under it.

KeyKey PresenceValue TypeDescription
idincludedinteger
nameincludedstringDisplay name, unique across all categories.
slugincludedstringURL-safe identifier, and the value the category endpoints expect.
imageUrloptionalstring | nullHeader image of the category, null when none has been chosen.
imagePhotographeroptionalstring | nullName of the photographer, to be displayed wherever the image is shown.
imagePhotographerUrloptionalstring | nullProfile of the photographer, to be linked alongside the credit.
imageFocalPointYoptionalnumberVertical focal point of the header image as a percentage of its height, where 0 is the top edge and 100 the bottom. Use it when cropping the image so the subject stays visible. The horizontal focal point is always centred.
shopCountincludedintegerNumber of public shops in this category, counted per request rather than stored. On the filter endpoints it counts only the shops matching the active filters, so it can be 0.
shopsincludedCategoryShopItem[]The shops, sorted by name.
CategoryDetailEnvelope

One category with its shops.

KeyKey PresenceValue TypeDescription
dataincludedCategoryDetailA category together with every public shop filed under it.
idincludedinteger
nameincludedstringDisplay name, unique across all categories.
slugincludedstringURL-safe identifier, and the value the category endpoints expect.
imageUrloptionalstring | nullHeader image of the category, null when none has been chosen.
imagePhotographeroptionalstring | nullName of the photographer, to be displayed wherever the image is shown.
imagePhotographerUrloptionalstring | nullProfile of the photographer, to be linked alongside the credit.
imageFocalPointYoptionalnumberVertical focal point of the header image as a percentage of its height, where 0 is the top edge and 100 the bottom. Use it when cropping the image so the subject stays visible. The horizontal focal point is always centred.
shopCountincludedintegerNumber of public shops in this category, counted per request rather than stored. On the filter endpoints it counts only the shops matching the active filters, so it can be 0.
shopsincludedCategoryShopItem[]The shops, sorted by name.
CategoryListEnvelope

All categories, sorted by name.

KeyKey PresenceValue TypeDescription
dataincludedCategorySummary[]
CategoryShopItem

A shop inside a category response. Same as the catalogue entry without the category list, which the surrounding response already states, and without the contact address.

KeyKey PresenceValue TypeDescription
idincludedinteger
nameincludedstring
urlincludedstring
regionincludedRegionCode[]
pickupincludedstring
shippingincludedstring
descriptionincludedstring
ogImageoptionalstring | null
socialMediaincludedSocialMediaSocial profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.
applepodcastsoptionalstring | null
mastodonoptionalstring | null
blueskyoptionalstring | null
instagramoptionalstring | null
facebookoptionalstring | null
whatsappoptionalstring | null
signaloptionalstring | null
discordoptionalstring | null
threadsoptionalstring | null
tiktokoptionalstring | null
xoptionalstring | null
youtubeoptionalstring | null
twitchoptionalstring | null
tumblroptionalstring | null
linkedinoptionalstring | null
pinterestoptionalstring | null
patreonoptionalstring | null
mixcloudoptionalstring | null
soundcloudoptionalstring | null
spotifyoptionalstring | null
githuboptionalstring | null
gitlaboptionalstring | null
codebergoptionalstring | null
websiteoptionalstring | null
likeCountincludedinteger
CategorySummary

A category with its artwork and the number of public shops filed under it.

KeyKey PresenceValue TypeDescription
idincludedinteger
nameincludedstringDisplay name, unique across all categories.
slugincludedstringURL-safe identifier, and the value the category endpoints expect.
imageUrloptionalstring | nullHeader image of the category, null when none has been chosen.
imagePhotographeroptionalstring | nullName of the photographer, to be displayed wherever the image is shown.
imagePhotographerUrloptionalstring | nullProfile of the photographer, to be linked alongside the credit.
imageFocalPointYoptionalnumberVertical focal point of the header image as a percentage of its height, where 0 is the top edge and 100 the bottom. Use it when cropping the image so the subject stays visible. The horizontal focal point is always centred.
shopCountincludedintegerNumber of public shops in this category, counted per request rather than stored. On the filter endpoints it counts only the shops matching the active filters, so it can be 0.
CheckUrlEnvelope

What the directory knows about the domain that was checked.

KeyKey PresenceValue TypeDescription
dataincludedCheckUrlResultWhat the directory already knows about a domain. The variants are checked in a fixed order, so a blocked domain is reported as blocked even when a shop for it exists.
CheckUrlResult

What the directory already knows about a domain. The variants are checked in a fixed order, so a blocked domain is reported as blocked even when a shop for it exists.

ErrorEnvelope

Body of every error response. The HTTP status carries the outcome, this envelope carries the explanation.

KeyKey PresenceValue TypeDescription
errorincludedobject
messageincludedstringHuman-readable explanation. Treat it as display text only, because its wording can change at any time. Unexpected server faults are reported as "Internal Server Error" so that internals never leak.
codeoptionalstringStable machine-readable error identifier. Reserved for future use, as no endpoint documented here sets it.
issuesoptionalobject[]Per-field validation failures. Only write endpoints produce these, so no endpoint documented here returns them.
FilterCountry

A country at least one listed shop is based in. Countries without a listed shop never appear.

KeyKey PresenceValue TypeDescription
codeincludedstringISO 3166-1 alpha-2 code in upper case, and the value the country filter expects.
nameincludedstringStored country name. It falls back to the code itself where no name has been recorded, so treat it as a hint and localise from the code when you need a proper label.
FilteredCategoriesEnvelope

Categories with filtered shop counts.

KeyKey PresenceValue TypeDescription
dataincludedFilteredCategoriesResultEvery category with its filtered shop count, plus the overall number of matches.
categoriesincludedCategorySummary[]All categories, including those whose filtered count is 0, sorted by name.
totalShopsincludedintegerNumber of distinct shops matching the filters. This is not the sum of the counts above: a shop in several categories is counted once here but in each of its categories there, and a shop without any category is counted here only.
FilteredCategoriesResult

Every category with its filtered shop count, plus the overall number of matches.

KeyKey PresenceValue TypeDescription
categoriesincludedCategorySummary[]All categories, including those whose filtered count is 0, sorted by name.
totalShopsincludedintegerNumber of distinct shops matching the filters. This is not the sum of the counts above: a shop in several categories is counted once here but in each of its categories there, and a shop without any category is counted here only.
FilteredCategoryDetail

A category together with only those of its shops that match the active filters. The category itself is unaffected by the filters.

KeyKey PresenceValue TypeDescription
idincludedinteger
nameincludedstringDisplay name, unique across all categories.
slugincludedstringURL-safe identifier, and the value the category endpoints expect.
imageUrloptionalstring | nullHeader image of the category, null when none has been chosen.
imagePhotographeroptionalstring | nullName of the photographer, to be displayed wherever the image is shown.
imagePhotographerUrloptionalstring | nullProfile of the photographer, to be linked alongside the credit.
imageFocalPointYoptionalnumberVertical focal point of the header image as a percentage of its height, where 0 is the top edge and 100 the bottom. Use it when cropping the image so the subject stays visible. The horizontal focal point is always centred.
shopCountincludedintegerNumber of public shops in this category, counted per request rather than stored. On the filter endpoints it counts only the shops matching the active filters, so it can be 0.
shopsincludedFilteredShopItem[]The matching shops, sorted by name.
FilteredCategoryDetailEnvelope

One category with the shops matching the active filters.

KeyKey PresenceValue TypeDescription
dataincludedFilteredCategoryDetailA category together with only those of its shops that match the active filters. The category itself is unaffected by the filters.
idincludedinteger
nameincludedstringDisplay name, unique across all categories.
slugincludedstringURL-safe identifier, and the value the category endpoints expect.
imageUrloptionalstring | nullHeader image of the category, null when none has been chosen.
imagePhotographeroptionalstring | nullName of the photographer, to be displayed wherever the image is shown.
imagePhotographerUrloptionalstring | nullProfile of the photographer, to be linked alongside the credit.
imageFocalPointYoptionalnumberVertical focal point of the header image as a percentage of its height, where 0 is the top edge and 100 the bottom. Use it when cropping the image so the subject stays visible. The horizontal focal point is always centred.
shopCountincludedintegerNumber of public shops in this category, counted per request rather than stored. On the filter endpoints it counts only the shops matching the active filters, so it can be 0.
shopsincludedFilteredShopItem[]The matching shops, sorted by name.
FilteredSearchResult

Search results restricted to the active filters. Note that the filters apply to the shops only; the category matches are the same ones an unfiltered search returns.

KeyKey PresenceValue TypeDescription
queryincludedstringThe search term as it was interpreted, trimmed.
totalincludedintegerNumber of items in this response, that is shops plus categories, subject to the same caps of 40 and 5.
shopsincludedRankedFilteredShopItem[]Matching shops within the filters, best match first, at most 40.
categoriesincludedCategorySummary[]Categories whose name contains the term, at most 5, not restricted by the filters.
FilteredSearchResultEnvelope

Search results within the active filters.

KeyKey PresenceValue TypeDescription
dataincludedFilteredSearchResultSearch results restricted to the active filters. Note that the filters apply to the shops only; the category matches are the same ones an unfiltered search returns.
queryincludedstringThe search term as it was interpreted, trimmed.
totalincludedintegerNumber of items in this response, that is shops plus categories, subject to the same caps of 40 and 5.
shopsincludedRankedFilteredShopItem[]Matching shops within the filters, best match first, at most 40.
categoriesincludedCategorySummary[]Categories whose name contains the term, at most 5, not restricted by the filters.
FilteredShopItem

A shop returned by the filter endpoints, carrying the coordinates the map needs.

KeyKey PresenceValue TypeDescription
idincludedintegerNumeric shop identifier. The shop detail endpoint takes the URL token instead, so this is only useful for correlating records.
nameincludedstringShop name. All listings are sorted by it.
urlincludedstringShop homepage, normalised when the shop is submitted: tracking parameters, fragments, a leading www, and a trailing slash are all removed.
categoriesincludedShopCategory[]Categories the shop is filed under. Empty when it has not been categorised yet.
regionincludedRegionCode[]Areas the shop delivers to. Empty when the shop has not declared any.
pickupincludedstringFree-text note about collecting an order in person, written by the operator and usually in German. Frequently an empty string, which means no note rather than no collection.
shippingincludedstringFree-text note about delivery terms, for example a threshold for free shipping. Says nothing about where the shop delivers, which is what region covers. Frequently an empty string.
descriptionincludedstringPublic description of the shop, written in Markdown. May be an empty string.
ogImageoptionalstring | nullPreview image taken from the shop's own website, discovered automatically from its touch icon, Open Graph tag, manifest, or logo. Hosted by the shop rather than by lmaa.space, so it is not guaranteed to stay reachable. Null when nothing suitable was found.
contactEmailoptionalstring | nullPublic contact address of the shop, not the address of whoever submitted it.
socialMediaincludedSocialMediaSocial profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.
applepodcastsoptionalstring | null
mastodonoptionalstring | null
blueskyoptionalstring | null
instagramoptionalstring | null
facebookoptionalstring | null
whatsappoptionalstring | null
signaloptionalstring | null
discordoptionalstring | null
threadsoptionalstring | null
tiktokoptionalstring | null
xoptionalstring | null
youtubeoptionalstring | null
twitchoptionalstring | null
tumblroptionalstring | null
linkedinoptionalstring | null
pinterestoptionalstring | null
patreonoptionalstring | null
mixcloudoptionalstring | null
soundcloudoptionalstring | null
spotifyoptionalstring | null
githuboptionalstring | null
gitlaboptionalstring | null
codebergoptionalstring | null
websiteoptionalstring | null
likeCountincludedintegerNumber of visitors who have liked the shop. A stored counter, kept in step with the like records, and never negative.
latitudeincludednumber | nullLatitude of the shop's registered address in decimal degrees, not of the place searched for. Null when the address is unknown or not yet geocoded.
longitudeincludednumber | nullLongitude of the shop's registered address in decimal degrees.
FilteredShopListEnvelope

Shops matching the active filters, sorted by name.

KeyKey PresenceValue TypeDescription
dataincludedFilteredShopItem[]
FilterOptions

Filter values that are worth offering, derived from the shops currently listed. Delivery regions are a fixed vocabulary and are therefore not part of this response.

KeyKey PresenceValue TypeDescription
countriesincludedFilterCountry[]
FilterOptionsEnvelope

Filter values currently worth offering.

KeyKey PresenceValue TypeDescription
dataincludedFilterOptionsFilter values that are worth offering, derived from the shops currently listed. Delivery regions are a fixed vocabulary and are therefore not part of this response.
countriesincludedFilterCountry[]
Headquarters

Registered address of the shop. The record exists only when a country is known, so every other part may be missing individually while countryCode is always present.

KeyKey PresenceValue TypeDescription
streetincludedstring | null
postalCodeincludedstring | null
cityincludedstring | nullCity name resolved from the geo reference table, null when no city is linked.
stateincludedstring | nullRegion or state name resolved from the geo reference table, null when none is linked.
countryCodeincludedstringISO 3166-1 alpha-2 country code in upper case.
latitudeincludednumber | nullDecimal degrees (WGS 84), null until the address has been geocoded. Used by the radius filter.
longitudeincludednumber | nullDecimal degrees (WGS 84), null until the address has been geocoded.
PublicShopDetail

A single shop with the fields that only the detail endpoint returns, on top of everything in the catalogue listing.

KeyKey PresenceValue TypeDescription
idincludedintegerNumeric shop identifier. The shop detail endpoint takes the URL token instead, so this is only useful for correlating records.
nameincludedstringShop name. All listings are sorted by it.
urlincludedstringShop homepage, normalised when the shop is submitted: tracking parameters, fragments, a leading www, and a trailing slash are all removed.
categoriesincludedShopCategory[]Categories the shop is filed under. Empty when it has not been categorised yet.
regionincludedRegionCode[]Areas the shop delivers to. Empty when the shop has not declared any.
pickupincludedstringFree-text note about collecting an order in person, written by the operator and usually in German. Frequently an empty string, which means no note rather than no collection.
shippingincludedstringFree-text note about delivery terms, for example a threshold for free shipping. Says nothing about where the shop delivers, which is what region covers. Frequently an empty string.
descriptionincludedstringPublic description of the shop, written in Markdown. May be an empty string.
ogImageoptionalstring | nullPreview image taken from the shop's own website, discovered automatically from its touch icon, Open Graph tag, manifest, or logo. Hosted by the shop rather than by lmaa.space, so it is not guaranteed to stay reachable. Null when nothing suitable was found.
contactEmailoptionalstring | nullPublic contact address of the shop, not the address of whoever submitted it.
socialMediaincludedSocialMediaSocial profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.
applepodcastsoptionalstring | null
mastodonoptionalstring | null
blueskyoptionalstring | null
instagramoptionalstring | null
facebookoptionalstring | null
whatsappoptionalstring | null
signaloptionalstring | null
discordoptionalstring | null
threadsoptionalstring | null
tiktokoptionalstring | null
xoptionalstring | null
youtubeoptionalstring | null
twitchoptionalstring | null
tumblroptionalstring | null
linkedinoptionalstring | null
pinterestoptionalstring | null
patreonoptionalstring | null
mixcloudoptionalstring | null
soundcloudoptionalstring | null
spotifyoptionalstring | null
githuboptionalstring | null
gitlaboptionalstring | null
codebergoptionalstring | null
websiteoptionalstring | null
likeCountincludedintegerNumber of visitors who have liked the shop. A stored counter, kept in step with the like records, and never negative.
createdAtincludedstringWhen the shop was added to the directory.
updatedAtincludedstringWhen the shop record last changed for any reason.
headquartersincludedHeadquartersRegistered address of the shop, null when none has been recorded.
likeTokenincludedstringShort-lived challenge for the like endpoint, formatted as signature.timestamp and valid for 30 minutes from the moment this response was produced. It is tied to the shop rather than to a visitor, and a fresh one is issued on every detail request.
PublicShopListItem

A shop as it appears in the public catalogue.

KeyKey PresenceValue TypeDescription
idincludedintegerNumeric shop identifier. The shop detail endpoint takes the URL token instead, so this is only useful for correlating records.
nameincludedstringShop name. All listings are sorted by it.
urlincludedstringShop homepage, normalised when the shop is submitted: tracking parameters, fragments, a leading www, and a trailing slash are all removed.
categoriesincludedShopCategory[]Categories the shop is filed under. Empty when it has not been categorised yet.
regionincludedRegionCode[]Areas the shop delivers to. Empty when the shop has not declared any.
pickupincludedstringFree-text note about collecting an order in person, written by the operator and usually in German. Frequently an empty string, which means no note rather than no collection.
shippingincludedstringFree-text note about delivery terms, for example a threshold for free shipping. Says nothing about where the shop delivers, which is what region covers. Frequently an empty string.
descriptionincludedstringPublic description of the shop, written in Markdown. May be an empty string.
ogImageoptionalstring | nullPreview image taken from the shop's own website, discovered automatically from its touch icon, Open Graph tag, manifest, or logo. Hosted by the shop rather than by lmaa.space, so it is not guaranteed to stay reachable. Null when nothing suitable was found.
contactEmailoptionalstring | nullPublic contact address of the shop, not the address of whoever submitted it.
socialMediaincludedSocialMediaSocial profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.
applepodcastsoptionalstring | null
mastodonoptionalstring | null
blueskyoptionalstring | null
instagramoptionalstring | null
facebookoptionalstring | null
whatsappoptionalstring | null
signaloptionalstring | null
discordoptionalstring | null
threadsoptionalstring | null
tiktokoptionalstring | null
xoptionalstring | null
youtubeoptionalstring | null
twitchoptionalstring | null
tumblroptionalstring | null
linkedinoptionalstring | null
pinterestoptionalstring | null
patreonoptionalstring | null
mixcloudoptionalstring | null
soundcloudoptionalstring | null
spotifyoptionalstring | null
githuboptionalstring | null
gitlaboptionalstring | null
codebergoptionalstring | null
websiteoptionalstring | null
likeCountincludedintegerNumber of visitors who have liked the shop. A stored counter, kept in step with the like records, and never negative.
RankedFilteredShopItem

A search hit within the active filters, ranked the same way as an unfiltered one.

KeyKey PresenceValue TypeDescription
idincludedintegerNumeric shop identifier. The shop detail endpoint takes the URL token instead, so this is only useful for correlating records.
nameincludedstringShop name. All listings are sorted by it.
urlincludedstringShop homepage, normalised when the shop is submitted: tracking parameters, fragments, a leading www, and a trailing slash are all removed.
categoriesincludedShopCategory[]Categories the shop is filed under. Empty when it has not been categorised yet.
regionincludedRegionCode[]Areas the shop delivers to. Empty when the shop has not declared any.
pickupincludedstringFree-text note about collecting an order in person, written by the operator and usually in German. Frequently an empty string, which means no note rather than no collection.
shippingincludedstringFree-text note about delivery terms, for example a threshold for free shipping. Says nothing about where the shop delivers, which is what region covers. Frequently an empty string.
descriptionincludedstringPublic description of the shop, written in Markdown. May be an empty string.
ogImageoptionalstring | nullPreview image taken from the shop's own website, discovered automatically from its touch icon, Open Graph tag, manifest, or logo. Hosted by the shop rather than by lmaa.space, so it is not guaranteed to stay reachable. Null when nothing suitable was found.
contactEmailoptionalstring | nullPublic contact address of the shop, not the address of whoever submitted it.
socialMediaincludedSocialMediaSocial profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.
applepodcastsoptionalstring | null
mastodonoptionalstring | null
blueskyoptionalstring | null
instagramoptionalstring | null
facebookoptionalstring | null
whatsappoptionalstring | null
signaloptionalstring | null
discordoptionalstring | null
threadsoptionalstring | null
tiktokoptionalstring | null
xoptionalstring | null
youtubeoptionalstring | null
twitchoptionalstring | null
tumblroptionalstring | null
linkedinoptionalstring | null
pinterestoptionalstring | null
patreonoptionalstring | null
mixcloudoptionalstring | null
soundcloudoptionalstring | null
spotifyoptionalstring | null
githuboptionalstring | null
gitlaboptionalstring | null
codebergoptionalstring | null
websiteoptionalstring | null
likeCountincludedintegerNumber of visitors who have liked the shop. A stored counter, kept in step with the like records, and never negative.
latitudeincludednumber | nullLatitude of the shop's registered address in decimal degrees, not of the place searched for. Null when the address is unknown or not yet geocoded.
longitudeincludednumber | nullLongitude of the shop's registered address in decimal degrees.
rankincludedintegerMatch class, identical in meaning to the one on RankedShopItem.
RankedShopItem

A search hit, which is a catalogue entry plus the reason it matched.

KeyKey PresenceValue TypeDescription
idincludedintegerNumeric shop identifier. The shop detail endpoint takes the URL token instead, so this is only useful for correlating records.
nameincludedstringShop name. All listings are sorted by it.
urlincludedstringShop homepage, normalised when the shop is submitted: tracking parameters, fragments, a leading www, and a trailing slash are all removed.
categoriesincludedShopCategory[]Categories the shop is filed under. Empty when it has not been categorised yet.
regionincludedRegionCode[]Areas the shop delivers to. Empty when the shop has not declared any.
pickupincludedstringFree-text note about collecting an order in person, written by the operator and usually in German. Frequently an empty string, which means no note rather than no collection.
shippingincludedstringFree-text note about delivery terms, for example a threshold for free shipping. Says nothing about where the shop delivers, which is what region covers. Frequently an empty string.
descriptionincludedstringPublic description of the shop, written in Markdown. May be an empty string.
ogImageoptionalstring | nullPreview image taken from the shop's own website, discovered automatically from its touch icon, Open Graph tag, manifest, or logo. Hosted by the shop rather than by lmaa.space, so it is not guaranteed to stay reachable. Null when nothing suitable was found.
contactEmailoptionalstring | nullPublic contact address of the shop, not the address of whoever submitted it.
socialMediaincludedSocialMediaSocial profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.
applepodcastsoptionalstring | null
mastodonoptionalstring | null
blueskyoptionalstring | null
instagramoptionalstring | null
facebookoptionalstring | null
whatsappoptionalstring | null
signaloptionalstring | null
discordoptionalstring | null
threadsoptionalstring | null
tiktokoptionalstring | null
xoptionalstring | null
youtubeoptionalstring | null
twitchoptionalstring | null
tumblroptionalstring | null
linkedinoptionalstring | null
pinterestoptionalstring | null
patreonoptionalstring | null
mixcloudoptionalstring | null
soundcloudoptionalstring | null
spotifyoptionalstring | null
githuboptionalstring | null
gitlaboptionalstring | null
codebergoptionalstring | null
websiteoptionalstring | null
likeCountincludedintegerNumber of visitors who have liked the shop. A stored counter, kept in step with the like records, and never negative.
rankincludedintegerWhich part of the shop matched, from 1 for the strongest to 6 for the weakest: 1 the name, 2 the URL, 3 the postcode of the registered address, 4 imported shop-check notes, 5 the description, 6 the name of one of its categories. Results are sorted by this value and then by name. It ranks the match, it does not score it.
RegionCode

Area a shop delivers to, not the area it is based in. DE, AT, and CH are the individual countries, EU is Europe, and WORLD is worldwide delivery.

RejectionPage

Public notice explaining why a shop or a submission was turned down. Published so that decisions stay traceable.

KeyKey PresenceValue TypeDescription
shopNameincludedstring
shopUrlincludedstringAddress of the shop concerned.
rejectionLongTextincludedstring | nullThe reasoning that is meant for the public. Internal review notes are never part of this response. Null when the decision was recorded without a public text.
reviewedAtincludedstring | nullWhen the decision was made. For shops that were listed first and turned down later, this is the time of the last change to the record.
RejectionPageEnvelope

A public rejection notice.

KeyKey PresenceValue TypeDescription
dataincludedRejectionPagePublic notice explaining why a shop or a submission was turned down. Published so that decisions stay traceable.
shopNameincludedstring
shopUrlincludedstringAddress of the shop concerned.
rejectionLongTextincludedstring | nullThe reasoning that is meant for the public. Internal review notes are never part of this response. Null when the decision was recorded without a public text.
reviewedAtincludedstring | nullWhen the decision was made. For shops that were listed first and turned down later, this is the time of the last change to the record.
SearchResult

Shops and categories matching a search term.

KeyKey PresenceValue TypeDescription
queryincludedstringThe search term as it was interpreted, trimmed.
totalincludedintegerNumber of items in this response, that is shops plus categories. Both lists are capped, at 40 and 5 respectively, so this is not a count of everything that matches and cannot be used for paging.
shopsincludedRankedShopItem[]Matching shops, best match first, at most 40.
categoriesincludedCategorySummary[]Categories whose name contains the term, at most 5.
SearchResultEnvelope

Search results.

KeyKey PresenceValue TypeDescription
dataincludedSearchResultShops and categories matching a search term.
queryincludedstringThe search term as it was interpreted, trimmed.
totalincludedintegerNumber of items in this response, that is shops plus categories. Both lists are capped, at 40 and 5 respectively, so this is not a count of everything that matches and cannot be used for paging.
shopsincludedRankedShopItem[]Matching shops, best match first, at most 40.
categoriesincludedCategorySummary[]Categories whose name contains the term, at most 5.
ShopCategory

Category reference embedded in a shop payload.

KeyKey PresenceValue TypeDescription
idincludedinteger
slugincludedstringURL-safe identifier, and the value to pass to the category endpoints.
nameincludedstringDisplay name, unique across all categories.
ShopDetailEnvelope

One shop with its details.

KeyKey PresenceValue TypeDescription
dataincludedPublicShopDetailA single shop with the fields that only the detail endpoint returns, on top of everything in the catalogue listing.
idincludedintegerNumeric shop identifier. The shop detail endpoint takes the URL token instead, so this is only useful for correlating records.
nameincludedstringShop name. All listings are sorted by it.
urlincludedstringShop homepage, normalised when the shop is submitted: tracking parameters, fragments, a leading www, and a trailing slash are all removed.
categoriesincludedShopCategory[]Categories the shop is filed under. Empty when it has not been categorised yet.
regionincludedRegionCode[]Areas the shop delivers to. Empty when the shop has not declared any.
pickupincludedstringFree-text note about collecting an order in person, written by the operator and usually in German. Frequently an empty string, which means no note rather than no collection.
shippingincludedstringFree-text note about delivery terms, for example a threshold for free shipping. Says nothing about where the shop delivers, which is what region covers. Frequently an empty string.
descriptionincludedstringPublic description of the shop, written in Markdown. May be an empty string.
ogImageoptionalstring | nullPreview image taken from the shop's own website, discovered automatically from its touch icon, Open Graph tag, manifest, or logo. Hosted by the shop rather than by lmaa.space, so it is not guaranteed to stay reachable. Null when nothing suitable was found.
contactEmailoptionalstring | nullPublic contact address of the shop, not the address of whoever submitted it.
socialMediaincludedSocialMediaSocial profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.
likeCountincludedintegerNumber of visitors who have liked the shop. A stored counter, kept in step with the like records, and never negative.
createdAtincludedstringWhen the shop was added to the directory.
updatedAtincludedstringWhen the shop record last changed for any reason.
headquartersincludedHeadquartersRegistered address of the shop, null when none has been recorded.
likeTokenincludedstringShort-lived challenge for the like endpoint, formatted as signature.timestamp and valid for 30 minutes from the moment this response was produced. It is tied to the shop rather than to a visitor, and a fresh one is issued on every detail request.
ShopListEnvelope

The public shop catalogue, sorted by name.

KeyKey PresenceValue TypeDescription
dataincludedPublicShopListItem[]
SocialMedia

Social profiles of the shop, keyed by platform. Every value is a full canonical profile URL rather than a handle, because handles are expanded when a shop is saved. A shop without any profile yields an empty object.

KeyKey PresenceValue TypeDescription
applepodcastsoptionalstring | null
mastodonoptionalstring | null
blueskyoptionalstring | null
instagramoptionalstring | null
facebookoptionalstring | null
whatsappoptionalstring | null
signaloptionalstring | null
discordoptionalstring | null
threadsoptionalstring | null
tiktokoptionalstring | null
xoptionalstring | null
youtubeoptionalstring | null
twitchoptionalstring | null
tumblroptionalstring | null
linkedinoptionalstring | null
pinterestoptionalstring | null
patreonoptionalstring | null
mixcloudoptionalstring | null
soundcloudoptionalstring | null
spotifyoptionalstring | null
githuboptionalstring | null
gitlaboptionalstring | null
codebergoptionalstring | null
websiteoptionalstring | null

Search API reference

Search ready

Type to search the complete API reference.