JSONPlaceholder REST API

Free fake REST API surface exposing six relational resources (posts, comments, albums, photos, todos, users). Supports GET / POST / PUT / PATCH / DELETE plus nested routes (e.g. /posts/1/comments) and basic query-string filtering (e.g. /comments?postId=1). Write operations are simulated — the service responds with the expected payload but does not persist changes.

Documentation

Specifications

Examples

Schemas & Data

Other Resources

OpenAPI Specification

jsonplaceholder-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: JSONPlaceholder REST API
  description: >-
    JSONPlaceholder is a free, no-auth fake REST API for prototyping, testing,
    and teaching. It exposes six relational resources — posts, comments,
    albums, photos, todos, and users — over standard REST routes (GET, POST,
    PUT, PATCH, DELETE). Write operations are simulated: the service responds
    as though the change succeeded, but no data is persisted on the server.
    The service is powered by the open-source json-server engine, also by
    typicode.
  version: '1.0.0'
  contact:
    name: typicode
    url: https://github.com/typicode/jsonplaceholder
  license:
    name: MIT
    url: https://github.com/typicode/jsonplaceholder/blob/master/LICENSE
  x-generated-from: documentation
  x-last-validated: '2026-05-29'
servers:
  - url: https://jsonplaceholder.typicode.com
    description: Public production endpoint (no authentication required)
tags:
  - name: Posts
    description: 100 sample blog posts owned by users
  - name: Comments
    description: 500 sample comments belonging to posts
  - name: Albums
    description: 100 sample photo albums owned by users
  - name: Photos
    description: 5000 sample photos belonging to albums
  - name: Todos
    description: 200 sample todo items owned by users
  - name: Users
    description: 10 sample users with profile, address, and company metadata
