openapi: 3.1.0
info:
  title: Kemono API
  version: 1.3.0
  contact:
    email: contact@kemono.party
servers:
  - url: https://kemono.su/api
  - url: https://coomer.su/api
tags:
  - name: Posts
    description: Version one
  - name: Creators
  - name: Comments
  - name: Post Flagging
    description: Flag post for re-import
  - name: Discord
  - name: Favorites
  - name: File Search
  - name: Misc
paths:
  /v2/file/{file_hash}:
    get:
      description: Overview of the file.
      parameters:
        - name: file_hash
          in: path
          description: Hash of the file.
          required: true
          schema:
            $ref: "#/components/schemas/hash-sha256"
      responses:
        '200':
          description: Successfully retrieved file details.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/response-body-success"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/archive-info"
        '400':
          description: There are errors in parameters.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '404':
          description: File does not exist.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
    patch:
      description: Add password to a file if needed
      parameters:
        - name: file_hash
          in: path
          description: Hash of the file.
          required: true
          schema:
            $ref: "#/components/schemas/hash-sha256"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: "#/components/schemas/request-body-with-data"
                - type: object
                  properties:
                    data:
                      type: object
                      required:
                        - password
                      additionalPropeties: false
                      properties:
                        password:
                          type: string
                          minLength: 1
      responses:
        '200':
          description: Successfully added a correct password.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/response-body-success"
                  - type: object
                    properties:
                      data:
                        description: Hash of the file which got updated.
                        $ref: "#/components/schemas/hash-sha256"
        '400':
          description: There are errors in parameters or the body.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
  /v2/account/flags/post:
    put:
      description: Flag the post for reimport.
      security:
        - cookieAuth: [ ]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: "#/components/schemas/request-body-with-data"
                - type: object
                  properties:
                    data:
                      type: object
                      required:
                        - service
                        - profile_id
                        - post_id
                      additionalPropeties: false
                      properties:
                        service:
                          type: string
                        profile_id:
                          type: string
                        post_id:
                          type: string
      responses:
        '201':
          description: Successfully flagged the post.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/response-body-success"
                  - type: object
                    properties:
                      data:
                        type: object
                        description: Data of flagged post.
                        required:
                          - service
                          - profile_id
                          - post_id
                        properties:
                          service:
                            type: string
                          profile_id:
                            type: string
                          post_id:
                            type: string
        '400':
          description: Request body has errors.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '404':
          description: Post doesn't exist.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '409':
          description: Post is already flagged.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
  /v2/account/administrator/accounts:
    get:
      description: Get account count.
      security:
        - cookieAuth: [ ]
      parameters:
        - name: name
          in: query
          description: Filter by name
          schema:
            type: string
        - name: role
          in: query
          description: Filter by role
          schema:
            type: string
      responses:
        '200':
          description: Successfully counted accounts.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/response-body-success"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/non-negative-integer"
        '401':
          description: User not logged in.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '404':
          description: User is not administrator.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
  /v2/account/administrator/accounts/{page}:
    get:
      description: Get accounts at page.
      security:
        - cookieAuth: [ ]
      parameters:
        - $ref: "#/components/parameters/path-page"
        - name: name
          in: query
          description: Filter by name
          schema:
            type: string
        - name: role
          in: query
          description: Filter by role
          schema:
            type: string
      responses:
        '200':
          description: Successfully gotten accounts at page.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/response-body-success"
                  - type: object
                    properties:
                      data:
                        type: array
                        items:
                          $ref: "#/components/schemas/account"
        '400':
          description: There are errors in parameters.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '401':
          description: User not logged in.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '404':
          description: User is not administrator.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
  /v2/account/administrator/account/{account_id}:
    get:
      description: Overview of target account.
      security:
        - cookieAuth: [ ]
      parameters:
        - name: account_id
          in: path
          description: ID of the account.
          required: true
          schema:
            $ref: "#/components/schemas/positive-integer"
      responses:
        '200':
          description: Successfully retrieved target account details.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/response-body-success"
                  - type: object
                    properties:
                      data:
                        $ref: "#/components/schemas/account"
        '400':
          description: There are errors in parameters.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '401':
          description: User not logged in.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
        '404':
          description: User is not administrator or account doesn't exist.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/response-body-error"
    patch:
      description: Change target account details.
      security:
        - cookieAuth: [ ]
      parameters:
        - name: account_id
          in: path
          description: ID of the account.
          required: true
          schema:
            $ref: "#/components/schemas/positive-integer"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: "#/components/schemas/request-body-with-data"
                - type: object
                  properties:
                    data:
                      type: object
                      required:
                        - role
                      additionalPropeties: false
                      properties:
                        role:
                          type: string
      responses:
          '200':
            description: Successfully changed target account details.
            content:
              application/json:
                schema:
                  allOf:
                    - $ref: "#/components/schemas/response-body-success"
                    - type: object
                      properties:
                        data:
                          description: ID of account which got updated.
                          $ref: "#/components/schemas/positive-integer"
          '400':
            description: There are errors in parameters or in the body.
            content:
              application/json:
                schema:
                  $ref: "#/components/schemas/response-body-error"
          '401':
            description: Admin account is not logged in.
            content:
              application/json:
                schema:
                  $ref: "#/components/schemas/response-body-error"
          '404':
            description: Admin account is not administrator or target account doesn't exist.
            content:
              application/json:
                schema:
                  $ref: "#/components/schemas/response-body-error"
          '409':
            description: Failed to update target account due to a conflict.
            content:
              application/json:
                schema:
                  $ref: "#/components/schemas/response-body-error"
  /v1/creators.txt:
    get:
      tags:
        - Posts
      summary: List All Creators
      description: List all creators with details. I blame DDG for .txt.
      responses:
        '200':
          description: List of all creators
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    favorited:
                      type: integer
                      description: The number of times this creator has been favorited
                    id:
                      type: string
                      description: The ID of the creator
                    indexed:
                      type: number
                      description: Timestamp when the creator was indexed, Unix time as integer
                    name:
                      type: string
                      description: The name of the creator
                    service:
                      type: string
                      description: The service for the creator
                    updated:
                      type: number
                      description: Timestamp when the creator was last updated, Unix time as integer
              example:
                - favorited: 1
                  id: '21101760'
                  indexed: 1672534800
                  name: RAIGYO
                  service: fanbox
                  updated: 1672534800
  /v1/posts:
    get:
      tags:
        - Posts
      summary: List recent posts
      description: List of recently imported posts
      parameters:
        - name: q
          in: query
          description: Search query
          schema:
            type: string
            minLength: 3
        - name: o
          in: query
          description: Result offset, stepping of 50 is enforced
          schema:
            type: integer
        - name: tag
          in: query
          description: A list of tags to filter by
          schema:
            type: array
            items:
              type: string
      responses:
        '200':
          description: List of recently added posts
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                  true_count:
                    type: integer
                  posts:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        user:
                          type: string
                        service:
                          type: string
                        title:
                          type: string
                        content:
                          type: string
                        embed:
                          type: object
                        shared_file:
                          type: boolean
                        added:
                          type: string
                          format: date-time
                        published:
                          type: string
                          format: date-time
                        edited:
                          type: string
                          format: date-time
                        file:
                          type: object
                          properties:
                            name:
                              type: string
                            path:
                              type: string
                        attachments:
                          type: array
                          items:
                            type: object
                            properties:
                              name:
                                type: string
                              path:
                                type: string
              example:
                - id: '1836570'
                  user: '6570768'
                  service: fanbox
                  title: 今日はFANBOXを始まりました！
                  content: <p>みなさんこんにちは、影おじです。</p><p>先週のように、FANBOXを始まりに決定しました！</p><p>そしてFANBOXの更新内容について、アンケートのみなさん</p><p>ありがとうございました！</p><p><br/></p><p>では更新内容の詳しいことはこちらです↓</p><p>毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。</p><p>もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。</p><p><br/></p><p>これから、仕事以外の時間、できる限り勤勉な更新したいと思います！</p><p>どうぞよろしくお願いいたします！</p>
                  embed: { }
                  shared_file: false
                  added: '2021-03-30T18:00:05.973913'
                  published: '2021-01-24T17:54:38'
                  edited: '2021-01-24T18:46:15'
                  file:
                    name: a99d9674-5490-400e-acca-4bed99590699.jpg
                    path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg
                  attachments: [ ]
                - id: '1836649'
                  user: '6570768'
                  service: fanbox
                  title: 忍ちゃん  脇コキ差分
                  content: ''
                  embed: { }
                  shared_file: false
                  added: '2021-03-30T17:59:57.815397'
                  published: '2021-01-24T18:23:12'
                  edited: '2023-01-04T14:45:19'
                  file:
                    name: 4c5615f9-be74-4fa7-b88d-168fd37a2824.jpg
                    path: /d0/3c/d03c893927521536646619f5fb33426aa4b82dc12869865d6d666932755d9acd.jpg
                  attachments:
                    - name: 9cc982e4-1d94-4a1a-ac62-3dddd29f881c.png
                      path: /d7/4d/d74d1727f2c3fcf7a7cc2d244d677d93b4cc562a56904765e4e708523b34fb4c.png
                    - name: ab0e17d7-52e5-42c2-925b-5cfdb451df0c.png
                      path: /1b/67/1b677a8c0525e386bf2b2f013e36e29e4033feb2308798e4e5e3780da6c0e815.png
  /v1/posts/random:
    get:
      description: Get a random post
      responses:
        '200':
          description: A random post.
          content:
            application/json:
              schema:
                type: object
                properties:
                  service:
                    type: string
                  artist_id:
                    type: string
                  post_id:
                    type: string
        '404':
          description: Not random psot found.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/error"
  /v1/posts/popular:
    get:
      description: Get popular posts
      parameters:
        - name: date
          in: query
          description: Base date of the list
          required: true
          schema:
            type: string
        - name: period
          in: query
          description: Period scale of the list
          required: true
          schema:
            enum:
              - recent
              - day
              - week
              - month
        - $ref: "#/components/parameters/query-o"

      responses:
        '200':
          description: A list of popular posts.
          content:
            application/json:
              schema:
                type: object
                properties:
                  info:
                    type: object
                    properties:
                      date:
                        type: string
                      min_date:
                        type: string
                      max_date:
                        type: string
                      navigation_dates:
                        type: object
                        propertyNames:
                          enum:
                            - recent
                            - day
                            - week
                            - month
                        additionalProperties:
                          type: array
                          prefixItems:
                            - type: string
                            - type: string
                            - type: string
                      range_desc:
                        type: string
                      scale:
                        enum:
                          - recent
                          - day
                          - week
                          - month
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: popular_posts
                      today:
                        type: string
                      earliest_date_for_popular:
                        type: string
                      limit:
                        type: integer
                      count:
                        type: integer
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/post-with-fav-count"
                  base:
                    type: object
                    additionalProperties:
                      type: string
                  result_previews:
                    type: array
                    items:
                      anyOf:
                        - type: object
                          properties:
                            type:
                              const: thumbnail
                            server:
                              type: string
                            name:
                              type: string
                            path:
                              type: string
                        - type: object
                          properties:
                            type:
                              const: embed
                            url:
                              type: string
                            subject:
                              type: string
                            description:
                              type: string
                  result_attachments:
                    type: array
                    items:
                      type: object
                      properties:
                        server:
                          type: string
                        name:
                          type: string
                        path:
                          type: string
                  result_is_image:
                    type: array
                    items:
                      type: boolean
  /v1/posts/tags:
    get:
      description: Get tags
      responses:
        '200':
          description: A list of post tags.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentpage:
                        const: "tags"
                  tags:
                    type: array
                    items:
                      $ref: "#/components/schemas/tag"
  /v1/{service}/post/{post_id}:
    get:
      description: Get a post by ID
      parameters:
        - $ref: "#/components/parameters/path-service"
        - $ref: "#/components/parameters/path-post-id"
      responses:
        '200':
          description: Post data.
          content:
            application/json:
              schema:
                type: object
                properties:
                  service:
                    type: string
                  artist_id:
                    type: string
                  post_id:
                    type: string
        '404':
          description: No post found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/error"
  /v1/{service}/user/{creator_id}/profile:
    get:
      summary: Get a creator
      tags:
        - Creators
      parameters:
        - name: service
          in: path
          description: The service where the creator is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Creator details retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: The ID of the creator
                  public_id:
                    type:
                      - string
                      - null
                    description: The public ID of the creator
                  service:
                    type: string
                    description: The service where the creator is located
                  name:
                    type: string
                    description: The creator's display name
                  indexed:
                    type: string
                    format: date-time
                    description: The time the creator was last indexed
                  updated:
                    type: string
                    format: date-time
                    description: The time the creator was last updated
        '404':
          description: The creator could not be found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: The error message
                    enum: ["Creator not found."]
  /v1/{service}/user/{creator_id}:
    get:
      summary: Get a list of creator posts
      tags:
        - Posts
      parameters:
        - name: service
          in: path
          description: The service where the post is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
        - name: q
          in: query
          description: Search query
          schema:
            type: string
            minLength: 3
        - name: o
          in: query
          description: Result offset, stepping of 50 is enforced
          schema:
            type: integer
      responses:
        '200':
          description: Post details retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    user:
                      type: string
                    service:
                      type: string
                    title:
                      type: string
                    content:
                      type: string
                    embed:
                      type: object
                    shared_file:
                      type: boolean
                    added:
                      type: string
                      format: date-time
                    published:
                      type: string
                      format: date-time
                    edited:
                      type: string
                      format: date-time
                    file:
                      type: object
                      properties:
                        name:
                          type: string
                        path:
                          type: string
                    attachments:
                      type: array
                      items:
                        type: object
                        properties:
                          name:
                            type: string
                          path:
                            type: string
              example:
                - id: '1836570'
                  user: '6570768'
                  service: fanbox
                  title: 今日はFANBOXを始まりました！
                  content: <p>みなさんこんにちは、影おじです。</p><p>先週のように、FANBOXを始まりに決定しました！</p><p>そしてFANBOXの更新内容について、アンケートのみなさん</p><p>ありがとうございました！</p><p><br/></p><p>では更新内容の詳しいことはこちらです↓</p><p>毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。</p><p>もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。</p><p><br/></p><p>これから、仕事以外の時間、できる限り勤勉な更新したいと思います！</p><p>どうぞよろしくお願いいたします！</p>
                  embed: { }
                  shared_file: false
                  added: '2021-03-30T18:00:05.973913'
                  published: '2021-01-24T17:54:38'
                  edited: '2021-01-24T18:46:15'
                  file:
                    name: a99d9674-5490-400e-acca-4bed99590699.jpg
                    path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg
                  attachments: [ ]
                - id: '1836649'
                  user: '6570768'
                  service: fanbox
                  title: 忍ちゃん  脇コキ差分
                  content: ''
                  embed: { }
                  shared_file: false
                  added: '2021-03-30T17:59:57.815397'
                  published: '2021-01-24T18:23:12'
                  edited: '2023-01-04T14:45:19'
                  file:
                    name: 4c5615f9-be74-4fa7-b88d-168fd37a2824.jpg
                    path: /d0/3c/d03c893927521536646619f5fb33426aa4b82dc12869865d6d666932755d9acd.jpg
                  attachments:
                    - name: 9cc982e4-1d94-4a1a-ac62-3dddd29f881c.png
                      path: /d7/4d/d74d1727f2c3fcf7a7cc2d244d677d93b4cc562a56904765e4e708523b34fb4c.png
                    - name: ab0e17d7-52e5-42c2-925b-5cfdb451df0c.png
                      path: /1b/67/1b677a8c0525e386bf2b2f013e36e29e4033feb2308798e4e5e3780da6c0e815.png
        '400':
          description: Offset provided which is not a multiple of 50
        '404':
          description: The creator could not be found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: The error message
                    enum: ["Creator not found."]
  /v1/{service}/user/{creator_id}/announcements:
    get:
      summary: Get creator announcements
      tags:
        - Posts
      parameters:
        - name: service
          in: path
          required: true
          description: The service name
          schema:
            type: string
        - name: creator_id
          in: path
          required: true
          description: The creator's ID
          schema:
            type: string
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    service:
                      type: string
                    user_id:
                      type: string
                    hash:
                      type: string
                      description: sha256
                    content:
                      type: string
                    added:
                      type: string
                      format: date-time
                      description: isoformat UTC
              example:
                - service: patreon
                  user_id: '8693043'
                  hash: 820b7397c7f75efb13c4a8aa5d4aacfbb200749f3e1cec16e9f2951d158be8c2
                  content: Hey guys, thank you so much for your support, that means a lot to me!
                  added: '2023-01-31T05:16:15.462035'
        '404':
          description: Artist not found
  /v1/{service}/user/{creator_id}/fancards:
    get:
      summary: Get fancards by creator, fanbox only
      tags:
        - Posts
      parameters:
        - name: service
          in: path
          required: true
          description: The service name, has to be "fanbox"
          schema:
            type: string
        - name: creator_id
          in: path
          required: true
          description: The creator's ID
          schema:
            type: string
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                    user_id:
                      type: string
                    file_id:
                      type: integer
                    hash:
                      type: string
                    mtime:
                      type: string
                      format: date-time
                    ctime:
                      type: string
                      format: date-time
                    mime:
                      type: string
                    ext:
                      type: string
                    added:
                      type: string
                      format: date-time
                    size:
                      type: integer
                    ihash:
                      type: string
                    path:
                      type: string
                    server:
                      type: string
                example:
                - id: 108058645
                  user_id: '3316400'
                  file_id: 108058645
                  hash: 727bf3f0d774a98c80cf6c76c3fb0e049522b88eb7f02c8d3fc59bae20439fcf
                  mtime: '2023-05-23T15:09:43.941195'
                  ctime: '2023-05-23T15:09:43.941195'
                  mime: image/jpeg
                  ext: .jpg
                  added: '2023-05-23T15:09:43.960578'
                  size: 339710
                  ihash: null
                - id: 103286760
                  user_id: '3316400'
                  file_id: 103286760
                  hash: 8b0d0f1be38efab9306b32c7b14b74ddd92a2513026c859a280fe737980a467d
                  mtime: '2023-04-26T14:16:53.205183'
                  ctime: '2023-04-26T14:16:53.205183'
                  mime: image/jpeg
                  ext: .jpg
                  added: '2023-04-26T14:16:53.289143'
                  size: 339764
                  ihash: null
        '404':
          description: Artist not found
  /v1/{service}/user/{creator_id}/links:
    get:
      summary: Get a creator's linked accounts
      tags:
        - Creators
      parameters:
        - name: service
          in: path
          description: The service where the creator is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Linked accounts retrieved successfully
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                      description: The ID of the creator
                    public_id:
                      type:
                        - string
                        - null
                      description: The public ID of the creator
                    service:
                      type: string
                      description: The service where the creator is located
                    name:
                      type: string
                      description: The creator's display name
                    indexed:
                      type: string
                      format: date-time
                      description: The time the creator was last indexed
                    updated:
                      type: string
                      format: date-time
                      description: The time the creator was last updated
        '404':
          description: The creator could not be found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    description: The error message
                    enum: ["Creator not found."]
    delete:
      description: Remove artist from linked accounts. Requires admin privilegies.
      parameters:
        - $ref: "#/components/parameters/path-service"
        - $ref: "#/components/parameters/path-creator-id"
      responses:
        '204':
          description: Artist's link was successfuly removed.
          content:
            plain/text:
              schema:
                const: ""
        '404':
          description: Insufficient privilegies.
          content:
            plain/text:
              schema:
                const: ""
  /v1/{service}/user/{creator_id}/links/new:
    get:
      description: Add links to the artist
      parameters:
        - $ref: "#/components/parameters/path-service"
        - $ref: "#/components/parameters/path-creator-id"
      responses:
        '200':
          description: The data for the new link.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      id:
                        type: string
                      service:
                        type: string
                      artist:
                        $ref: "#/components/schemas/artist"
                      share_count:
                        $ref: "#/components/schemas/non-negative-integer"
                      dm_count:
                        $ref: "#/components/schemas/non-negative-integer"
                      has_links:
                        enum:
                          - ✔️
                          - "0"
                      display_data:
                        type: object
                        properties:
                          service:
                            type: string
                          href:
                            type: string
                  base:
                    type: object
                    properties:
                      service:
                        type: string
                      artist_id:
                        type: string
    post:
      description: Add links to the artist
      parameters:
          - $ref: "#/components/parameters/path-service"
          - $ref: "#/components/parameters/path-creator-id"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - service
                - artist_id
              properties:
                service:
                  type: string
                artist_id:
                  type: string
                reason:
                  type: string
                  maxLength: 140
      responses:
        '200':
          description: The link request added to moderation queue.
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                  props:
                    type: object
                    properties:
                      id:
                        type: string
                      service:
                        type: string
                      artist:
                        $ref: "#/components/schemas/artist"
                      share_count:
                        $ref: "#/components/schemas/non-negative-integer"
                      has_links:
                        enum:
                          - ✔️
                          - "0"
                      display_data:
                        type: object
                        properties:
                          service:
                            type: string
                          href:
                            type: string
        '400':
          description: Failed to added the new link due to input errors.
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: text
  /v1/{service}/user/{creator_id}/tags:
    get:
      description: Tags of profile
      tags:
        - Creators
      parameters:
        - $ref: "#/components/parameters/path-service"
        - $ref: "#/components/parameters/path-creator-id"
      responses:
        '200':
          description: Found the tags for the profile
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    display_data:
                      type: object
                      properties:
                        service: string
                        href: string
                    artist:
                      $ref: "#/components/schemas/artist"
                    service:
                      type: string
                    id:
                      type: string
                    share_count:
                      type: integer
                    dm_count:
                      type: integer
                    has_links:
                      # gr8 API design
                      enum:
                        - ✔️
                        - "0"
                  tags:
                    type: array
                    items:
                      $ref: "#/components/schemas/tag"
                  service:
                    type: string
                  artist:
                    $ref: "#/components/schemas/artist"
  /v1/{service}/user/{creator_id}/shares:
    get:
      description: Shares of the artist
      parameters:
        - $ref: "#/components/parameters/path-service"
        - $ref: "#/components/parameters/path-creator-id"
        - $ref: "#/components/parameters/query-o"
      responses:
        '200':
          description: Found the shares for the artist
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/share"
                  props:
                    display_data:
                      type: object
                      properties:
                        service:
                          type: string
                        href:
                          type: string
                    service:
                      type: string
                    artist:
                      $ref: "#/components/schemas/artist"
                    id:
                      type: string
                    dm_count:
                      type: integer
                    share_count:
                      type: integer
                    has_links:
                      enum:
                        - ✔️
                        - "0"
                  base:
                    type: object
                    properties:
                      service:
                        type: string
                      artist_id:
                        type: string
  /v1/{service}/user/{creator_id}/dms:
    get:
      description: Direct messages of profile
      parameters:
        - $ref: "#/components/parameters/path-service"
        - $ref: "#/components/parameters/path-creator-id"
      responses:
        '200':
          description: Found direct messages for the profile
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    id:
                      type: string
                    service:
                      type: string
                    artist:
                      $ref: "#/components/schemas/artist"
                    display_data:
                      type: object
                      properties:
                        service:
                          type: string
                        href:
                          type: string
                    share_count:
                      type: integer
                    dm_count:
                      type: integer
                    dms:
                      type: array
                      items:
                        $ref: "#/components/schemas/approved-dm"
                    has_links:
                      enum:
                        - ✔️
                        - "0"
  /v1/{service}/user/{creator_id}/posts-legacy:
    get:
      description: A duct-tape endpoint which also returns count for pagination component.
      parameters:
        - name: service
          in: path
          required: true
          description: The service name
          schema:
            type: string
        - name: creator_id
          in: path
          required: true
          description: The profiles's ID
          schema:
            type: string
        - name: tag
          in: query
          description: A list of post tags
          schema:
            type: array
      responses:
        '200':
          description: Found posts of the profile
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: posts
                      id:
                        type: string
                      service:
                        type: string
                      name:
                        type: string
                      count:
                        type: integer
                      limit:
                        type: integer
                      artist:
                        $ref: "#/components/schemas/artist"
                      display_data:
                        type: object
                        properties:
                          service:
                            type: string
                          href:
                            type: string
                      dm_count:
                        type: integer
                      share_count:
                        type: integer
                      has_links:
                        type: string
                  base:
                    type: object
                  results:
                    type: array
                    items:
                      $ref: "#/components/schemas/post"
                  result_previews:
                    type: array
                    items:
                      type: object
                  result_attachments:
                    type: array
                    items:
                      type: object
                  result_is_image:
                    type: array
                    items:
                      type: boolean
                  disable_service_icons:
                    const: true
  /v1/{service}/user/{creator_id}/post/{post_id}:
    get:
      summary: Get a specific post
      tags:
        - Posts
      parameters:
        - name: service
          in: path
          required: true
          description: The service name
          schema:
            type: string
        - name: creator_id
          in: path
          required: true
          description: The creator's ID
          schema:
            type: string
        - name: post_id
          in: path
          required: true
          description: The post ID
          schema:
            type: string
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  post:
                    type: object
                    properties:
                      id:
                        type: string
                      user:
                        type: string
                      service:
                        type: string
                      title:
                        type: string
                      content:
                        type: string
                      embed:
                        type: object
                      shared_file:
                        type: boolean
                      added:
                        type: string
                        format: date-time
                      published:
                        type: string
                        format: date-time
                      edited:
                        type: string
                        format: date-time
                      file:
                        type: object
                        properties:
                          name:
                            type: string
                          path:
                            type: string
                      attachments:
                        type: array
                        items:
                          type: object
                          properties:
                            name:
                              type: string
                            path:
                              type: string
                      next:
                        type: string
                      prev:
                        type: string
                  attachments:
                    type: array
                  previews:
                    type: array
                  videos:
                    type: array
                  props:
                    type: object
                    properties:
                      service:
                        type: string
                      flagged:
                        type: integer
                      revisions:
                        type: array
                        items:
                          $ref: "#/components/schemas/post-revision"
              example:
                post:
                  id: '1836570'
                  user: '6570768'
                  service: fanbox
                  title: 今日はFANBOXを始まりました！
                  content: <p>みなさんこんにちは、影おじです。</p><p>先週のように、FANBOXを始まりに決定しました！</p><p>そしてFANBOXの更新内容について、アンケートのみなさん</p><p>ありがとうございました！</p><p><br/></p><p>では更新内容の詳しいことはこちらです↓</p><p>毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。</p><p>もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。</p><p><br/></p><p>これから、仕事以外の時間、できる限り勤勉な更新したいと思います！</p><p>どうぞよろしくお願いいたします！</p>
                  embed: { }
                  shared_file: false
                  added: '2021-03-30T18:00:05.973913'
                  published: '2021-01-24T17:54:38'
                  edited: '2021-01-24T18:46:15'
                  file:
                    name: a99d9674-5490-400e-acca-4bed99590699.jpg
                    path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg
                  attachments: [ ]
                  next: null
                  prev: '1836649'
        '404':
          description: Post not found
  /v1/{service}/user/{creator_id}/post/{post_id}/revision/{revision_id}:
    get:
      description: Get revision of a post
      parameters:
        - $ref: "#/components/parameters/path-service"
        - $ref: "#/components/parameters/path-creator-id"
        - $ref: "#/components/parameters/path-post-id"
        - name: revision_id
          in: path
          description: ID of the revision
          required: true
          schema:
            type: string
      responses:
        '200':
          description: A revision of the post.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: revisions
                      service:
                        type: string
                      artist:
                        $ref: "#/components/schemas/artist"
                      flagged:
                        $ref: "#/components/schemas/non-negative-integer"
                      revisions:
                        type: array
                        items:
                          $ref: "#/components/schemas/post-revision"
                  post:
                    $ref: "#/components/schemas/post-revision"
                  comments:
                    type: array
                    items:
                      $ref: "#/components/schemas/comment"
                  result_previews:
                    type: array
                  result_attachments:
                    type: array
                  videos:
                    type: array
                  archives_enabled:
                    type: boolean
        '404':
          description: Failed to find the revision of the post.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/error"
  /v1/discord/channel/{channel_id}:
    get:
      tags:
        - Discord
      summary: Get Discord channel posts by offset
      parameters:
        - name: channel_id
          in: path
          description: ID of the Discord channel
          required: true
          schema:
            type: string
        - name: o
          in: query
          description: Result offset, stepping of 150 is enforced
          schema:
            type: integer
      responses:
        '200':
          description: Discord channel found
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    author:
                      type: object
                      properties:
                        id:
                          type: string
                        avatar:
                          type: string
                        username:
                          type: string
                        public_flags:
                          type: integer
                        discriminator:
                          type: string
                    server:
                      type: string
                    channel:
                      type: string
                    content:
                      type: string
                    added:
                      type: string
                      format: date-time
                    published:
                      type: string
                      format: date-time
                    edited:
                      type: string
                      format: date-time
                    embeds:
                      type: array
                      items: { }
                    mentions:
                      type: array
                      items: { }
                    attachments:
                      type: array
                      items:
                        type: object
                        properties:
                          name:
                            type: string
                          path:
                            type: string
              example:
                - id: '942909658610413578'
                  author:
                    id: '421590382300889088'
                    avatar: 0956f3dc18eba7da9daedc4e50fb96d0
                    username: Merry
                    public_flags: 0
                    discriminator: '7849'
                  server: '455285536341491714'
                  channel: '455287420959850496'
                  content: '@everyone Happy Valentine’s Day! 💜✨'
                  added: '2022-02-15T01:26:12.708959'
                  published: '2022-02-14T22:26:21.027000'
                  edited: null
                  embeds: [ ]
                  mentions: [ ]
                  attachments: [ ]
                - id: '942909571947712594'
                  author:
                    id: '421590382300889088'
                    avatar: 0956f3dc18eba7da9daedc4e50fb96d0
                    username: Merry
                    public_flags: 0
                    discriminator: '7849'
                  server: '455285536341491714'
                  channel: '455287420959850496'
                  content: ''
                  added: '2022-02-15T01:26:13.006228'
                  published: '2022-02-14T22:26:00.365000'
                  edited: null
                  embeds: [ ]
                  mentions: [ ]
                  attachments:
                    - name: sofa_03.png
                      path: /3b/4e/3b4ed5aabdd85b26fbbc3ee9b0e5649df69167efe26b5abc24cc2a1159f446d4.png
        '404':
          description: Discord channel not found
  /v1/discord/channel/lookup/{discord_server}:
    get:
      tags:
        - Discord
      summary: Lookup Discord channels
      parameters:
        - name: discord_server
          in: path
          description: Discord Server ID
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Discord channels found
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    name:
                      type: string
              example:
                - id: '455285536341491716'
                  name: news
                - id: '455287420959850496'
                  name: nyarla-lewds
        '404':
          description: Discord server not found
  /v1/authentication/register:
    post:
      description: Register an account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
                password:
                  type: string
                confirm_password:
                  type: string
                favorites_json:
                  type: string
      responses:
        '200':
          description: Successfully registered.
          content:
            application/json:
              schema:
                const: true
        '400':
          description: Failed to register due to user errors.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/error"
  /v1/authentication/login:
    post:
      description: Sign in to account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
                password:
                  type: string
      responses:
        '200':
          description: Succefully logged in.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/account"
        '400':
          description: Failed to log in due to user errors.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/error"
        '409':
          description: Already logged in.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/error"
  /v1/authentication/logout:
    post:
      description: Logout from account
      responses:
        '200':
          description: Succefuuly logged out from account.
          content:
            application/json:
              schema:
                const: true
  /v1/account:
    get:
      description: Get account data
      security:
        - cookieAuth: [ ]
      responses:
        '200':
          description: Account data.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: account
                      title:
                        const: Your account page
                      account:
                        $ref: "#/components/schemas/account"
                      notifications_count:
                        $ref: "#/components/schemas/non-negative-integer"
  /v1/account/change_password:
    post:
      description: Change account password
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - current-password
                - new-password
                - new-password-confirmation
              properties:
                current-password:
                  type: string
                new-password:
                  type: string
                new-password-confirmation:
                  type: string
      responses:
        '200':
          description: Successfully changed account password.
          content:
            application/json:
              schema:
                const: true
  /v1/account/notifications:
    get:
      description: Get account notifications
      security:
        - cookieAuth: [ ]
      responses:
        '200':
          description: A list of account notifications.
          content:
            application/json:
              schema:
                type: object
                properties:
                  currentPage:
                    const: account
                  notifications:
                    type: array
                    items:
                      $ref: "#/components/schemas/notification"
  /v1/account/keys:
    get:
      description: Get account autoimport keys
      security:
        - cookieAuth: [ ]
      responses:
        '200':
          description: A list of account keys.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: account
                      title:
                        const: Your service keys
                      service_keys:
                        type: array
                        items:
                          $ref: "#/components/schemas/service-key"
                  import_ids:
                    type: array
                    items:
                      type: object
                      properties:
                        key_id:
                          type: string
                        import_id:
                          type: string
    post:
      security:
        - cookieAuth: [ ]
      description: Revoke account autoimport keys
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                revoke:
                  type: array
                  items:
                    $ref: "#/components/schemas/positive-integer"
      responses:
        '200':
          description: Account import keys revoked.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: account
                      redirect:
                        const: /account/keys
                      message:
                        const: "Success!"
  /v1/account/favorites:
    get:
      tags:
        - Favorites
      security:
        - cookieAuth: [ ]
      summary: List Account Favorites
      description: List account favorites (posts or creators) for the authenticated user (cookie session)
      parameters:
        - name: type
          in: query
          description: Type of favorites to list (post or creator (artist) )
          schema:
            type: string
            enum:
              - post
              - artist
      responses:
        '200':
          description: List of account favorites
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    faved_seq:
                      type: integer
                      description: The sequence number of the favorite
                    id:
                      type: string
                      description: The ID of the favorite (post or creator)
                    indexed:
                      type: string
                      description: Timestamp when the creator was indexed isoformat
                    last_imported:
                      type: string
                      description: Timestamp when the creator was last imported
                    name:
                      type: string
                      description: The name of the creator
                    service:
                      type: string
                      description: The service where the creator is located
                    updated:
                      type: string
                      description: Timestamp when the creator was last updated
        '401':
          $ref: '#/components/schemas/401'
  /v1/account/posts/upload:
    get:
      description: Upload posts.
      security:
        - cookieAuth: [ ]
      responses:
        '200':
          description: Upload posts maybe???
          content:
            application/json:
              schema:
                type: object
                properties:
                  currentPage:
                    const: posts
  /v1/account/review_dms:
    get:
      description: Get DMs for review.
      security:
        - cookieAuth: [ ]
      parameters:
        - name: status
          in: query
          description: Status of the DM.
          schema:
            enum:
              - ignored
              - pending
      responses:
        '200':
          description: A list of unapproved DMs.
          content:
            application/json:
              schema:
                type: object
                properties:
                  currentPage:
                    const: import
                  account_id:
                    $ref: "#/components/schemas/positive-integer"
                  dms:
                    type: array
                    items:
                      $ref: "#/components/schemas/unapproved-dm"
                  status:
                    enum:
                      - ignored
                      - pending
    post:
      description: Approve DMs.
      security:
        - cookieAuth: [ ]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                approved_hashes:
                  type: array
                  items:
                    type: string
                delete_ignored:
                  type: boolean
      responses:
        '200':
          description: Approved DMs.
          content:
            application/json:
              schema:
                const: true
  /v1/account/moderator/tasks/creator_links:
    get:
      security:
        - cookieAuth: [ ]
      description: Get a list of pending artist link requests
      responses:
        '200':
          description: A list of pending artist link requests.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/unapproved-link"
  /v1/account/moderator/creator_link_requests/{request_id}/approve:
    post:
      security:
        - cookieAuth: [ ]
      description: Approve a new artist link.
      responses:
        '200':
          description: Successfully approved a new artist link.
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    const: approved
  /v1/account/moderator/creator_link_requests/{request_id}/reject:
    post:
      security:
        - cookieAuth: [ ]
      description: Reject a new artist link.
      responses:
        '200':
          description: Successfully rejected a new artist link.
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    const: rejected
  /v1/favorites/post/{service}/{creator_id}/{post_id}:
    post:
      tags:
        - Favorites
      security:
        - cookieAuth: [ ]
      summary: Add Favorite Post
      description: Add a post to the user's favorite posts
      parameters:
        - name: service
          in: path
          description: Service of the post
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
        - name: post_id
          in: path
          description: The ID of the post
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Favorite post added successfully
          content: { }
        '302':
          description: Redirect to login if not authenticated
          content: { }
        '401':
          $ref: '#/components/schemas/401'
    delete:
      tags:
        - Favorites
      security:
        - cookieAuth: [ ]
      summary: Remove Favorite Post
      description: Remove a post from the user's favorite posts
      parameters:
        - name: service
          in: path
          description: The service where the post is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
        - name: post_id
          in: path
          description: The ID of the post
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Unfavorite post removed successfully
          content: { }
        '302':
          description: Redirect to login if not authenticated
          content: { }
        '401':
          $ref: '#/components/schemas/401'
  /v1/favorites/creator/{service}/{creator_id}:
    post:
      tags:
        - Favorites
      security:
        - cookieAuth: [ ]
      summary: Add Favorite creator
      description: Add an creator to the user's favorite creators
      parameters:
        - name: service
          in: path
          description: The service where the creator is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Favorite creator added successfully
          content: { }
        '302':
          description: Redirect to login if not authenticated
          content: { }
        '401':
          $ref: '#/components/schemas/401'
    delete:
      tags:
        - Favorites
      security:
        - cookieAuth: [ ]
      summary: Remove Favorite Creator
      description: Remove an creator from the user's favorite creators
      parameters:
        - name: service
          in: path
          description: The service where the creator is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Favorite creator removed successfully
          content: { }
        '302':
          description: Redirect to login if not authenticated
          content: { }
        '401':
          $ref: '#/components/schemas/401'
  /v1/search_hash/{file_hash}:
    get:
      tags:
        - File Search
      summary: Lookup file by hash
      parameters:
        - name: file_hash
          in: path
          required: true
          description: SHA-2 / SHA-256
          schema:
            type: string
            format: hex
            minLength: 64
            maxLength: 64
      responses:
        '200':
          description: File found
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  hash:
                    type: string
                  mtime:
                    type: string
                    format: date-time
                  ctime:
                    type: string
                    format: date-time
                  mime:
                    type: string
                  ext:
                    type: string
                  added:
                    type: string
                    format: date-time
                  size:
                    type: integer
                  ihash:
                    type: string
                  posts:
                    type: array
                    items:
                      type: object
                      properties:
                        file_id:
                          type: integer
                        id:
                          type: string
                        user:
                          type: string
                        service:
                          type: string
                        title:
                          type: string
                        substring:
                          type: string
                        published:
                          type: string
                          format: date-time
                        file:
                          type: object
                          properties:
                            name:
                              type: string
                            path:
                              type: string
                        attachments:
                          type: array
                          items:
                            type: object
                            properties:
                              name:
                                type: string
                              path:
                                type: string
                  discord_posts:
                    type: array
                    items:
                      type: object
                      properties:
                        file_id:
                          type: integer
                        id:
                          type: string
                        server:
                          type: string
                        channel:
                          type: string
                        substring:
                          type: string
                        published:
                          type: string
                          format: date-time
                        embeds:
                          type: array
                          items: { }
                        mentions:
                          type: array
                          items: { }
                        attachments:
                          type: array
                          items:
                            type: object
                            properties:
                              name:
                                type: string
                              path:
                                type: string
              example:
                id: 40694581
                hash: b926020cf035af45a1351e0a7e2c983ebcc93b4c751998321a6593a98277cdeb
                mtime: '2021-12-04T07:16:09.385539'
                ctime: '2021-12-04T07:16:09.385539'
                mime: image/png
                ext: .png
                added: '2021-12-04T07:16:09.443016'
                size: 10869921
                ihash: null
                posts:
                  - file_id: 108400151
                    id: '5956097'
                    user: '21101760'
                    service: fanbox
                    title: Loli Bae
                    substring: |-
                      Thank you for your continued support!
                      いつも支援ありがとうご
                    published: '2023-05-14T00:00:00'
                    file:
                      name: 8f183dac-470d-4587-9657-23efe8890a7b.jpg
                      path: /e5/1f/e51fc831dfdac7a21cc650ad46af59340e35e2a051aed8c1e65633592f4dc11c.jpg
                    attachments:
                      - name: b644eb9c-cffa-400e-9bd6-40cccb2331ba.png
                        path: /5e/b3/5eb3197668ac23bd7c473d3c750334eb206b060c610e4ac5fa1a9370fd1314d9.png
                      - name: 17f295ba-a9f2-4034-aafc-bf74904ec144.png
                        path: /88/ad/88ad2ba77c89e4d7a9dbe1f9531ba3e3077a82aee2b61efa29fda122ebe1b516.png
                discord_posts:
                  - file_id: 40694581
                    id: '769704201495904286'
                    server: '455285536341491714'
                    channel: '769703874356445216'
                    substring: ''
                    published: '2020-10-24T23:29:42.049'
                    embeds: [ ]
                    mentions: [ ]
                    attachments:
                      - name: 3.png
                        path: /b9/26/b926020cf035af45a1351e0a7e2c983ebcc93b4c751998321a6593a98277cdeb.png
        '404':
          description: File not found
  /v1/{service}/user/{creator_id}/post/{post}/flag:
    post:
      tags:
        - Post Flagging
      summary: Flag a post
      parameters:
        - name: service
          in: path
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          required: true
          schema:
            type: string
        - name: post
          in: path
          required: true
          schema:
            type: string
      responses:
        '201':
          description: Flagged successfully
          content:
            application/json:
              schema:
                const: true
        '409':
          description: Already flagged
          content:
            application/json:
              schema:
                const: true
    get:
      tags:
        - Post Flagging
      summary: Check if a Post is flagged
      description: Check if a Post is flagged
      parameters:
        - name: service
          in: path
          description: The service where the post is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The creator of the post
          required: true
          schema:
            type: string
        - name: post
          in: path
          description: The ID of the post to flag
          required: true
          schema:
            type: string
      responses:
        '200':
          description: The post is flagged
          content: { }
        '404':
          description: The post has no flag
          content: { }
  /v1/{service}/user/{creator_id}/post/{post_id}/revisions:
    get:
      tags:
        - Posts
      summary: List a Post's Revisions
      description: List revisions of a specific post by service, creator_id, and post_id
      parameters:
        - name: service
          in: path
          description: The service where the post is located
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The ID of the creator
          required: true
          schema:
            type: string
        - name: post_id
          in: path
          description: The ID of the post
          required: true
          schema:
            type: string
      responses:
        '200':
          description: List of post revisions
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    revision_id:
                      type: integer
                    id:
                      type: string
                    user:
                      type: string
                    service:
                      type: string
                    title:
                      type: string
                    content:
                      type: string
                    embed:
                      type: object
                    shared_file:
                      type: boolean
                    added:
                      type: string
                      format: date-time
                    published:
                      type: string
                      format: date-time
                    edited:
                      type: string
                      format: date-time
                    file:
                      type: object
                      properties:
                        name:
                          type: string
                        path:
                          type: string
                    attachments:
                      type: array
                      items:
                        type: object
                        properties:
                          name:
                            type: string
                          path:
                            type: string
              example:
                - revision_id: 8059287
                  id: '1836570'
                  user: '6570768'
                  service: fanbox
                  title: 今日はFANBOXを始まりました！
                  content: <p>みなさんこんにちは、影おじです。</p><p>先週のように、FANBOXを始まりに決定しました！</p><p>そしてFANBOXの更新内容について、アンケートのみなさん</p><p>ありがとうございました！</p><p><br/></p><p>では更新内容の詳しいことはこちらです↓</p><p>毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。</p><p>もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。</p><p><br/></p><p>これから、仕事以外の時間、できる限り勤勉な更新したいと思います！</p><p>どうぞよろしくお願いいたします！</p>
                  embed: { }
                  shared_file: false
                  added: '2023-09-19T13:19:57.416086'
                  published: '2021-01-24T17:54:38'
                  edited: '2021-01-24T18:46:15'
                  file:
                    name: 8c2be0fd-a130-4afb-9314-80f2501d94f7.jpg
                    path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg
                  attachments:
                    - name: attachment1.jpg
                      path: /attachments/attachment1.jpg
                    - name: attachment2.jpg
                      path: /attachments/attachment2.jpg
                - revision_id: 6770513
                  id: '1836570'
                  user: '6570768'
                  service: fanbox
                  title: 今日はFANBOXを始まりました！
                  content: <p>みなさんこんにちは、影おじです。</p><p>先週のように、FANBOXを始まりに決定しました！</p><p>そしてFANBOXの更新内容について、アンケートのみなさん</p><p>ありがとうございました！</p><p><br/></p><p>では更新内容の詳しいことはこちらです↓</p><p>毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。</p><p>もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。</p><p><br/></p><p>これから、仕事以外の時間、できる限り勤勉な更新したいと思います！</p><p>どうぞよろしくお願いいたします！</p>
                  embed: { }
                  shared_file: false
                  added: '2023-07-28T23:51:25.477291'
                  published: '2021-01-24T17:54:38'
                  edited: '2021-01-24T18:46:15'
                  file:
                    name: 0d133e49-a2d4-4733-9044-dd57e25b1fce.jpg
                    path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg
                  attachments:
                    - name: attachment3.jpg
                      path: /attachments/attachment3.jpg
                    - name: attachment4.jpg
                      path: /attachments/attachment4.jpg
        '404':
          description: Post not found
  /v1/{service}/user/{creator_id}/post/{post_id}/comments:
    get:
      tags:
        - Comments
      summary: List a post's comments
      description: List comments for a specific post by service, creator_id, and post_id.
      parameters:
        - name: service
          in: path
          description: The post's service.
          required: true
          schema:
            type: string
        - name: creator_id
          in: path
          description: The service ID of the post's creator.
          required: true
          schema:
            type: string
        - name: post_id
          in: path
          description: The service ID of the post.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: List of post comments.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    parent_id:
                      type: string
                        - string
                        - null
                    commenter:
                      type: string
                    content:
                      type: string
                    published:
                      type: string
                      format: date-time
                    revisions:
                      type: array
                      items:
                        type: object
                        properties:
                          id:
                            type: integer
                          content:
                            type: string
                          added:
                            type: string
                            format: date-time
              example:
                - id: "121508687"
                  parent_id: null
                  commenter: "84534108"
                  content: "YOU DREW MORE YAYYYY"
                  published: "2023-11-05T20:17:47.635000"
                  revisions:
                    - id: 1
                      content: "YOU DREW MORE YAYYYY2222222"
                      added: "2023-11-14T03:09:12.275975"
        '404':
          description: No comments found.
  /v1/artists/random:
    get:
      description: Get a random artist
      responses:
        '200':
          description: A random artist.
          content:
            application/json:
              schema:
                type: object
                properties:
                  service:
                    type: string
                  artist_id:
                    type: string
        '404':
          description: No random artst exists.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/error"
  /v1/shares:
    get:
      description: Get a list of shares
      parameters:
        - name: o
          in: query
          description: List's offset
          schema:
            $ref: "#/components/schemas/non-negative-integer"
      responses:
        '200':
          description: A list of shares.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: shares
                      count:
                        $ref: "#/components/schemas/non-negative-integer"
                      shares:
                        type: array
                        items:
                          $ref: "#/components/schemas/share"
                      limit:
                        $ref: "#/components/schemas/non-negative-integer"
                  base:
                    type: object
  /v1/share/{share_id}:
    get:
      description: Get details of the share.
      parameters:
        - name: share_id
          in: path
          description: ID of the share.
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Details of the share.
          content:
            application/json:
              schema:
                type: object
                properties:
                  share_files:
                    type: array
                  share:
                    $ref: "#/components/schemas/share"
                  base:
                    type: object
  /v1/dms:
    get:
      description: Get a list of DMs.
      parameters:
        - name: o
          in: query
          description: List's offset
          schema:
            $ref: "#/components/schemas/non-negative-integer"
        - name: q
          in: query
          description: Search query
          schema:
            type: string
      responses:
        '200':
          description: A list of DMs.
          content:
            application/json:
              schema:
                type: object
                properties:
                  props:
                    type: object
                    properties:
                      currentPage:
                        const: artists
                      count:
                        $ref: "#/components/schemas/non-negative-integer"
                      limit:
                        $ref: "#/components/schemas/non-negative-integer"
                      dms:
                        type: array
                        items:
                          $ref: "#/components/schemas/approved-dm"
                  base:
                    type: object
                    properties:
                      q:
                        type: string
  /v1/has_pending_dms:
    get:
      description: Check if there are pending DMs.
      responses:
        '200':
          description: There are pending DMs.
          content:
            application/json:
              schema:
                type: boolean
  /v1/app_version:
    get:
      tags:
        - Misc
      summary: Git Commit Hash
      description: Show current App commit hash
      responses:
        '200':
          description: Commit Hash
          content:
            text/plain:
              schema:
                type: string
                format: hex
                minLength: 40
                maxLength: 40
                examples:
                  - 3b9cd5fab1d35316436968fe85c90ff2de0cdca0
  /v1/importer/submit:
    post:
      description: Create a site import
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                session_key:
                  type: string
                auto_import:
                  type: string
                save_session_key:
                  type: string
                save_dms:
                  type: string
                channel_ids:
                  type: string
                x-bc:
                  type: string
                auth_id:
                  type: string
                user_agent:
                  type: string
      responses:
        '200':
          description: Succesfully added new import
          content:
            application/json:
              schema:
                type: object
                properties:
                  import_id:
                    type: string
  /v1/importer/logs/{import_id}:
    get:
      responses:
        '200':
          description: Get import logs
          content:
            application/json:
              schema:
                type: array
