{
  "openapi": "3.1.0",
  "info": {
    "title": "Youdexsof public API",
    "version": "1.0.0",
    "summary": "Read-only API behind https://www.youdexsof.ir, the portfolio of Yousof Hashemzade.",
    "description": "Public, read-only endpoints exposing the portfolio, work history, education, events, products, open source repositories and blog of Yousof Hashemzade (یوسف هاشم زاده).\n\nAuthentication: None. Every endpoint listed here is public and read-only; no API key, token or sign-up is required.\nWrites: Write operations exist only behind the authenticated admin session and are not part of the public API.\nRate limits: No hard quota is enforced, but the site is a single personal deployment: keep requests under roughly 60 per minute and cache responses where you can.\nFormats: Every endpoint returns JSON. Every HTML page also has a markdown representation: send `Accept: text/markdown` to the page URL (for example `https://www.youdexsof.ir/about`) and you get `text/markdown; charset=utf-8` back.",
    "contact": {
      "name": "Yousof Hashemzade",
      "email": "yousofh255@gmail.com",
      "url": "https://www.youdexsof.ir/contact"
    },
    "license": {
      "name": "MIT",
      "identifier": "MIT"
    }
  },
  "servers": [
    {
      "url": "https://www.youdexsof.ir",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Youdexsof developer resources",
    "url": "https://www.youdexsof.ir/developers"
  },
  "paths": {
    "/api/blog": {
      "get": {
        "operationId": "listBlogPosts",
        "summary": "List published blog posts",
        "description": "Paginated list of published articles with title, description, cover image, tags, category, read time and view count in the requested language.",
        "parameters": [
          {
            "name": "lang",
            "in": "query",
            "required": false,
            "description": "Language of the returned title, description and tags.",
            "schema": {
              "type": "string",
              "enum": [
                "fa",
                "en",
                "ar"
              ]
            },
            "example": "en"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "1-based page number.",
            "schema": {
              "type": "integer"
            },
            "example": "1"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Posts per page.",
            "schema": {
              "type": "integer"
            },
            "example": "9"
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Filter by category slug.",
            "schema": {
              "type": "string"
            },
            "example": "flutter"
          },
          {
            "name": "tag",
            "in": "query",
            "required": false,
            "description": "Filter by a single tag.",
            "schema": {
              "type": "string"
            },
            "example": "dart"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "description": "Full-text search across title and description.",
            "schema": {
              "type": "string"
            },
            "example": "state management"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordering of the result set.",
            "schema": {
              "type": "string",
              "enum": [
                "newest",
                "oldest",
                "views",
                "readTime"
              ]
            },
            "example": "newest"
          },
          {
            "name": "featured",
            "in": "query",
            "required": false,
            "description": "Set to true to return only featured posts.",
            "schema": {
              "type": "boolean"
            },
            "example": "true"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/blog/{slug}": {
      "get": {
        "operationId": "getBlogPost",
        "summary": "Get one blog post by slug",
        "description": "Full article body plus metadata and comments for a single published post, in all three languages at once. The slug is the same one used in the /blog/{slug} page URL. Note that a GET increments the post's view counter.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "URL slug of the post.",
            "schema": {
              "type": "string"
            },
            "example": "getting-started-with-flutter"
          }
        ],
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/blog/categories": {
      "get": {
        "operationId": "listBlogCategories",
        "summary": "List blog categories",
        "description": "Every blog category with its slug, localized names, colour and published post count.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/worksamples": {
      "get": {
        "operationId": "listWorkSamples",
        "summary": "List portfolio projects",
        "description": "Shipped mobile and web projects with localized titles and descriptions, technologies used, project timeline, client and links.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/products": {
      "get": {
        "operationId": "listProducts",
        "summary": "List products and themes",
        "description": "Premium WordPress themes and plugins for sale, with localized titles, descriptions, price, category and purchase URL.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/works": {
      "get": {
        "operationId": "listWorkHistory",
        "summary": "List work experience",
        "description": "Employment and freelance history: organisation, localized role description, technologies, years and link.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/education": {
      "get": {
        "operationId": "listEducation",
        "summary": "List education history",
        "description": "Academic background: institution, localized description and years attended.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/events": {
      "get": {
        "operationId": "listEvents",
        "summary": "List events, competitions and awards",
        "description": "Hackathons, competitions and industry events, with localized descriptions, dates and certificate attachments.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/github/pinned": {
      "get": {
        "operationId": "listPinnedRepositories",
        "summary": "List pinned GitHub repositories",
        "description": "Open source repositories pinned on GitHub, with description, primary language, star and fork counts, homepage and repository URL. Cached for one hour.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/site-settings": {
      "get": {
        "operationId": "getSiteSettings",
        "summary": "Get public site settings",
        "description": "Theme colours, profile picture path and the technology list shown in the skills section.",
        "responses": {
          "200": {
            "description": "Success.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "No resource matches the request.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}