---
openapi: 3.0.1
info:
  title: SprintFlint API
  version: v1
  description: REST API for SprintFlint sprint ticketing platform. Use API tokens
    for authentication.
  contact:
    name: SprintFlint Support
paths:
  "/api/v1/projects/{project_id}/sprints/{sprint_id}/issues/{issue_id}/comments":
    parameters:
    - name: project_id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    - name: sprint_id
      in: path
      description: Sprint ID
      required: true
      schema:
        type: integer
    - name: issue_id
      in: path
      description: Issue ID
      required: true
      schema:
        type: integer
    get:
      summary: List all comments
      tags:
      - Comments
      description: Returns a list of all comments on the issue, ordered by creation
        date
      security:
      - api_token: []
      responses:
        '200':
          description: comments found
          content:
            application/json:
              schema:
                type: array
                items:
                  "$ref": "#/components/schemas/comment"
    post:
      summary: Create a comment
      tags:
      - Comments
      description: Creates a new comment on the issue. The comment author will be
        the API token owner.
      security:
      - api_token: []
      parameters: []
      responses:
        '201':
          description: comment created
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/comment"
        '422':
          description: validation errors
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/errors"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                comment:
                  type: object
                  properties:
                    body:
                      type: string
                      description: Comment body text
                  required:
                  - body
  "/api/v1/comments/{id}":
    parameters:
    - name: id
      in: path
      description: Comment ID
      required: true
      schema:
        type: integer
    get:
      summary: Retrieve a comment
      tags:
      - Comments
      description: Returns a single comment with all details
      security:
      - api_token: []
      responses:
        '200':
          description: comment found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/comment"
        '404':
          description: comment not found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error"
    patch:
      summary: Update a comment
      tags:
      - Comments
      description: Updates an existing comment. Only the comment author can update
        their own comments.
      security:
      - api_token: []
      parameters: []
      responses:
        '200':
          description: comment updated
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/comment"
        '403':
          description: forbidden - not the comment author
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error"
        '422':
          description: validation errors
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/errors"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                comment:
                  type: object
                  properties:
                    body:
                      type: string
                      description: Comment body text
    delete:
      summary: Delete a comment
      tags:
      - Comments
      description: Deletes a comment. Only the comment author can delete their own
        comments.
      security:
      - api_token: []
      responses:
        '204':
          description: comment deleted
        '403':
          description: forbidden - not the comment author
        '404':
          description: comment not found
  "/api/v1/projects/{project_id}/sprints/{sprint_id}/issues":
    parameters:
    - name: project_id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    - name: sprint_id
      in: path
      description: Sprint ID
      required: true
      schema:
        type: integer
    get:
      summary: List all issues
      tags:
      - Issues
      description: Returns a list of all issues in the sprint, ordered by position
      security:
      - api_token: []
      responses:
        '200':
          description: issues found
          content:
            application/json:
              schema:
                type: array
                items:
                  "$ref": "#/components/schemas/issue"
    post:
      summary: Create an issue
      tags:
      - Issues
      description: Creates a new issue (ticket) in the sprint
      security:
      - api_token: []
      parameters: []
      responses:
        '201':
          description: issue created
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/issue"
        '422':
          description: validation errors
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/errors"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                issue:
                  type: object
                  properties:
                    title:
                      type: string
                      description: Issue title
                    description:
                      type: string
                      description: Issue description
                    status:
                      type: string
                      enum:
                      - backlog
                      - todo
                      - in_progress
                      - done
                      - cancelled
                      description: Issue status
                    story_points:
                      type: integer
                      description: Story points estimate
                    assignee_id:
                      type: integer
                      description: Assignee account ID
                  required:
                  - title
  "/api/v1/projects/{project_id}/sprints/{sprint_id}/issues/{id}":
    parameters:
    - name: project_id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    - name: sprint_id
      in: path
      description: Sprint ID
      required: true
      schema:
        type: integer
    - name: id
      in: path
      description: Issue ID
      required: true
      schema:
        type: integer
    get:
      summary: Retrieve an issue
      tags:
      - Issues
      description: Returns a single issue with all details
      security:
      - api_token: []
      responses:
        '200':
          description: issue found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/issue"
        '404':
          description: issue not found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error"
    patch:
      summary: Update an issue
      tags:
      - Issues
      description: Updates an existing issue. Use this to change status, assign users,
        or update story points.
      security:
      - api_token: []
      parameters: []
      responses:
        '200':
          description: issue updated
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/issue"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                issue:
                  type: object
                  properties:
                    title:
                      type: string
                    description:
                      type: string
                    status:
                      type: string
                      enum:
                      - backlog
                      - todo
                      - in_progress
                      - done
                      - cancelled
                    story_points:
                      type: integer
                    assignee_id:
                      type: integer
                    position:
                      type: integer
    delete:
      summary: Delete an issue
      tags:
      - Issues
      description: Deletes an issue and all associated comments
      security:
      - api_token: []
      responses:
        '204':
          description: issue deleted
  "/api/v1/projects":
    get:
      summary: List all projects
      tags:
      - Projects
      description: Returns a list of all projects in the organisation
      security:
      - api_token: []
      responses:
        '200':
          description: projects found
          content:
            application/json:
              schema:
                type: array
                items:
                  "$ref": "#/components/schemas/project"
        '401':
          description: unauthorized
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error"
    post:
      summary: Create a project
      tags:
      - Projects
      description: Creates a new project in the organisation
      security:
      - api_token: []
      parameters: []
      responses:
        '201':
          description: project created
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/project"
        '422':
          description: validation errors
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/errors"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                project:
                  type: object
                  properties:
                    name:
                      type: string
                      description: Project name
                    prefix:
                      type: string
                      description: Issue prefix (2-4 uppercase alphanumeric characters)
                    description:
                      type: string
                      description: Project description
                    documentation_url:
                      type: string
                      description: Documentation URL
                    production_url:
                      type: string
                      description: Production URL
                  required:
                  - name
                  - prefix
  "/api/v1/projects/{id}":
    parameters:
    - name: id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    get:
      summary: Retrieve a project
      tags:
      - Projects
      description: Returns a single project
      security:
      - api_token: []
      responses:
        '200':
          description: project found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/project"
        '404':
          description: project not found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error"
    patch:
      summary: Update a project
      tags:
      - Projects
      description: Updates an existing project
      security:
      - api_token: []
      parameters: []
      responses:
        '200':
          description: project updated
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/project"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                project:
                  type: object
                  properties:
                    name:
                      type: string
                    prefix:
                      type: string
                    description:
                      type: string
                    documentation_url:
                      type: string
                    production_url:
                      type: string
    delete:
      summary: Delete a project
      tags:
      - Projects
      description: Deletes a project and all associated sprints and issues. Only admins
        can delete projects.
      security:
      - api_token: []
      responses:
        '204':
          description: project deleted
        '403':
          description: forbidden - not an admin
  "/api/v1/projects/{project_id}/sprints":
    parameters:
    - name: project_id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    get:
      summary: List all sprints
      tags:
      - Sprints
      description: Returns a list of all sprints in the project
      security:
      - api_token: []
      responses:
        '200':
          description: sprints found
          content:
            application/json:
              schema:
                type: array
                items:
                  "$ref": "#/components/schemas/sprint"
    post:
      summary: Create a sprint
      tags:
      - Sprints
      description: Creates a new sprint in the project
      security:
      - api_token: []
      parameters: []
      responses:
        '201':
          description: sprint created
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/sprint"
        '422':
          description: validation errors
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/errors"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                sprint:
                  type: object
                  properties:
                    name:
                      type: string
                      description: Sprint name
                    description:
                      type: string
                      description: Sprint description
                    start_date:
                      type: string
                      format: date
                      description: Start date (YYYY-MM-DD)
                    end_date:
                      type: string
                      format: date
                      description: End date (YYYY-MM-DD)
                    sprint_lead_id:
                      type: integer
                      description: Sprint lead account ID
                  required:
                  - name
  "/api/v1/projects/{project_id}/sprints/{id}":
    parameters:
    - name: project_id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    - name: id
      in: path
      description: Sprint ID
      required: true
      schema:
        type: integer
    get:
      summary: Retrieve a sprint
      tags:
      - Sprints
      description: Returns a single sprint with story point statistics
      security:
      - api_token: []
      responses:
        '200':
          description: sprint found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/sprint"
        '404':
          description: sprint not found
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error"
    patch:
      summary: Update a sprint
      tags:
      - Sprints
      description: Updates an existing sprint
      security:
      - api_token: []
      parameters: []
      responses:
        '200':
          description: sprint updated
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/sprint"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                sprint:
                  type: object
                  properties:
                    name:
                      type: string
                    description:
                      type: string
                    start_date:
                      type: string
                      format: date
                    end_date:
                      type: string
                      format: date
                    sprint_lead_id:
                      type: integer
    delete:
      summary: Delete a sprint
      tags:
      - Sprints
      description: Deletes a sprint and all associated issues. Only admins can delete
        sprints.
      security:
      - api_token: []
      responses:
        '204':
          description: sprint deleted
        '403':
          description: forbidden - not an admin
  "/api/v1/projects/{project_id}/sprints/{id}/activate":
    parameters:
    - name: project_id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    - name: id
      in: path
      description: Sprint ID
      required: true
      schema:
        type: integer
    post:
      summary: Activate a sprint
      tags:
      - Sprints
      description: Transitions a sprint from planning to active status
      security:
      - api_token: []
      responses:
        '200':
          description: sprint activated
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/sprint"
        '422':
          description: cannot activate
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/error"
  "/api/v1/projects/{project_id}/sprints/{id}/complete":
    parameters:
    - name: project_id
      in: path
      description: Project ID
      required: true
      schema:
        type: integer
    - name: id
      in: path
      description: Sprint ID
      required: true
      schema:
        type: integer
    post:
      summary: Complete a sprint
      tags:
      - Sprints
      description: Transitions a sprint to completed status
      security:
      - api_token: []
      responses:
        '200':
          description: sprint completed
          content:
            application/json:
              schema:
                "$ref": "#/components/schemas/sprint"
