Vikunja API

Vikunja API as documented publicly: 20 operations. Contract generated from the documentation by API Evangelist (2026-10-28); not the provider's own document.

Operations 20

GET /.well-known/openid-configuration GET /.well-known/openid-configuration #
GET /api/v1/filters List all saved filters #
PUT /api/v1/filters Create a saved filter #
DELETE /api/v1/filters/{id} Delete a saved filter #
GET /api/v1/filters/{id} Get a specific saved filter #
POST /api/v1/filters/{id} Update a saved filter #
GET /api/v1/labels Lookup label IDs #
GET /api/v1/plugins/user-profile GET /api/v1/plugins/user-profile #
GET /api/v1/projects Lookup project IDs #
GET /api/v1/projects/{id}/webhooks List all webhooks for a project #
PUT /api/v1/projects/{id}/webhooks Create a webhook for a project #
DELETE /api/v1/projects/{id}/webhooks/{webhookid} Delete a webhook #
POST /api/v1/projects/{id}/webhooks/{webhookid} Update a webhook #
GET /api/v1/user/settings/webhooks List all webhooks for the current user #
PUT /api/v1/user/settings/webhooks Create a user webhook #
DELETE /api/v1/user/settings/webhooks/{webhookid} Delete a user webhook #
POST /api/v1/user/settings/webhooks/{webhookid} Update a user webhook #
PATCH /api/v2/labels/{labelId} PATCH for partial updates #
POST /plugins/webhook POST /plugins/webhook #
GET /repos/gpg.key GET /repos/gpg.key #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/vikunja:vikunja-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

vikunja-openapi-generated.yml Raw ↑
openapi: 3.1.0
info:
  title: Vikunja API
  version: '2026-10-28'
  description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-10-28: 20 operation(s) read from 7 public documentation page(s) (each operation
    names its page in x-source). This is not the provider''s published contract; Vikunja has published no machine-readable contract that the pipeline
    could find. Engine: local.'
  x-evidence-tiers:
    code-example: 4
    documentation: 16
    pages-with-code: 3
    pages-read: 7
  x-generated-from: documentation
  x-provenance: generated
  x-authored-by: API Evangelist
  x-generated: '2026-10-28'
  x-generator: generate-contract-from-docs.py
  x-engine: local
  x-sources:
  - https://vikunja.io/docs/api-v2
  - https://vikunja.io/docs/filters
  - https://vikunja.io/docs/webhooks
  - https://vikunja.io/docs/fail2ban
  - https://vikunja.io/docs/installing
  - https://vikunja.io/docs/openid
  - https://vikunja.io/docs/plugins
servers:
- url: https://dl.vikunja.io
paths:
  /.well-known/openid-configuration:
    get:
      operationId: get_well_known_openid_configuration
      tags:
      - API
      summary: GET /.well-known/openid-configuration
      x-source: https://vikunja.io/docs/openid
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl https://your-provider/.well-known/openid-configuration | jq . \n Verify that the authorization_endpoint , token_endpoint\
          \ , and userinfo_endpoint values point to the correct host and port. \n Vikunja can’t reach the provider through a proxy # \n Routing\
          \ OpenID Connect requests through a proxy is available from Vikunja 2.7.0 onwards (or unstable builds). \n If you configured an outgoing\
          \ proxy , Vik"
  /api/v1/filters:
    get:
      operationId: get_api_v1_filters
      tags:
      - Api
      summary: List all saved filters
      x-source: https://vikunja.io/docs/filters
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV1FiltersResponse'
      x-evidence:
        kind: documentation
    put:
      operationId: put_api_v1_filters
      tags:
      - Api
      summary: Create a saved filter
      x-source: https://vikunja.io/docs/filters
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutApiV1FiltersRequest'
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PutApiV1FiltersResponse'
      x-evidence:
        kind: documentation
  /api/v1/filters/{id}:
    delete:
      operationId: delete_api_v1_filters_id
      tags:
      - Api
      summary: Delete a saved filter
      x-source: https://vikunja.io/docs/filters
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    get:
      operationId: get_api_v1_filters_id
      tags:
      - Api
      summary: Get a specific saved filter
      x-source: https://vikunja.io/docs/filters
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetApiV1FiltersIdResponse'
      x-evidence:
        kind: documentation
    post:
      operationId: post_api_v1_filters_id
      tags:
      - Api
      summary: Update a saved filter
      x-source: https://vikunja.io/docs/filters
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostApiV1FiltersIdRequest'
      responses:
        '201':
          description: Success (status as documented)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostApiV1FiltersIdResponse'
      x-evidence:
        kind: documentation
  /api/v1/labels:
    get:
      operationId: get_api_v1_labels
      tags:
      - Api
      summary: Lookup label IDs
      x-source: https://vikunja.io/docs/filters
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/v1/plugins/user-profile:
    get:
      operationId: get_api_v1_plugins_user_profile
      tags:
      - Api
      summary: GET /api/v1/plugins/user-profile
      x-source: https://vikunja.io/docs/plugins
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -H \"Authorization: Bearer YOUR_JWT_TOKEN\"  https://your-vikunja.com/api/v1/plugins/user-profile \n Public Endpoints #\
          \ \n No authentication required (rate-limited): "
  /api/v1/projects:
    get:
      operationId: get_api_v1_projects
      tags:
      - Api
      summary: Lookup project IDs
      x-source: https://vikunja.io/docs/filters
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/v1/projects/{id}/webhooks:
    get:
      operationId: get_api_v1_projects_id_webhooks
      tags:
      - Api
      summary: List all webhooks for a project
      x-source: https://vikunja.io/docs/webhooks
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    put:
      operationId: put_api_v1_projects_id_webhooks
      tags:
      - Api
      summary: Create a webhook for a project
      x-source: https://vikunja.io/docs/webhooks
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/v1/projects/{id}/webhooks/{webhookid}:
    delete:
      operationId: delete_api_v1_projects_id_webhooks_webhookid
      tags:
      - Api
      summary: Delete a webhook
      x-source: https://vikunja.io/docs/webhooks
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      - name: webhookid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    post:
      operationId: post_api_v1_projects_id_webhooks_webhookid
      tags:
      - Api
      summary: Update a webhook
      x-source: https://vikunja.io/docs/webhooks
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      - name: webhookid
        in: path
        required: true
        schema:
          type: string
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/v1/user/settings/webhooks:
    get:
      operationId: get_api_v1_user_settings_webhooks
      tags:
      - Api
      summary: List all webhooks for the current user
      x-source: https://vikunja.io/docs/webhooks
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    put:
      operationId: put_api_v1_user_settings_webhooks
      tags:
      - Api
      summary: Create a user webhook
      x-source: https://vikunja.io/docs/webhooks
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/v1/user/settings/webhooks/{webhookid}:
    delete:
      operationId: delete_api_v1_user_settings_webhooks_webhookid
      tags:
      - Api
      summary: Delete a user webhook
      x-source: https://vikunja.io/docs/webhooks
      parameters:
      - name: webhookid
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
    post:
      operationId: post_api_v1_user_settings_webhooks_webhookid
      tags:
      - Api
      summary: Update a user webhook
      x-source: https://vikunja.io/docs/webhooks
      parameters:
      - name: webhookid
        in: path
        required: true
        schema:
          type: string
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /api/v2/labels/{labelId}:
    patch:
      operationId: patch_api_v2_labels_labelId
      tags:
      - Api
      summary: PATCH for partial updates
      x-source: https://vikunja.io/docs/api-v2
      parameters:
      - name: labelId
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchApiV2LabelsLabelidRequest'
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: documentation
  /plugins/webhook:
    post:
      operationId: post_plugins_webhook
      tags:
      - Plugins
      summary: POST /plugins/webhook
      x-source: https://vikunja.io/docs/plugins
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PostPluginsWebhookRequest'
      responses:
        '201':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: "curl -X POST  -H \"Content-Type: application/json\"  -d '{\"event\": \"test\"}'  https://your-vikunja.com/plugins/webhook \n\
          \ Database Changes # \n Some plugins run database migrations to add new tables or modify existing ones. These run automatically when:\
          \ \n Plugin is first loaded \n Plugin version is upgraded \n Vikunja starts with plugin enabled \n Troubleshooting # \n Plugin Won’t\
          \ Load # \n Error : Failed t"
  /repos/gpg.key:
    get:
      operationId: get_repos_gpg_key
      tags:
      - Repos
      summary: GET /repos/gpg.key
      x-source: https://vikunja.io/docs/installing
      responses:
        '200':
          description: Success (status as documented)
      x-evidence:
        kind: code-example
        language: curl
        snippet: 'curl -fsSL https://dl.vikunja.io/repos/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/vikunja.gpg '
