# Led Sign 24 Storefront API > API for building storefronts and ecommerce experiences. ## Authentication Session-based via cookie `better-auth.session_token`. Sign in: POST /api/auth/sign-in/email { email, password } Endpoints marked [public] do not require authentication. ## Media ### GET /api/media Retrieve a list of Media [public] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of Media ### GET /api/media/{id} Find a Media by ID [public] Responses: 200: Media object 404: Media not found ## addresses ### GET /api/addresses Retrieve a list of addresses [auth required] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of addresses ### POST /api/addresses Create a new addresses [auth required] Parameters: depth (number, query, optional): locale (string, query, optional): Request body (JSON): customer: string (optional) — ID of the users title: string | null (optional) firstName: string | null (optional) lastName: string | null (optional) company: string | null (optional) addressLine1: string | null (optional) addressLine2: string | null (optional) city: string | null (optional) state: string | null (optional) postalCode: string | null (optional) country: string [enum: US, GB, CA, AU, AT, BE, BR, BG, CY, CZ, DK, EE, FI, FR, DE, GR, HK, HU, IN, IE, IT, JP, LV, LT, LU, MY, MT, MX, NL, NZ, NO, PL, PT, RO, SG, SK, SI, ES, SE, CH] (required) phone: string | null (optional) Responses: 201: addresses object ### GET /api/addresses/{id} Find a addresses by ID [auth required] Responses: 200: addresses object 404: addresses not found ### PATCH /api/addresses/{id} Update a addresses [auth required] Request body (JSON): customer: string (optional) — ID of the users title: string | null (optional) firstName: string | null (optional) lastName: string | null (optional) company: string | null (optional) addressLine1: string | null (optional) addressLine2: string | null (optional) city: string | null (optional) state: string | null (optional) postalCode: string | null (optional) country: string [enum: US, GB, CA, AU, AT, BE, BR, BG, CY, CZ, DK, EE, FI, FR, DE, GR, HK, HU, IN, IE, IT, JP, LV, LT, LU, MY, MT, MX, NL, NZ, NO, PL, PT, RO, SG, SK, SI, ES, SE, CH] (optional) phone: string | null (optional) Responses: 200: addresses object 404: addresses not found ### DELETE /api/addresses/{id} Delete a addresses [auth required] Responses: 200: addresses object 404: addresses not found ## variants ### GET /api/variants Retrieve a list of variants [public] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of variants ### GET /api/variants/{id} Find a variants by ID [public] Responses: 200: variants object 404: variants not found ## variantTypes ### GET /api/variantTypes Retrieve a list of variantTypes [public] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of variantTypes ### GET /api/variantTypes/{id} Find a variantTypes by ID [public] Responses: 200: variantTypes object 404: variantTypes not found ## variantOptions ### GET /api/variantOptions Retrieve a list of variantOptions [public] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of variantOptions ### GET /api/variantOptions/{id} Find a variantOptions by ID [public] Responses: 200: variantOptions object 404: variantOptions not found ## products ### GET /api/products Retrieve a list of products [public] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of products ### GET /api/products/{id} Find a products by ID [public] Responses: 200: products object 404: products not found ## carts ### GET /api/carts Retrieve a list of carts [auth required] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of carts ### POST /api/carts Create a new carts [auth required] Parameters: depth (number, query, optional): locale (string, query, optional): Request body (JSON): items: array | null (optional) secret: string | null (optional) customer: string (optional) — ID of the users purchasedAt: string | null (optional) status: string | null [enum: active, purchased, abandoned] (optional) subtotal: number | null (optional) currency: string | null [enum: USD] (optional) discountCode: string | null (optional) — Applied discount code for this cart Responses: 201: carts object ### GET /api/carts/{id} Find a carts by ID [auth required] Responses: 200: carts object 404: carts not found ### PATCH /api/carts/{id} Update a carts [auth required] Request body (JSON): items: array | null (optional) secret: string | null (optional) customer: string (optional) — ID of the users purchasedAt: string | null (optional) status: string | null [enum: active, purchased, abandoned] (optional) subtotal: number | null (optional) currency: string | null [enum: USD] (optional) discountCode: string | null (optional) — Applied discount code for this cart Responses: 200: carts object 404: carts not found ### DELETE /api/carts/{id} Delete a carts [auth required] Responses: 200: carts object 404: carts not found ## orders ### GET /api/orders Retrieve a list of orders [auth required] Parameters: page (number, query, optional): limit (number, query, optional): depth (number, query, optional): locale (string, query, optional): fallback-locale (string, query, optional): sort (string, query, optional): where (string, query, optional): Responses: 200: List of orders ### GET /api/orders/{id} Find a orders by ID [auth required] Responses: 200: orders object 404: orders not found ## Contact ### POST /api/contact Submit contact form [public] Accepts a contact form submission, stores it in the Payload CMS `contact-form-submissions` collection and emails a notification to the Led Sign 24 inbox (reply-to is the sender). No authentication is required. Rate limited to 5 submissions per minute per client. Request body (JSON): name: string [min: 1, max: 150, pattern: ^[\p{L}\p{N}\s\-'.]+$] (required) — Full name of the person submitting the form (e.g. "Jane Doe") email: string [min: 5, max: 320, format: email] (required) — Contact email address (e.g. "jane@example.com") subject: string [min: 1, max: 200] (required) — Subject line for the contact message (e.g. "Partnership inquiry") message: string [min: 1, max: 5000] (required) — Body of the contact message (e.g. "Hi, I would love to discuss a potential partnership. Please let me know a good time to connect.") Responses: 201: Contact form submitted successfully 400: Validation error — missing or invalid fields 429: Too many contact submissions from this client 500: Internal server error Dashboard: Payload Admin > Contact Form Submissions ## Documentation ### GET /api/openapi.json OpenAPI 3.1 specification (JSON) [public] Returns this API's full OpenAPI 3.1 specification as JSON. Use this to generate client SDKs, import into API tools (Postman, Insomnia), or power interactive documentation UIs. Responses: 200: OpenAPI 3.1 JSON specification ### GET /llms.txt LLM-friendly API reference (plain text) [public] Returns the full API reference as structured plain text optimized for LLM context windows. Use this to feed API documentation into AI assistants, chatbots, or code generators. Responses: 200: Plain-text API reference ### GET /to-humans.md Human-readable API reference (Markdown) [public] Returns the full API reference as a Markdown document with table of contents, request/response tables, cURL examples, and error reference. Suitable for rendering in documentation sites or reading directly. Responses: 200: Markdown API reference