servers:
- url: "{protocol}://{host}"
  variables:
    protocol:
      default: https
      enum:
      - https
      - http
    host:
      default: sprintflint.com
components:
  securitySchemes:
    api_token:
      type: apiKey
      name: X-API-Token
      in: header
      description: API token for authentication. Generate one from your account settings.
  schemas:
    error:
      type: object
      properties:
        error:
          type: string
      required:
      - error
    errors:
      type: object
      properties:
        errors:
          type: array
          items:
            type: string
      required:
      - errors
    project:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        prefix:
          type: string
        description:
          type: string
          nullable: true
        documentation_url:
          type: string
          nullable: true
        production_url:
          type: string
          nullable: true
        github_repo_owner:
          type: string
          nullable: true
        github_repo_name:
          type: string
          nullable: true
        sprints_count:
          type: integer
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
      - id
      - name
      - prefix
      - sprints_count
      - created_at
      - updated_at
    sprint:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        slug:
          type: string
        description:
          type: string
          nullable: true
        status:
          type: string
          enum:
          - planning
          - active
          - completed
        start_date:
          type: string
          format: date
          nullable: true
        end_date:
          type: string
          format: date
          nullable: true
        actual_end_date:
          type: string
          format: date
          nullable: true
        issues_count:
          type: integer
        total_story_points:
          type: integer
        completed_story_points:
          type: integer
        project_id:
          type: integer
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
      - id
      - name
      - status
      - issues_count
      - project_id
      - created_at
      - updated_at
    issue:
      type: object
      properties:
        id:
          type: integer
        title:
          type: string
        description:
          type: string
          nullable: true
        status:
          type: string
          enum:
          - backlog
          - todo
          - in_progress
          - done
          - cancelled
        story_points:
          type: integer
          nullable: true
        position:
          type: integer
        issue_number:
          type: string
          nullable: true
        sprint_id:
          type: integer
        assignee_id:
          type: integer
          nullable: true
        started_at:
          type: string
          format: date-time
          nullable: true
        completed_at:
          type: string
          format: date-time
          nullable: true
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
      - id
      - title
      - status
      - position
      - sprint_id
      - created_at
      - updated_at
    comment:
      type: object
      properties:
        id:
          type: integer
        body:
          type: string
        issue_id:
          type: integer
        author_id:
          type: integer
        author_name:
          type: string
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
      - id
      - body
      - issue_id
      - author_id
      - created_at
      - updated_at
security:
- api_token: []
