{
  "openapi": "3.1.0",
  "info": {
    "title": "Wash Bodega public APIs",
    "version": "1.3.0",
    "description": "Machine-readable descriptions of Wash Bodega's approved public read-only resources. These endpoints are not an agent registration, outreach, form-submission, customer-account, booking, or payment API. Human forms and every state-changing endpoint are intentionally excluded."
  },
  "servers": [
    {
      "url": "https://washbodega.com"
    }
  ],
  "paths": {
    "/business-info.json": {
      "get": {
        "summary": "Verified public business profile",
        "description": "NAP, scoped 24/7 store customer-access hours, services, and legal links. This is a public fact file, not a live machine inventory.",
        "operationId": "getBusinessInfo",
        "responses": {
          "200": {
            "description": "Verified public business profile",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "x-washbodega-access": {
          "paymentRequired": false,
          "amountMinor": "0",
          "currency": "USD",
          "description": {
            "en": "Public discovery is free. This operation does not collect payment.",
            "es": "La consulta pública es gratis. Esta operación no cobra pagos."
          }
        }
      }
    },
    "/service-info.json": {
      "get": {
        "summary": "Bilingual Wash & Fold and pickup/delivery service contract",
        "description": "Public pricing, turnaround, scoped hours, service-area qualification status, evidence freshness, and human-controlled Cents handoff. This endpoint does not accept personal data or create bookings.",
        "operationId": "getServiceInfo",
        "responses": {
          "200": {
            "description": "Public service contract",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicServiceContract"
                }
              }
            }
          }
        },
        "x-washbodega-access": {
          "paymentRequired": false,
          "amountMinor": "0",
          "currency": "USD",
          "description": {
            "en": "Public discovery is free. This operation does not collect payment.",
            "es": "La consulta pública es gratis. Esta operación no cobra pagos."
          }
        },
        "x-payment-info": {
          "intent": "human-booking",
          "method": "https://app.trycents.com/new-order/Yzl1",
          "amount": "1.69",
          "currency": "USD",
          "description": "Pickup and delivery is 1.69 USD per pound after staff weigh the laundry, with a 15 lb minimum. Humans book at the Cents handoff. This descriptor does not capture a card and does not mark an order paid. Agents have no billing authority and no financial tokens."
        }
      }
    },
    "/api/public-deals": {
      "get": {
        "summary": "Public deals snapshot",
        "description": "PII-free list of currently claimable public website deals. Does not include customer, card, or consent records.",
        "operationId": "getPublicDeals",
        "responses": {
          "200": {
            "description": "Public deals",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicDealsResponse"
                }
              }
            }
          },
          "503": {
            "description": "Deals unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PublicDealsResponse"
                }
              }
            }
          }
        },
        "x-washbodega-access": {
          "paymentRequired": false,
          "amountMinor": "0",
          "currency": "USD",
          "description": {
            "en": "Public discovery is free. This operation does not collect payment.",
            "es": "La consulta pública es gratis. Esta operación no cobra pagos."
          }
        }
      }
    },
    "/catalog/acp": {
      "get": {
        "summary": "Bilingual read-only Product JSONL export",
        "description": "One public product snapshot in English or Spanish. Compatible Product data only; no ACP Feed API, checkout, order, reservation or payment operation.",
        "operationId": "getPublicProductCatalog",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "One language value only. Unknown, repeated, empty or extra query parameters are rejected.",
            "schema": {
              "type": "string",
              "enum": [
                "en",
                "es"
              ],
              "default": "en"
            }
          }
        ],
        "x-washbodega-access": {
          "paymentRequired": false,
          "amountMinor": "0",
          "currency": "USD",
          "description": {
            "en": "The public catalog download is free.",
            "es": "La descarga del catálogo público es gratis."
          }
        },
        "responses": {
          "200": {
            "description": "Public Product JSONL snapshot. Empty when the canonical pickup service is disabled; not inventory or date availability.",
            "headers": {
              "Content-Language": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "en",
                    "es"
                  ]
                }
              }
            },
            "content": {
              "application/x-ndjson": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Invalid language, repeated language or unsupported query parameter; empty body, no-store."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "PublicServiceContract": {
        "type": "object",
        "required": [
          "schemaVersion",
          "kind",
          "canonicalUrl",
          "languages",
          "location",
          "storeAccess",
          "services",
          "safety",
          "evidenceFreshness"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "const": "washbodega.public-service-contract"
          },
          "canonicalUrl": {
            "type": "string",
            "format": "uri"
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "en-US",
                "es-US"
              ]
            }
          },
          "location": {
            "type": "object",
            "additionalProperties": true
          },
          "storeAccess": {
            "type": "object",
            "additionalProperties": true
          },
          "services": {
            "type": "object",
            "required": [
              "wash-fold",
              "pickup-delivery"
            ],
            "properties": {
              "wash-fold": {
                "type": "object",
                "additionalProperties": true
              },
              "pickup-delivery": {
                "type": "object",
                "additionalProperties": true
              }
            },
            "additionalProperties": false
          },
          "safety": {
            "type": "object",
            "additionalProperties": true
          },
          "evidenceFreshness": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "additionalProperties": true
      },
      "PublicDealsResponse": {
        "type": "object",
        "required": [
          "ok",
          "serverTime",
          "deals"
        ],
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "serverTime": {
            "type": "string"
          },
          "deals": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "configurationVersion",
                "endsAt",
                "claimExperience"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "configurationVersion": {
                  "type": "string"
                },
                "endsAt": {
                  "type": "string"
                },
                "claimExperience": {
                  "type": "string",
                  "enum": [
                    "account",
                    "legacy"
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  "x-washbodega-commerce": {
    "kind": "washbodega.public-commerce-policy",
    "languages": [
      "en",
      "es"
    ],
    "protocols": {
      "acpCheckout": false,
      "acpFeedApi": false,
      "ap2": false,
      "mpp": false,
      "x402": false
    },
    "catalog": {
      "en": "https://washbodega.com/catalog/acp?lang=en",
      "es": "https://washbodega.com/catalog/acp?lang=es",
      "scope": "product-jsonl-export-only",
      "productSchemaVersion": "2026-04-17"
    },
    "pricing": {
      "pickup": "https://washbodega.com/service-info.json#/services/pickup-delivery/pricing",
      "inStore": "https://washbodega.com/service-info.json#/services/wash-fold/pricing"
    },
    "handoff": {
      "publicScheduling": "https://app.trycents.com/new-order/Yzl1",
      "localAgentPickup": {
        "en": "https://washbodega.com/account",
        "es": "https://washbodega.com/cuenta",
        "customerApprovalRequired": true,
        "billingTiming": "after-staff-weighing",
        "agentBillingAuthority": false,
        "agentFinancialTokens": false,
        "policy": {
          "en": "For local agent-assisted pickups only, staff weigh the laundry before the final amount. The signed-in customer personally approves hosted Stripe checkout. Staff manually enter and reconcile the order in Cents without a second charge. New intake is for tomorrow in America/Chicago; staff confirm route and availability.",
          "es": "Solo para recogidas locales solicitadas con un agente, el personal pesa la ropa antes de fijar el importe final. El cliente aprueba personalmente el pago alojado de Stripe tras iniciar sesión. El personal registra y concilia manualmente el pedido en Cents sin cobrarlo de nuevo. Las nuevas solicitudes son para mañana en America/Chicago; el personal confirma la ruta y disponibilidad."
        }
      }
    },
    "disclaimer": {
      "en": "The service-info descriptor publishes the per-pound pickup rate for human booking. It is not ACP checkout, an ACP feed API, an AP2 mandate, an MPP charge, or an x402 capture. Information and intake are free; an agent cannot charge, obtain financial tokens, or approve payment for a customer.",
      "es": "El descriptor de service-info publica la tarifa de recogida por libra para la reserva humana. No es un pago ACP, una API de feed ACP, un mandato AP2, un cobro MPP ni una captura x402. La información y la solicitud inicial son gratis; un agente no puede cobrar, obtener tokens financieros ni aprobar un pago por el cliente."
    }
  }
}
