openapi: 3.1.0
info:
  title: Francione Design Group Public API
  version: 1.0.0
  description: Read-only public API for Francione Design Group — Jersey Shore
    hardscaping, outdoor living, and landscape design. Use these endpoints when
    an agent or integration needs structured company, service, project, or
    location data.
  contact:
    name: Francione Design Group
    email: francionedesigngroup@gmail.com
    url: https://www.francionedesigngroup.com/contact
servers:
  - url: https://www.francionedesigngroup.com/api/v1
    description: Production
tags:
  - name: Services
    description: Hardscaping and landscape design services
  - name: Projects
    description: Completed project portfolio
  - name: Locations
    description: Jersey Shore service area towns
  - name: Contact
    description: Business contact information
paths:
  /services:
    get:
      operationId: listServices
      summary: List all services
      description: Returns hardscaping, outdoor living, and landscape design services
        offered by Francione Design Group.
      tags:
        - Services
      responses:
        "200":
          description: Service list
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ServiceSummary"
        "405":
          description: Method not allowed
          content:
            application/json:
              schema: &a1
                type: object
                required:
                  - error
                properties:
                  error:
                    type: object
                    required:
                      - code
                      - message
                      - resolution
                    properties:
                      code:
                        type: string
                        enum:
                          - NOT_FOUND
                          - BAD_REQUEST
                          - METHOD_NOT_ALLOWED
                          - INTERNAL_ERROR
                          - UNAUTHORIZED
                      message:
                        type: string
                      resolution:
                        type: string
                      path:
                        type: string
  /services/{slug}:
    get:
      operationId: getServiceBySlug
      summary: Get a service by slug
      description: Returns detailed information for a single service such as
        hardscaping-outdoor-living or landscape-design.
      tags:
        - Services
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
          description: Service slug
      responses:
        "200":
          description: Service detail
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ServiceDetail"
        "404":
          description: Service not found
          content:
            application/json:
              schema: *a1
  /projects:
    get:
      operationId: listProjects
      summary: List all live projects
      description: Returns the public project gallery for Francione Design Group.
      tags:
        - Projects
      responses:
        "200":
          description: Project list
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/ProjectSummary"
  /projects/{slug}:
    get:
      operationId: getProjectBySlug
      summary: Get a project by slug
      description: Returns one completed hardscaping or landscape project.
      tags:
        - Projects
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Project detail
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ProjectDetail"
        "404":
          description: Project not found
          content:
            application/json:
              schema: *a1
  /locations:
    get:
      operationId: listLocations
      summary: List service area towns
      description: Returns Jersey Shore towns served by Francione Design Group across
        Monmouth and Ocean Counties.
      tags:
        - Locations
      parameters:
        - name: county
          in: query
          required: false
          schema:
            type: string
          description: Filter by county name
      responses:
        "200":
          description: Location list
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/LocationSummary"
  /locations/{slug}:
    get:
      operationId: getLocationBySlug
      summary: Get a service area town by slug
      description: Returns hardscaping service information for a specific Jersey Shore town.
      tags:
        - Locations
      parameters:
        - name: slug
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: Location detail
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/LocationDetail"
        "404":
          description: Location not found
          content:
            application/json:
              schema: *a1
  /contact:
    get:
      operationId: getContactInfo
      summary: Get business contact information
      description: Returns phone, email, service area, and inquiry URLs for Francione
        Design Group.
      tags:
        - Contact
      responses:
        "200":
          description: Contact information
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: "#/components/schemas/ContactInfo"
components:
  schemas:
    ServiceSummary:
      type: object
      required:
        - slug
        - title
        - description
        - href
      properties:
        slug:
          type: string
        title:
          type: string
        description:
          type: string
        href:
          type: string
    ServiceDetail:
      allOf:
        - $ref: "#/components/schemas/ServiceSummary"
        - type: object
          properties:
            summary:
              type: string
            sections:
              type: array
              items:
                type: object
                properties:
                  heading:
                    type: string
                  intro:
                    type: string
    ProjectSummary:
      type: object
      required:
        - slug
        - title
        - description
        - href
        - image
      properties:
        slug:
          type: string
        title:
          type: string
        description:
          type: string
        href:
          type: string
        image:
          type: string
        location:
          type: string
    ProjectDetail:
      allOf:
        - $ref: "#/components/schemas/ProjectSummary"
        - type: object
          properties:
            summary:
              type: string
            about:
              type: object
    LocationSummary:
      type: object
      required:
        - slug
        - town
        - county
        - href
      properties:
        slug:
          type: string
        town:
          type: string
        county:
          type: string
        href:
          type: string
        metaDescription:
          type: string
    LocationDetail:
      allOf:
        - $ref: "#/components/schemas/LocationSummary"
        - type: object
          properties:
            h1Title:
              type: string
            serviceSection:
              type: object
    ContactInfo:
      type: object
      required:
        - name
        - phone
        - email
        - location
        - contactUrl
      properties:
        name:
          type: string
        phone:
          type: string
        email:
          type: string
        location:
          type: string
        license:
          type: string
        contactUrl:
          type: string
          format: uri
        inquiryFormUrl:
          type: string
          format: uri