paths:
  /posts:
    get:
      operationId: listPosts
      summary: JSONPlaceholder List Posts
      description: >-
        Returns all 100 sample posts. Supports filtering by any field via
        query parameters (e.g. `?userId=1`).
      tags:
        - Posts
      parameters:
        - name: userId
          in: query
          description: Filter posts by owning user id.
          required: false
          schema:
            type: integer
          example: 1
        - name: id
          in: query
          description: Filter posts by post id.
          required: false
          schema:
            type: integer
          example: 1
      responses:
        '200':
          description: Array of posts.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Post'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    post:
      operationId: createPost
      summary: JSONPlaceholder Create Post
      description: >-
        Creates a new post. Returns the created post with a generated id, but
        no data is actually persisted on the server.
      tags:
        - Posts
      requestBody:
        required: true
        description: New post payload.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostInput'
      responses:
        '201':
          description: Created post (simulated, not persisted).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Post'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /posts/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: Post identifier (1-100).
        schema:
          type: integer
        example: 1
    get:
      operationId: getPost
      summary: JSONPlaceholder Get Post
      description: Returns a single post by id.
      tags:
        - Posts
      responses:
        '200':
          description: A single post.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Post'
        '404':
          description: Post not found.
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    put:
      operationId: replacePost
      summary: JSONPlaceholder Replace Post
      description: >-
        Replaces a post in full. Returns the updated post but no data is
        actually persisted on the server.
      tags:
        - Posts
      requestBody:
        required: true
        description: Full replacement payload.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Post'
      responses:
        '200':
          description: Updated post (simulated, not persisted).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Post'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    patch:
      operationId: updatePost
      summary: JSONPlaceholder Update Post
      description: >-
        Partially updates a post. Returns the merged post but no data is
        actually persisted on the server.
      tags:
        - Posts
      requestBody:
        required: true
        description: Partial update payload.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostInput'
      responses:
        '200':
          description: Updated post (simulated, not persisted).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Post'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    delete:
      operationId: deletePost
      summary: JSONPlaceholder Delete Post
      description: >-
        Deletes a post. Returns an empty object but no data is actually
        deleted on the server.
      tags:
        - Posts
      responses:
        '200':
          description: Deletion accepted (simulated, not persisted).
          content:
            application/json:
              schema:
                type: object
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /posts/{id}/comments:
    parameters:
      - name: id
        in: path
        required: true
        description: Post identifier.
        schema:
          type: integer
        example: 1
    get:
      operationId: listPostComments
      summary: JSONPlaceholder List Post Comments
      description: Returns all comments belonging to a single post.
      tags:
        - Posts
        - Comments
      responses:
        '200':
          description: Array of comments for the post.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Comment'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /comments:
    get:
      operationId: listComments
      summary: JSONPlaceholder List Comments
      description: >-
        Returns all 500 sample comments. Supports filtering by any field via
        query parameters (e.g. `?postId=1`).
      tags:
        - Comments
      parameters:
        - name: postId
          in: query
          description: Filter comments by post id.
          required: false
          schema:
            type: integer
          example: 1
      responses:
        '200':
          description: Array of comments.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Comment'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    post:
      operationId: createComment
      summary: JSONPlaceholder Create Comment
      description: >-
        Creates a new comment. Returns the created comment with a generated id
        but no data is persisted.
      tags:
        - Comments
      requestBody:
        required: true
        description: New comment payload.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentInput'
      responses:
        '201':
          description: Created comment (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Comment'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /comments/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: Comment identifier (1-500).
        schema:
          type: integer
        example: 1
    get:
      operationId: getComment
      summary: JSONPlaceholder Get Comment
      description: Returns a single comment by id.
      tags:
        - Comments
      responses:
        '200':
          description: A single comment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Comment'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    put:
      operationId: replaceComment
      summary: JSONPlaceholder Replace Comment
      description: Replaces a comment in full (simulated).
      tags:
        - Comments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Comment'
      responses:
        '200':
          description: Updated comment (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Comment'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    patch:
      operationId: updateComment
      summary: JSONPlaceholder Update Comment
      description: Partially updates a comment (simulated).
      tags:
        - Comments
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentInput'
      responses:
        '200':
          description: Updated comment (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Comment'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    delete:
      operationId: deleteComment
      summary: JSONPlaceholder Delete Comment
      description: Deletes a comment (simulated).
      tags:
        - Comments
      responses:
        '200':
          description: Deletion accepted (simulated).
          content:
            application/json:
              schema:
                type: object
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /albums:
    get:
      operationId: listAlbums
      summary: JSONPlaceholder List Albums
      description: >-
        Returns all 100 sample albums. Supports filtering by any field via
        query parameters (e.g. `?userId=1`).
      tags:
        - Albums
      parameters:
        - name: userId
          in: query
          description: Filter albums by owning user id.
          required: false
          schema:
            type: integer
          example: 1
      responses:
        '200':
          description: Array of albums.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Album'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    post:
      operationId: createAlbum
      summary: JSONPlaceholder Create Album
      description: Creates a new album (simulated).
      tags:
        - Albums
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AlbumInput'
      responses:
        '201':
          description: Created album (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Album'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /albums/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: Album identifier (1-100).
        schema:
          type: integer
        example: 1
    get:
      operationId: getAlbum
      summary: JSONPlaceholder Get Album
      description: Returns a single album by id.
      tags:
        - Albums
      responses:
        '200':
          description: A single album.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Album'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    put:
      operationId: replaceAlbum
      summary: JSONPlaceholder Replace Album
      description: Replaces an album in full (simulated).
      tags:
        - Albums
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Album'
      responses:
        '200':
          description: Updated album (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Album'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    patch:
      operationId: updateAlbum
      summary: JSONPlaceholder Update Album
      description: Partially updates an album (simulated).
      tags:
        - Albums
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AlbumInput'
      responses:
        '200':
          description: Updated album (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Album'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    delete:
      operationId: deleteAlbum
      summary: JSONPlaceholder Delete Album
      description: Deletes an album (simulated).
      tags:
        - Albums
      responses:
        '200':
          description: Deletion accepted (simulated).
          content:
            application/json:
              schema:
                type: object
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /albums/{id}/photos:
    parameters:
      - name: id
        in: path
        required: true
        description: Album identifier.
        schema:
          type: integer
        example: 1
    get:
      operationId: listAlbumPhotos
      summary: JSONPlaceholder List Album Photos
      description: Returns all photos belonging to a single album.
      tags:
        - Albums
        - Photos
      responses:
        '200':
          description: Array of photos for the album.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Photo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /photos:
    get:
      operationId: listPhotos
      summary: JSONPlaceholder List Photos
      description: >-
        Returns all 5000 sample photos. Supports filtering by any field via
        query parameters (e.g. `?albumId=1`).
      tags:
        - Photos
      parameters:
        - name: albumId
          in: query
          description: Filter photos by owning album id.
          required: false
          schema:
            type: integer
          example: 1
      responses:
        '200':
          description: Array of photos.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Photo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    post:
      operationId: createPhoto
      summary: JSONPlaceholder Create Photo
      description: Creates a new photo (simulated).
      tags:
        - Photos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhotoInput'
      responses:
        '201':
          description: Created photo (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Photo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /photos/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: Photo identifier (1-5000).
        schema:
          type: integer
        example: 1
    get:
      operationId: getPhoto
      summary: JSONPlaceholder Get Photo
      description: Returns a single photo by id.
      tags:
        - Photos
      responses:
        '200':
          description: A single photo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Photo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    put:
      operationId: replacePhoto
      summary: JSONPlaceholder Replace Photo
      description: Replaces a photo in full (simulated).
      tags:
        - Photos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Photo'
      responses:
        '200':
          description: Updated photo (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Photo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    patch:
      operationId: updatePhoto
      summary: JSONPlaceholder Update Photo
      description: Partially updates a photo (simulated).
      tags:
        - Photos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PhotoInput'
      responses:
        '200':
          description: Updated photo (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Photo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    delete:
      operationId: deletePhoto
      summary: JSONPlaceholder Delete Photo
      description: Deletes a photo (simulated).
      tags:
        - Photos
      responses:
        '200':
          description: Deletion accepted (simulated).
          content:
            application/json:
              schema:
                type: object
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /todos:
    get:
      operationId: listTodos
      summary: JSONPlaceholder List Todos
      description: >-
        Returns all 200 sample todos. Supports filtering by any field via
        query parameters (e.g. `?userId=1&completed=true`).
      tags:
        - Todos
      parameters:
        - name: userId
          in: query
          description: Filter todos by owning user id.
          required: false
          schema:
            type: integer
          example: 1
        - name: completed
          in: query
          description: Filter todos by completion state.
          required: false
          schema:
            type: boolean
          example: false
      responses:
        '200':
          description: Array of todos.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Todo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    post:
      operationId: createTodo
      summary: JSONPlaceholder Create Todo
      description: Creates a new todo (simulated).
      tags:
        - Todos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TodoInput'
      responses:
        '201':
          description: Created todo (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Todo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /todos/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: Todo identifier (1-200).
        schema:
          type: integer
        example: 1
    get:
      operationId: getTodo
      summary: JSONPlaceholder Get Todo
      description: Returns a single todo by id.
      tags:
        - Todos
      responses:
        '200':
          description: A single todo.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Todo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    put:
      operationId: replaceTodo
      summary: JSONPlaceholder Replace Todo
      description: Replaces a todo in full (simulated).
      tags:
        - Todos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Todo'
      responses:
        '200':
          description: Updated todo (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Todo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    patch:
      operationId: updateTodo
      summary: JSONPlaceholder Update Todo
      description: Partially updates a todo (simulated).
      tags:
        - Todos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TodoInput'
      responses:
        '200':
          description: Updated todo (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Todo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    delete:
      operationId: deleteTodo
      summary: JSONPlaceholder Delete Todo
      description: Deletes a todo (simulated).
      tags:
        - Todos
      responses:
        '200':
          description: Deletion accepted (simulated).
          content:
            application/json:
              schema:
                type: object
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /users:
    get:
      operationId: listUsers
      summary: JSONPlaceholder List Users
      description: Returns all 10 sample users with profile, address, and company metadata.
      tags:
        - Users
      responses:
        '200':
          description: Array of users.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    post:
      operationId: createUser
      summary: JSONPlaceholder Create User
      description: Creates a new user (simulated).
      tags:
        - Users
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserInput'
      responses:
        '201':
          description: Created user (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /users/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: User identifier (1-10).
        schema:
          type: integer
        example: 1
    get:
      operationId: getUser
      summary: JSONPlaceholder Get User
      description: Returns a single user by id.
      tags:
        - Users
      responses:
        '200':
          description: A single user.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    put:
      operationId: replaceUser
      summary: JSONPlaceholder Replace User
      description: Replaces a user in full (simulated).
      tags:
        - Users
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
      responses:
        '200':
          description: Updated user (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    patch:
      operationId: updateUser
      summary: JSONPlaceholder Update User
      description: Partially updates a user (simulated).
      tags:
        - Users
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserInput'
      responses:
        '200':
          description: Updated user (simulated).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
    delete:
      operationId: deleteUser
      summary: JSONPlaceholder Delete User
      description: Deletes a user (simulated).
      tags:
        - Users
      responses:
        '200':
          description: Deletion accepted (simulated).
          content:
            application/json:
              schema:
                type: object
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /users/{id}/posts:
    parameters:
      - name: id
        in: path
        required: true
        description: User identifier.
        schema:
          type: integer
        example: 1
    get:
      operationId: listUserPosts
      summary: JSONPlaceholder List User Posts
      description: Returns all posts authored by a single user.
      tags:
        - Users
        - Posts
      responses:
        '200':
          description: Array of posts for the user.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Post'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /users/{id}/albums:
    parameters:
      - name: id
        in: path
        required: true
        description: User identifier.
        schema:
          type: integer
        example: 1
    get:
      operationId: listUserAlbums
      summary: JSONPlaceholder List User Albums
      description: Returns all albums owned by a single user.
      tags:
        - Users
        - Albums
      responses:
        '200':
          description: Array of albums for the user.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Album'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /users/{id}/todos:
    parameters:
      - name: id
        in: path
        required: true
        description: User identifier.
        schema:
          type: integer
        example: 1
    get:
      operationId: listUserTodos
      summary: JSONPlaceholder List User Todos
      description: Returns all todos owned by a single user.
      tags:
        - Users
        - Todos
      responses:
        '200':
          description: Array of todos for the user.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Todo'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
components:
  schemas:
    Post:
      type: object
      description: A sample blog post owned by a user.
      required:
        - id
        - userId
        - title
        - body
      properties:
        id:
          type: integer
          description: Unique post identifier (1-100).
          example: 1
        userId:
          type: integer
          description: Identifier of the user who authored the post (1-10).
          example: 1
        title:
          type: string
          description: Post title.
          example: sunt aut facere repellat provident occaecati excepturi optio reprehenderit
        body:
          type: string
          description: Post body / content.
          example: quia et suscipit suscipit recusandae consequuntur expedita et cum
    PostInput:
      type: object
      description: Payload for creating or partially updating a post.
      properties:
        userId:
          type: integer
          description: Identifier of the user who authored the post.
          example: 1
        title:
          type: string
          description: Post title.
          example: My New Post
        body:
          type: string
          description: Post body / content.
          example: This is the body of my new post.
    Comment:
      type: object
      description: A sample comment attached to a post.
      required:
        - id
        - postId
        - name
        - email
        - body
      properties:
        id:
          type: integer
          description: Unique comment identifier (1-500).
          example: 1
        postId:
          type: integer
          description: Identifier of the post this comment belongs to.
          example: 1
        name:
          type: string
          description: Display name / subject of the comment.
          example: id labore ex et quam laborum
        email:
          type: string
          format: email
          description: Email address of the commenter.
          example: [email protected]
        body:
          type: string
          description: Comment body text.
          example: laudantium enim quasi est quidem magnam voluptate ipsam eos tempora quo necessitatibus
    CommentInput:
      type: object
      description: Payload for creating or partially updating a comment.
      properties:
        postId:
          type: integer
          description: Identifier of the post being commented on.
          example: 1
        name:
          type: string
          description: Display name / subject of the comment.
          example: Great post
        email:
          type: string
          format: email
          description: Email address of the commenter.
          example: [email protected]
        body:
          type: string
          description: Comment body text.
          example: Thanks for writing this.
    Album:
      type: object
      description: A sample photo album owned by a user.
      required:
        - id
        - userId
        - title
      properties:
        id:
          type: integer
          description: Unique album identifier (1-100).
          example: 1
        userId:
          type: integer
          description: Identifier of the user who owns the album.
          example: 1
        title:
          type: string
          description: Album title.
          example: quidem molestiae enim
    AlbumInput:
      type: object
      description: Payload for creating or partially updating an album.
      properties:
        userId:
          type: integer
          description: Identifier of the user who owns the album.
          example: 1
        title:
          type: string
          description: Album title.
          example: Holiday Album
    Photo:
      type: object
      description: A sample photo belonging to an album.
      required:
        - id
        - albumId
        - title
        - url
        - thumbnailUrl
      properties:
        id:
          type: integer
          description: Unique photo identifier (1-5000).
          example: 1
        albumId:
          type: integer
          description: Identifier of the album this photo belongs to.
          example: 1
        title:
          type: string
          description: Photo title / caption.
          example: accusamus beatae ad facilis cum similique qui sunt
        url:
          type: string
          format: uri
          description: Full-size image URL (placeholder service).
          example: https://via.placeholder.com/600/92c952
        thumbnailUrl:
          type: string
          format: uri
          description: Thumbnail image URL (placeholder service).
          example: https://via.placeholder.com/150/92c952
    PhotoInput:
      type: object
      description: Payload for creating or partially updating a photo.
      properties:
        albumId:
          type: integer
          description: Identifier of the album this photo belongs to.
        

# --- truncated at 32 KB (36 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/jsonplaceholder/refs/heads/main/openapi/jsonplaceholder-openapi.yml