components:
  parameters:
    path-service:
      name: service
      in: path
      description: The service where the creator is located
      required: true
      schema:
        type: string
    path-creator-id:
      name: creator_id
      in: path
      description: ID of the creator
      required: true
      schema:
        type: string
    path-post-id:
      name: post_id
      in: path
      description: ID of the post
      required: true
      schema:
        type: string
    path-page:
      name: page
      in: path
      description: Page of the collection.
      required: true
      schema:
        $ref: "#/components/schemas/positive-integer"
    query-q:
      name: q
      in: query
      description: Search query
      schema:
         type: string
         minLength: 3
    query-o:
      name: o
      in: query
      description: Result offset, stepping of 50 is enforced
      schema:
        type: integer
  securitySchemes:
    cookieAuth:
      description: Session key that can be found in cookies after a successful login
      type: apiKey
      in: cookie
      name: session
  schemas:
    request-body:
      title: RequestBody
      description: Body of the request to V2 API. Must always be present on methods which allow a body.
      type: object
      additionalProperties: false
      required:
        - type
      properties:
        type:
          const: Sneed's Feed & Seed (formerly Chuck's)
    request-body-with-data:
      title: RequestBodyWithData
      description: Body of the request with extra data to V2 API.
      type: object
      additionalProperties: false
      required:
        - type
        - data
      properties:
        type:
          const: Sneed's Feed & Seed (formerly Chuck's)
        data: true
    response-body-success:
      title: ResponseBodySuccess
      description: Body of the successful response from V2 API.
      type: object
      additionalProperties: false
      required:
        - type
        - data
      properties:
        type:
          const: Chuck's Fuck & Suck (formerly Boyle's)
        data: true
    response-body-error:
      title: ResponseBodyError
      description: Body of the error response from V2 API.
      type: object
      additionalProperties: false
      required:
        - type
        - data
      properties:
        type:
          const: Boyle's Foil & Soil (formerly Sneed's)
        error:
          type: object
          additionalProperties: false
          required:
            - type
          properties:
            type:
              type: string
            message:
              type: string
    error:
      title: Error
      description: Error message
      type: object
      properties:
        error:
          type: string
    '401':
      title: Unauthorized
      description: Unauthorized Access
    non-negative-integer:
      title: NonNegativeInteger
      description: Integer which cannot be below zero.
      type: integer
      minimum: 0
    positive-integer:
      title: PositiveInteger
      description: Integer which is always above zero.
      type: integer
      minimum: 1
    hash-sha256:
      title: HashSHA256
      type: string
      minLength: 64
      maxLength: 64
    artist:
      title: Artist
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        service:
          type: string
        indexed:
          type: string
        updated:
          type: string
        public_id:
          type: string
        relation_id:
          type: integer
    tag:
      title: Tag
      type: object
      properties:
        tag:
          type: string
        post_count:
          type: integer
    share:
      title: Share
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        uploader:
          type: integer
        added:
          type: string
    approved-dm:
      title: ApprovedDM
      description: The public visible DM.
      type: object
      required:
        - hash
        - user
        - service
        - content
        - embed
        - file
        - added
        - published
      properties:
        hash:
          type: string
        user:
          type: string
        service:
          type: string
        content:
          type: string
        embed:
          type: object
        file:
          type: object
        added:
          type: string
        published:
          type: string
        artist:
          $ref: "#/components/schemas/artist"
    unapproved-dm:
      title: UnapprovedDM
      description: The DM which is shown to the importing user.
      type: object
      properties:
        hash:
          type: string
        user:
          type: string
        artist:
          type: object
        import_id:
          type: string
        contributor_id:
          type: string
        service:
          type: string
        content:
          type: string
        embed:
          type: object
        file:
          type: object
        added:
          type: string
        published:
          type: string
    post:
      title: Post
      type: object
      properties:
        id:
          type: string
        user:
          type: string
        service:
          type: string
        title:
          type: string
        content:
          type: string
        embed:
          type: object
        shared_file:
          type: boolean
        added:
          type: string
        published:
          type: string
        edited:
          type: string
        file:
          type: object
        attachments:
          type: array
          items:
            type: object
    post-with-fav-count:
      title: Post
      type: object
      properties:
        id:
          type: string
        user:
          type: string
        service:
          type: string
        title:
          type: string
        content:
          type: string
        embed:
          type: object
        shared_file:
          type: boolean
        added:
          type: string
        published:
          type: string
        edited:
          type: string
        file:
          type: object
        attachments:
          type: array
          items:
            type: object
        fav_count:
          type: integer
    post-revision:
      title: PostRevision
      type: object
      properties:
        revision_id:
          $ref: "#/components/schemas/positive-integer"
        id:
          type: string
        user:
          type: string
        service:
          type: string
        title:
          type: string
        content:
          type: string
        embed:
          type: object
        shared_file:
          anyOf:
            - type: boolean
            - const: "0"
        added:
          type: string
        published:
          type: string
        edited:
          type: string
        file:
          type: object
        attachments:
          type: array
          items:
            type: object
        size:
          $ref: "#/components/schemas/non-negative-integer"
        ihash:
          type: string
        poll:
          type: object
        tags:
          type: array
          items:
            type: string
        captions:
          type: object
    comment:
      type: object
      properties:
        id:
          type: string
        post_id:
          type: string
        parent_id:
          type: string
        commenter:
          type: string
        service:
          type: string
        content:
          type: string
        added:
          type: string
        published:
          type: string
        deleted_at:
          type: string
        commenter_name:
          type: string
    file:
      title: File
      type: object
      properties:
        id:
          type: integer
        hash:
          type: string
        mtime:
          type: string
        ctime:
          type: string
        mime:
          type: string
        ext:
          type: string
        added:
          type: string
        size:
          type: integer
        ihash:
          type: string
    archive-info:
      title: ArchiveInfo
      type: object
      required:
        - file
        - file_list
      properties:
        file:
          $ref: "#/components/schemas/file"
        file_list:
          type: array
          items:
            type: string
        password:
          type: string
    account:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/positive-integer"
        username:
          type: string
        created_at:
          type: string
        role:
          enum:
            - consumer
            - moderator
            - administrator
    notification:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/positive-integer"
        created_at:
          type: string
        account_id:
          $ref: "#/components/schemas/positive-integer"
        is_seen:
          type: boolean
        type:
          type: string
        extra_info:
          type: object
    service-key:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/positive-integer"
        service:
          type: string
        added:
          type: string
        dead:
          type: boolean
        contributor_id:
          $ref: "#/components/schemas/positive-integer"
        encrypted_key:
          type: string
        discord_channel_ids:
          type: string
    pagination:
      title: Pagination
      description: Pagination info of a collection.
      type: object
      properties:
        current_page:
          $ref: "#/components/schemas/positive-integer"
        limit:
          $ref: "#/components/schemas/positive-integer"
        base:
          type: object
        offset:
          $ref: "#/components/schemas/non-negative-integer"
        count:
          $ref: "#/components/schemas/non-negative-integer"
        current_count:
          $ref: "#/components/schemas/non-negative-integer"
        total_pages:
          $ref: "#/components/schemas/positive-integer"
    unapproved-link:
      type: object
      properties:
        id:
          $ref: "#/components/schemas/positive-integer"
        from_service:
          type: string
        from_id:
          type: string
        to_service:
          type: string
        to_id:
          type: string
        reason:
          type: string
        requester_id:
          $ref: "#/components/schemas/positive-integer"
        status:
          const: pending
        from_creator:
          type: object
        to_creator:
          type: object
        requester:
          type: object
