{
  "openapi": "3.1.0",
  "info": {
    "title": "Masa Media public content API",
    "version": "1.0.0",
    "summary": "Read-only access to the published content of masamedia.co.il for AI agents and developers.",
    "description": "Search and read the public pages of masamedia.co.il (Masa Media Digital, an SEO and GEO agency in Israel): services, articles, the Hebrew SEO glossary, case studies, published prices and contact details. Content is mostly Hebrew. No API key or account is needed, and every operation is a read. The same data is available as an MCP server at https://www.masamedia.co.il/mcp/. Rate limit: up to 120 requests per 60 seconds per client (best effort, reported in RateLimit headers).\n\nVersioning: the major version is in the path (/v1/). Changes inside v1 only add fields or endpoints. A breaking change ships as /v2/; v1 is retired only after Deprecation and Sunset headers on v1 responses have announced the date.",
    "contact": {
      "name": "Masa Media Digital",
      "url": "https://www.masamedia.co.il/developers/",
      "email": "contact@masamedia.co.il"
    },
    "termsOfService": "https://www.masamedia.co.il/tos/"
  },
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://www.masamedia.co.il/developers/"
  },
  "servers": [
    {
      "url": "https://www.masamedia.co.il/v1",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "content",
      "description": "Search and read pages"
    },
    {
      "name": "company",
      "description": "Services, prices and contact details"
    },
    {
      "name": "reference",
      "description": "Glossary and Google updates"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "List the API endpoints",
        "description": "Returns the API name, version, documentation links and the list of endpoints.",
        "tags": [
          "content"
        ],
        "responses": {
          "200": {
            "description": "API index",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/search/": {
      "get": {
        "operationId": "searchContent",
        "summary": "Search the site",
        "description": "Full-text search over published pages. Every word of the query must appear in the page title, summary or body. Results are ranked by title matches first.",
        "tags": [
          "content"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Search words in Hebrew or English, for example \"קידום אתרים\" or \"GEO\".",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 120
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Only return one kind of page.",
            "schema": {
              "$ref": "#/components/schemas/ContentType"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Page size (1-20).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 5
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor: pass nextCursor from the previous page to get the next one.",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Number of items to skip (an alternative to cursor).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching pages",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResults"
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The detail says which one and how to fix it.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/page/": {
      "get": {
        "operationId": "getPage",
        "summary": "Read a page as Markdown",
        "description": "Returns the main content of one page of the site as Markdown, with its title and canonical URL. Follows the site's redirects.",
        "tags": [
          "content"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "A path such as /seo-pricing/ or a full URL on www.masamedia.co.il.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The page as Markdown",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The detail says which one and how to fix it.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "No such page, service or endpoint.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "503": {
            "description": "The source page could not be loaded. Retry in a minute.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/services/": {
      "get": {
        "operationId": "listServices",
        "summary": "List the services",
        "description": "The six services Masa Media offers, each with its page URL and a one-line description. Pass id to get one.",
        "tags": [
          "company"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": false,
            "description": "One service.",
            "schema": {
              "type": "string",
              "enum": [
                "organic-seo",
                "geo",
                "google-ads",
                "meta-ads",
                "web-development",
                "reputation-management"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Services",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "services"
                  ],
                  "properties": {
                    "services": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Service"
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "No such page, service or endpoint.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/pricing/": {
      "get": {
        "operationId": "getPricing",
        "summary": "Get the published prices",
        "description": "The monthly SEO packages exactly as the homepage lists them (ILS, VAT not included), plus the price ranges by package type from the SEO pricing guide.",
        "tags": [
          "company"
        ],
        "responses": {
          "200": {
            "description": "Prices",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Pricing"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "503": {
            "description": "The source page could not be loaded. Retry in a minute.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/contact/": {
      "get": {
        "operationId": "getContactInfo",
        "summary": "Get contact details",
        "description": "Company name, phone, email, address, opening hours and how to request a quote.",
        "tags": [
          "company"
        ],
        "responses": {
          "200": {
            "description": "Contact details",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ContactInfo"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/case-studies/": {
      "get": {
        "operationId": "listCaseStudies",
        "summary": "List the case studies",
        "description": "Published client case studies with their headline result, newest first.",
        "tags": [
          "company"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Page size (1-50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor: pass nextCursor from the previous page to get the next one.",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Number of items to skip (an alternative to cursor).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Case studies",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "total",
                    "limit",
                    "offset",
                    "nextOffset",
                    "nextCursor",
                    "caseStudies"
                  ],
                  "properties": {
                    "total": {
                      "type": "integer",
                      "description": "Total number of matching items."
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "offset": {
                      "type": "integer"
                    },
                    "nextOffset": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Offset of the next page, or null on the last page."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor of the next page, or null on the last page."
                    },
                    "caseStudies": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CaseStudy"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The detail says which one and how to fix it.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/glossary/": {
      "get": {
        "operationId": "listGlossaryTerms",
        "summary": "List or search the SEO glossary",
        "description": "Terms of the Hebrew SEO glossary, alphabetical. Pass q to filter by term.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Part of a term, for example \"canonical\".",
            "schema": {
              "type": "string",
              "maxLength": 80
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Page size (1-100).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor: pass nextCursor from the previous page to get the next one.",
            "schema": {
              "type": "string",
              "maxLength": 40
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Number of items to skip (an alternative to cursor).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 1000,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Glossary terms",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "total",
                    "limit",
                    "offset",
                    "nextOffset",
                    "nextCursor",
                    "terms"
                  ],
                  "properties": {
                    "total": {
                      "type": "integer",
                      "description": "Total number of matching items."
                    },
                    "limit": {
                      "type": "integer"
                    },
                    "offset": {
                      "type": "integer"
                    },
                    "nextOffset": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Offset of the next page, or null on the last page."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor of the next page, or null on the last page."
                    },
                    "terms": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/GlossaryTerm"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The detail says which one and how to fix it.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/google-updates/": {
      "get": {
        "operationId": "listGoogleUpdates",
        "summary": "List Google ranking updates",
        "description": "Google's official named ranking updates from the last 12 months (core, spam and others), newest first, with start and end times and a link to Google's announcement.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Only core updates, spam updates, or the other named updates.",
            "schema": {
              "type": "string",
              "enum": [
                "core",
                "spam",
                "other"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Updates",
            "headers": {
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GoogleUpdates"
                }
              }
            }
          },
          "400": {
            "description": "A parameter is missing or invalid. The detail says which one and how to fix it.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit reached. Wait the number of seconds in Retry-After.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "headers": {
      "RateLimit": {
        "description": "Requests left in the current window and seconds until it resets (IETF RateLimit header fields).",
        "schema": {
          "type": "string"
        }
      },
      "RateLimitPolicy": {
        "description": "The limit: 120 requests per 60 seconds per client.",
        "schema": {
          "type": "string"
        }
      }
    },
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          }
        }
      },
      "ContentType": {
        "type": "string",
        "enum": [
          "service",
          "article",
          "glossary",
          "case-study",
          "hub",
          "page"
        ]
      },
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "documentation",
          "openapi",
          "mcpServer",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "mcpServer": {
            "type": "string",
            "format": "uri"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "SearchHit": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url",
          "type",
          "excerpt",
          "updatedAt"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable id (the page URL)."
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "type": {
            "$ref": "#/components/schemas/ContentType"
          },
          "excerpt": {
            "type": "string",
            "description": "The page summary."
          },
          "updatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "SearchResults": {
        "type": "object",
        "required": [
          "query",
          "total",
          "limit",
          "offset",
          "nextOffset",
          "nextCursor",
          "results"
        ],
        "properties": {
          "query": {
            "type": "string"
          },
          "total": {
            "type": "integer",
            "description": "Total number of matching items."
          },
          "limit": {
            "type": "integer"
          },
          "offset": {
            "type": "integer"
          },
          "nextOffset": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Offset of the next page, or null on the last page."
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cursor of the next page, or null on the last page."
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchHit"
            }
          }
        }
      },
      "Page": {
        "type": "object",
        "required": [
          "title",
          "url",
          "markdown"
        ],
        "properties": {
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Canonical URL."
          },
          "markdown": {
            "type": "string"
          }
        }
      },
      "Service": {
        "type": "object",
        "required": [
          "id",
          "name",
          "nameHe",
          "url",
          "description"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "nameHe": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "description": {
            "type": "string",
            "description": "Hebrew."
          }
        }
      },
      "Plan": {
        "type": "object",
        "required": [
          "name",
          "audience",
          "pricePerMonth",
          "priceText",
          "includes",
          "excludes"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "audience": {
            "type": "string",
            "description": "Who the package is for."
          },
          "pricePerMonth": {
            "type": "number",
            "description": "ILS per month, VAT not included."
          },
          "priceText": {
            "type": "string"
          },
          "includes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "excludes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "Pricing": {
        "type": "object",
        "required": [
          "currency",
          "vatIncluded",
          "note",
          "plans",
          "packageRanges",
          "sources"
        ],
        "properties": {
          "currency": {
            "type": "string",
            "const": "ILS"
          },
          "vatIncluded": {
            "type": "boolean",
            "const": false
          },
          "note": {
            "type": "string"
          },
          "plans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Plan"
            }
          },
          "packageRanges": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Monthly price ranges by package type, from the SEO pricing guide (/seo-pricing/)."
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "ContactInfo": {
        "type": "object",
        "required": [
          "company",
          "contact",
          "howToRequestAQuote"
        ],
        "properties": {
          "company": {
            "type": "object",
            "additionalProperties": true
          },
          "contact": {
            "type": "object",
            "required": [
              "phone",
              "email",
              "address",
              "hours",
              "contactPage"
            ],
            "properties": {
              "phone": {
                "type": "string"
              },
              "phoneLocal": {
                "type": "string"
              },
              "email": {
                "type": "string",
                "format": "email"
              },
              "address": {
                "type": "object",
                "additionalProperties": true
              },
              "hours": {
                "type": "object",
                "additionalProperties": true
              },
              "contactPage": {
                "type": "string",
                "format": "uri"
              },
              "languages": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "howToRequestAQuote": {
            "type": "string"
          }
        }
      },
      "CaseStudy": {
        "type": "object",
        "required": [
          "title",
          "url",
          "result",
          "updatedAt"
        ],
        "properties": {
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "result": {
            "type": "string",
            "description": "Headline result, in Hebrew."
          },
          "updatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "GlossaryTerm": {
        "type": "object",
        "required": [
          "term",
          "url",
          "summary"
        ],
        "properties": {
          "term": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "summary": {
            "type": "string"
          }
        }
      },
      "GoogleUpdates": {
        "type": "object",
        "required": [
          "source",
          "updates"
        ],
        "properties": {
          "source": {
            "type": "string",
            "format": "uri"
          },
          "updates": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "name",
                "nameHe",
                "began",
                "ended",
                "status",
                "officialUrl"
              ],
              "properties": {
                "name": {
                  "type": "string"
                },
                "nameHe": {
                  "type": "string"
                },
                "began": {
                  "type": "string",
                  "format": "date-time"
                },
                "ended": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "complete",
                    "rolling out"
                  ]
                },
                "officialUrl": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          }
        }
      }
    }
  }
}