{
  "openapi": "3.1.0",
  "info": {
    "title": "Otter Wise Talent Solutions public API",
    "version": "1.0.0",
    "summary": "Read-only JSON describing Otter Wise Talent Solutions, its services, pricing and contact channels.",
    "description": "A public, unauthenticated, GET-only API published by Otter Wise Talent Solutions Inc. so that developers and AI agents can read the organization profile, service pillars, job board packages and contact channels without scraping the website. Responses are static JSON documents served from a CDN and are safe to cache.",
    "contact": {
      "name": "Otter Wise Talent Solutions",
      "email": "sales@owts.ca",
      "url": "https://owts.ca/developers"
    },
    "license": {
      "name": "Public data, no reuse restrictions",
      "identifier": "CC0-1.0"
    }
  },
  "servers": [
    {
      "url": "https://owts.ca",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Developer and agent resources",
    "url": "https://owts.ca/developers"
  },
  "tags": [
    {
      "name": "discovery",
      "description": "Finding the available resources."
    },
    {
      "name": "organization",
      "description": "Who Otter Wise is and how to reach it."
    },
    {
      "name": "catalog",
      "description": "Services and packages Otter Wise offers."
    }
  ],
  "paths": {
    "/api/v1/index.json": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "List the available API resources",
        "description": "Returns the machine-readable index of every public Otter Wise resource, including the OpenAPI document and the markdown mirrors. Start here when discovering the API.",
        "tags": [
          "discovery"
        ],
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "List the available API resources",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "404": {
            "description": "No resource exists at the requested path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": {
                    "code": "resource_not_found",
                    "message": "No Otter Wise API resource exists at the requested path.",
                    "resolution": "Fetch /api/v1/index.json for the list of available resources.",
                    "documentation_url": "https://owts.ca/developers",
                    "status": 404
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/organization.json": {
      "get": {
        "operationId": "getOrganization",
        "summary": "Get the Otter Wise organization profile",
        "description": "Returns the legal name, description, contact channels, office addresses, service area, and related sites for Otter Wise Talent Solutions Inc. Use this to verify the business and to answer contact questions.",
        "tags": [
          "organization"
        ],
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Get the Otter Wise organization profile",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Organization"
                }
              }
            }
          },
          "404": {
            "description": "No resource exists at the requested path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": {
                    "code": "resource_not_found",
                    "message": "No Otter Wise API resource exists at the requested path.",
                    "resolution": "Fetch /api/v1/index.json for the list of available resources.",
                    "documentation_url": "https://owts.ca/developers",
                    "status": 404
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/services.json": {
      "get": {
        "operationId": "listServices",
        "summary": "List the workforce service pillars",
        "description": "Returns the five Otter Wise service pillars with their identifiers, summaries, descriptions and capability lists, plus the industries served. Use this to decide whether Otter Wise covers a given workforce need.",
        "tags": [
          "catalog"
        ],
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "List the workforce service pillars",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceList"
                }
              }
            }
          },
          "404": {
            "description": "No resource exists at the requested path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": {
                    "code": "resource_not_found",
                    "message": "No Otter Wise API resource exists at the requested path.",
                    "resolution": "Fetch /api/v1/index.json for the list of available resources.",
                    "documentation_url": "https://owts.ca/developers",
                    "status": 404
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/pricing.json": {
      "get": {
        "operationId": "listPricingPlans",
        "summary": "List the job board pricing packages",
        "description": "Returns the published job board packages with billing period, inclusions and the URL to start each one. Prices are quoted per engagement, so priceAvailability reports contact-for-pricing rather than an amount.",
        "tags": [
          "catalog"
        ],
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "List the job board pricing packages",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PricingPlanList"
                }
              }
            }
          },
          "404": {
            "description": "No resource exists at the requested path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": {
                    "code": "resource_not_found",
                    "message": "No Otter Wise API resource exists at the requested path.",
                    "resolution": "Fetch /api/v1/index.json for the list of available resources.",
                    "documentation_url": "https://owts.ca/developers",
                    "status": 404
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/contact.json": {
      "get": {
        "operationId": "getContactChannels",
        "summary": "Get the contact channels and offices",
        "description": "Returns the email address, phone number, contact form URL, office addresses and the topics Otter Wise handles, so an agent can route a request to the right channel.",
        "tags": [
          "organization"
        ],
        "security": [],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Get the contact channels and offices",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactChannels"
                }
              }
            }
          },
          "404": {
            "description": "No resource exists at the requested path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": {
                    "code": "resource_not_found",
                    "message": "No Otter Wise API resource exists at the requested path.",
                    "resolution": "Fetch /api/v1/index.json for the list of available resources.",
                    "documentation_url": "https://owts.ca/developers",
                    "status": 404
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Structured error body returned for any unknown path under /api.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "description": "Details of the failure.",
            "required": [
              "code",
              "message",
              "resolution"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable error code."
              },
              "message": {
                "type": "string",
                "description": "Human-readable description of what went wrong."
              },
              "resolution": {
                "type": "string",
                "description": "Concrete next step that resolves the error."
              },
              "documentation_url": {
                "type": "string",
                "format": "uri",
                "description": "Where the API is documented."
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code of the response."
              }
            }
          }
        }
      },
      "Office": {
        "type": "object",
        "description": "A physical Otter Wise office.",
        "required": [
          "id",
          "street_address",
          "locality",
          "region",
          "postal_code",
          "country"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable identifier for the office."
          },
          "label": {
            "type": "string",
            "description": "Human-readable name of the office."
          },
          "street_address": {
            "type": "string",
            "description": "Street address line."
          },
          "locality": {
            "type": "string",
            "description": "City or town."
          },
          "region": {
            "type": "string",
            "description": "Province or state code."
          },
          "postal_code": {
            "type": "string",
            "description": "Postal or ZIP code."
          },
          "country": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country code."
          }
        }
      },
      "Organization": {
        "type": "object",
        "description": "Identity, contact channels and offices of Otter Wise Talent Solutions Inc.",
        "required": [
          "legal_name",
          "name",
          "description",
          "url",
          "email",
          "telephone",
          "offices"
        ],
        "properties": {
          "legal_name": {
            "type": "string",
            "description": "Registered legal name."
          },
          "name": {
            "type": "string",
            "description": "Trading name."
          },
          "alternate_names": {
            "type": "array",
            "description": "Other names the business is known by.",
            "items": {
              "type": "string"
            }
          },
          "description": {
            "type": "string",
            "description": "One-paragraph description of the business."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical website."
          },
          "logo_url": {
            "type": "string",
            "format": "uri",
            "description": "Logo image."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "General sales email address."
          },
          "telephone": {
            "type": "string",
            "description": "Main phone number in E.164-like format."
          },
          "area_served": {
            "type": "array",
            "description": "ISO 3166-1 alpha-2 codes of the countries served.",
            "items": {
              "type": "string"
            }
          },
          "member_of": {
            "type": "array",
            "description": "Industry bodies the business belongs to.",
            "items": {
              "type": "string"
            }
          },
          "offices": {
            "type": "array",
            "description": "Physical offices.",
            "items": {
              "$ref": "#/components/schemas/Office"
            }
          },
          "related_sites": {
            "type": "array",
            "description": "Other Otter Wise properties, such as the job board.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Name of the property."
                },
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Address of the property."
                }
              }
            }
          },
          "documentation_url": {
            "type": "string",
            "format": "uri",
            "description": "Developer documentation."
          },
          "updated": {
            "type": "string",
            "format": "date",
            "description": "Date this document was last generated."
          }
        }
      },
      "Service": {
        "type": "object",
        "description": "One Otter Wise service pillar.",
        "required": [
          "id",
          "name",
          "summary",
          "description",
          "capabilities",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable identifier, also the anchor on the services page."
          },
          "name": {
            "type": "string",
            "description": "Name of the service pillar."
          },
          "summary": {
            "type": "string",
            "description": "One-line positioning statement."
          },
          "description": {
            "type": "string",
            "description": "Paragraph describing what the pillar delivers."
          },
          "capabilities": {
            "type": "array",
            "description": "Concrete capabilities included in the pillar.",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Page section describing the pillar."
          }
        }
      },
      "ServiceList": {
        "type": "object",
        "description": "All Otter Wise service pillars, plus the roles and industries supported.",
        "required": [
          "count",
          "services"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of service pillars returned."
          },
          "services": {
            "type": "array",
            "description": "The service pillars.",
            "items": {
              "$ref": "#/components/schemas/Service"
            }
          },
          "recruitment_capabilities": {
            "type": "array",
            "description": "Categories of roles Otter Wise recruits for.",
            "items": {
              "type": "string"
            }
          },
          "industries": {
            "type": "array",
            "description": "Industries Otter Wise supports.",
            "items": {
              "type": "string"
            }
          },
          "documentation_url": {
            "type": "string",
            "format": "uri",
            "description": "Developer documentation."
          },
          "updated": {
            "type": "string",
            "format": "date",
            "description": "Date this document was last generated."
          }
        }
      },
      "PricingPlan": {
        "type": "object",
        "description": "One published job board package.",
        "required": [
          "id",
          "name",
          "description",
          "billing_period",
          "price_availability",
          "includes",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable identifier for the package."
          },
          "name": {
            "type": "string",
            "description": "Name of the package."
          },
          "description": {
            "type": "string",
            "description": "Who the package suits."
          },
          "billing_period": {
            "type": "string",
            "description": "ISO 8601 duration of the billing period, or \"one-time\" for a single purchase."
          },
          "price_availability": {
            "type": "string",
            "enum": [
              "contact-for-pricing"
            ],
            "description": "How the price is obtained. Otter Wise quotes per engagement rather than publishing amounts."
          },
          "includes": {
            "type": "array",
            "description": "What the package includes.",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Where to start this package."
          }
        }
      },
      "PricingPlanList": {
        "type": "object",
        "description": "The published job board packages.",
        "required": [
          "count",
          "plans"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of packages returned."
          },
          "currency": {
            "type": "string",
            "description": "ISO 4217 currency quotes are issued in."
          },
          "note": {
            "type": "string",
            "description": "How pricing is handled."
          },
          "plans": {
            "type": "array",
            "description": "The packages.",
            "items": {
              "$ref": "#/components/schemas/PricingPlan"
            }
          },
          "documentation_url": {
            "type": "string",
            "format": "uri",
            "description": "Developer documentation."
          },
          "updated": {
            "type": "string",
            "format": "date",
            "description": "Date this document was last generated."
          }
        }
      },
      "ContactChannels": {
        "type": "object",
        "description": "How to reach Otter Wise and what the team handles.",
        "required": [
          "email",
          "telephone",
          "contact_form_url",
          "offices",
          "topics"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "description": "General sales email address."
          },
          "telephone": {
            "type": "string",
            "description": "Main phone number."
          },
          "contact_form_url": {
            "type": "string",
            "format": "uri",
            "description": "Web contact form."
          },
          "offices": {
            "type": "array",
            "description": "Physical offices.",
            "items": {
              "$ref": "#/components/schemas/Office"
            }
          },
          "topics": {
            "type": "array",
            "description": "Kinds of enquiry the team handles.",
            "items": {
              "type": "string"
            }
          },
          "documentation_url": {
            "type": "string",
            "format": "uri",
            "description": "Developer documentation."
          },
          "updated": {
            "type": "string",
            "format": "date",
            "description": "Date this document was last generated."
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "description": "Entry point listing every public resource.",
        "required": [
          "name",
          "version",
          "description",
          "resources"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the API."
          },
          "version": {
            "type": "string",
            "description": "Semantic version of the published payloads."
          },
          "description": {
            "type": "string",
            "description": "What the API covers."
          },
          "openapi_url": {
            "type": "string",
            "format": "uri",
            "description": "The OpenAPI document."
          },
          "documentation_url": {
            "type": "string",
            "format": "uri",
            "description": "Human-readable documentation."
          },
          "llms_txt_url": {
            "type": "string",
            "format": "uri",
            "description": "Guidance file for language models."
          },
          "sitemap_url": {
            "type": "string",
            "format": "uri",
            "description": "Sitemap of every public page."
          },
          "authentication": {
            "type": "string",
            "enum": [
              "none"
            ],
            "description": "Authentication scheme. The API is public."
          },
          "resources": {
            "type": "array",
            "description": "Available resources.",
            "items": {
              "type": "object",
              "properties": {
                "operation_id": {
                  "type": "string",
                  "description": "Matches the operationId in the OpenAPI document."
                },
                "method": {
                  "type": "string",
                  "description": "HTTP method. Always GET."
                },
                "path": {
                  "type": "string",
                  "description": "Path of the resource."
                },
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Absolute URL of the resource."
                },
                "summary": {
                  "type": "string",
                  "description": "Short summary of the resource."
                },
                "description": {
                  "type": "string",
                  "description": "What the resource returns and when to use it."
                }
              }
            }
          },
          "markdown_pages": {
            "type": "array",
            "description": "Pages that have a markdown mirror.",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string",
                  "description": "Path of the page."
                },
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "HTML version of the page."
                },
                "markdown_url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Markdown version of the page."
                }
              }
            }
          },
          "updated": {
            "type": "string",
            "format": "date",
            "description": "Date this document was last generated."
          }
        }
      }
    },
    "securitySchemes": {}
  },
  "security": []
}