components:
  schemas:
    GetApiV1FiltersResponse:
      type: object
      properties:
        id:
          type: integer
          description: Filter ID
        title:
          type: string
          description: Filter title
        description:
          type: string
          description: Filter description
        filters:
          type: object
          description: Filter definition object
        is_favorite:
          type: boolean
          description: Whether the filter is marked as favorite
        created:
          type: string
          description: Creation timestamp
        updated:
          type: string
          description: Last update timestamp
    PutApiV1FiltersRequest:
      type: object
      properties:
        title:
          type: string
          description: Filter title
        description:
          type: string
          description: Filter description
        filters:
          type: object
          description: Filter definition object
        is_favorite:
          type: boolean
          description: Mark as favorite
      required:
      - title
      - filters
    PutApiV1FiltersResponse:
      type: object
      properties:
        id:
          type: integer
          description: Created filter ID
        title:
          type: string
          description: Filter title
        description:
          type: string
          description: Filter description
        filters:
          type: object
          description: Filter definition object
        is_favorite:
          type: boolean
          description: Whether the filter is marked as favorite
        created:
          type: string
          description: Creation timestamp
        updated:
          type: string
          description: Last update timestamp
    GetApiV1FiltersIdResponse:
      type: object
      properties:
        id:
          type: integer
          description: Filter ID
        title:
          type: string
          description: Filter title
        description:
          type: string
          description: Filter description
        filters:
          type: object
          description: Filter definition object
        is_favorite:
          type: boolean
          description: Whether the filter is marked as favorite
        created:
          type: string
          description: Creation timestamp
        updated:
          type: string
          description: Last update timestamp
    PostApiV1FiltersIdRequest:
      type: object
      properties:
        title:
          type: string
          description: Filter title
        description:
          type: string
          description: Filter description
        filters:
          type: object
          description: Filter definition object
        is_favorite:
          type: boolean
          description: Mark as favorite
    PostApiV1FiltersIdResponse:
      type: object
      properties:
        id:
          type: integer
          description: Filter ID
        title:
          type: string
          description: Filter title
        description:
          type: string
          description: Filter description
        filters:
          type: object
          description: Filter definition object
        is_favorite:
          type: boolean
          description: Whether the filter is marked as favorite
        created:
          type: string
          description: Creation timestamp
        updated:
          type: string
          description: Last update timestamp
    PatchApiV2LabelsLabelidRequest:
      type: object
      properties:
        title:
          type: string
          description: new title
    PostPluginsWebhookRequest:
      type: object
      properties:
        event:
          type: string
  securitySchemes:
    bearer:
      type: http
      scheme: bearer
security:
- bearer: []
tags:
- name: API
- name: Api
- name: Plugins
- name: Repos