Void Presence API endpoints

Browse HTTP endpoints in the same layout as your release schedule.

API overview

Use these HTTP endpoints to fetch presence configs and status cycles directly from Void Presence.

All responses are JSON and designed to be copy-pastable into your own tools or scripts.

API resources

Endpoints cover presence configs, status cycles and authentication helpers.

Use them from your own tools or backend services to integrate with Void Presence.

Authentication

Most public endpoints do not require authentication.

You can inspect all HTTP API references directly in the web source.

View API references on GitHub

Rate limits & usage

Avoid polling these endpoints aggressively from public clients.

Prefer calling them from your own backend or tools when possible.

18 endpoints found

API endpoints

v2
  • /v2/github/releasesPOST
    Public
    Get latest GitHub release
    Returns the latest GitHub release info for the selected Void Presence app (desktop app, installer, or auto-updater).
    https://api.voidpresence.com/v2/github/releases Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v2/github/releases', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ app: 'void-presence', platform: 'windows' }),
    })
      .then(res => res.json())
      .then(info => console.log(info))
    
    {
      "requestBody": {
        "app": "void-presence",
        "platform": "windows"
      },
      "responseBody": {
        "tag": "v2.13.13",
        "assetName": "Void.Presence.Setup.2.13.13.exe",
        "downloadUrl": "https://github.com/Devollox/void-presence/releases/download/v2.13.13/Void.Presence.Setup.2.13.13.exe",
        "body": "Release notes for v2.13.13…"
      }
    }
    

v1
  • /v1/authors/resolveGET
    Public
    Resolve author by username and tag
    Resolves an author profile and all their configs by handle (username + tag). Query: ?username=User&tag=1234.
    https://api.voidpresence.com/v1/authors/resolve Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/authors/resolve?username=Author%20Name&tag=1234')
      .then(res => res.json())
      .then(data => console.log(data))
    
    {
      "responseBody": {
        "user": {
          "name": "Author Name",
          "avatar": "https://example.com/avatar.png",
          "tag": "1234",
          "provider": "discord",
          "createdAt": 123456789,
          "lastSeen": 123456789
        },
        "presenceConfigs": [
          {
            "id": "cfg-1",
            "title": "Presence config title",
            "author": "Author Name",
            "authorAvatar": "https://example.com/avatar.png",
            "authorTag": "1234",
            "downloads": 0,
            "description": "Config description",
            "averageColors": [
              "#ffffff"
            ],
            "configData": {
              "cycles": [
                {
                  "details": "Details line",
                  "state": "State line"
                }
              ],
              "imageCycles": [],
              "buttonPairs": []
            },
            "uploadedAt": 123456789
          }
        ],
        "statusConfigs": [
          {
            "id": "status-1",
            "title": "Status config title",
            "author": "Author Name",
            "authorAvatar": "https://example.com/avatar.png",
            "authorTag": "1234",
            "downloads": 0,
            "description": "Status description",
            "configData": {
              "statusCycles": [
                {
                  "text": "Example status text"
                }
              ]
            },
            "uploadedAt": 123456789
          }
        ]
      }
    }
    
  • /v1/authors/resolvePOST
    Public
    Resolve author by username and tag (JSON)
    Same as GET /v1/authors/resolve but accepts JSON body { username, tag } instead of query parameters.
    https://api.voidpresence.com/v1/authors/resolve Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/authors/resolve', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ username: 'Author Name', tag: '1234' }),
    })
      .then(res => res.json())
      .then(data => console.log(data))
    
    {
      "requestBody": {
        "username": "Author Name",
        "tag": "1234"
      },
      "responseBody": {
        "user": {
          "name": "Author Name",
          "avatar": "https://example.com/avatar.png",
          "tag": "1234",
          "provider": "discord",
          "createdAt": 123456789,
          "lastSeen": 123456789
        },
        "presenceConfigs": [
          {
            "id": "cfg-1",
            "title": "Presence config title",
            "author": "Author Name",
            "authorAvatar": "https://example.com/avatar.png",
            "authorTag": "1234",
            "downloads": 0,
            "description": "Config description",
            "averageColors": [
              "#ffffff"
            ],
            "configData": {
              "cycles": [
                {
                  "details": "Details line",
                  "state": "State line"
                }
              ],
              "imageCycles": [],
              "buttonPairs": []
            },
            "uploadedAt": 123456789
          }
        ],
        "statusConfigs": [
          {
            "id": "status-1",
            "title": "Status config title",
            "author": "Author Name",
            "authorAvatar": "https://example.com/avatar.png",
            "authorTag": "1234",
            "downloads": 0,
            "description": "Status description",
            "configData": {
              "statusCycles": [
                {
                  "text": "Example status text"
                }
              ]
            },
            "uploadedAt": 123456789
          }
        ]
      }
    }
    
  • /v1/authors/{authorId}/configsPOST
    Auth required
    Create presence or status config
    Creates a new presence or status config for the given authorId (Discord snowflake) and links it under users/{authorId}/configs.
    https://api.voidpresence.com/v1/authors/{authorId}/configs Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/authors/123456789/configs', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        kind: 'presence',
        title: 'Presence title',
        author: 'Author name',
        description: 'Presence description',
        configData: {
          cycles: [{ details: 'Details line', state: 'State line' }],
          imageCycles: [
            {
              largeImage: 'https://example.com/large-image.png',
              largeText: 'Large image text',
              smallImage: 'https://example.com/small-image.png',
              smallText: 'Small image text'
            }
          ],
          buttonPairs: [
            {
              label1: 'Button 1 label',
              url1: 'https://example.com/button-1',
              label2: 'Button 2 label',
              url2: 'https://example.com/button-2'
            }
          ]
        },
        downloads: 0,
        uploadedAt: Date.now(),
        averageColor: '#ffffff'
      }),
    })
      .then(res => res.json())
      .then(result => console.log(result.id))
    
    {
      "requestBody": {
        "kind": "presence",
        "title": "Presence title",
        "author": "Author name",
        "description": "Presence description",
        "configData": {
          "cycles": [
            {
              "details": "Details line",
              "state": "State line"
            }
          ],
          "imageCycles": [
            {
              "largeImage": "https://example.com/large-image.png",
              "largeText": "Large image text",
              "smallImage": "https://example.com/small-image.png",
              "smallText": "Small image text"
            }
          ],
          "buttonPairs": [
            {
              "label1": "Button 1 label",
              "url1": "https://example.com/button-1",
              "label2": "Button 2 label",
              "url2": "https://example.com/button-2"
            }
          ]
        },
        "downloads": 0,
        "uploadedAt": 123456789,
        "averageColor": "#ffffff"
      },
      "responseBody": {
        "id": "123456789"
      }
    }
    
  • /v1/authors/{authorId}/configsGET
    Auth required
    Get author profile and configs
    Returns an author profile and all of their presence/status configs by authorId (Discord snowflake). Used by internal profile pages.
    https://api.voidpresence.com/v1/authors/{authorId}/configs Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/authors/123456789/configs')
      .then(res => res.json())
      .then(data => console.log(data))
    
    {
      "responseBody": {
        "user": {
          "id": "123456789",
          "name": "Author Name",
          "avatar": "https://example.com/avatar.png",
          "tag": "1234",
          "provider": "discord",
          "createdAt": 123456789,
          "lastSeen": 123456789
        },
        "presenceConfigs": [
          {
            "id": "cfg-1",
            "title": "Presence config title",
            "author": "Author Name",
            "authorAvatar": "https://example.com/avatar.png",
            "authorTag": "1234",
            "downloads": 0,
            "description": "Config description",
            "configData": {
              "cycles": [
                {
                  "details": "Details line",
                  "state": "State line"
                }
              ],
              "imageCycles": [],
              "buttonPairs": []
            },
            "averageColors": [
              "#ffffff"
            ],
            "uploadedAt": 123456789
          }
        ],
        "statusConfigs": [
          {
            "id": "status-1",
            "title": "Status config title",
            "author": "Author Name",
            "authorAvatar": "https://example.com/avatar.png",
            "authorTag": "1234",
            "downloads": 0,
            "description": "Status description",
            "configData": {
              "statusCycles": [
                {
                  "text": "Example status text"
                }
              ]
            },
            "uploadedAt": 123456789
          }
        ]
      }
    }
    
  • /v1/configsPOST
    Public
    List configs (ranked)
    Returns a ranked slice of presence or status configs (sorted by downloads). Body: { kind, offset?, limit? }. If ranking is empty, falls back to scanning all configs.
    https://api.voidpresence.com/v1/configs Copy URL
    JSON responseHas example
    fetch('https://voidpresence.com/api/v1/configs', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ kind: 'presence' }),
    })
      .then(res => res.json())
      .then(list => console.log(list))
    
    {
      "requestBody": {
        "kind": "presence"
      },
      "responseBody": {
        "items": [
          {
            "id": "123456789",
            "title": "Config title",
            "author": "Author name",
            "authorAvatar": "https://example.com/avatar.png",
            "authorTag": "1234",
            "downloads": 0,
            "description": "Config description",
            "averageColors": [
              "#ffffff"
            ],
            "configData": {
              "cycles": [
                {
                  "details": "Details line",
                  "state": "State line"
                }
              ],
              "imageCycles": [],
              "buttonPairs": []
            },
            "uploadedAt": 123456789
          }
        ],
        "total": 1,
        "offset": 0,
        "limit": 24
      }
    }
    
  • /v1/configs/{id}POST
    Public
    Get presence or status config
    Returns a single presence or status config by ID, enriched with author metadata. Body: { kind: "presence" | "status" }.
    https://api.voidpresence.com/v1/configs/{id} Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/configs/123456789', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ kind: 'presence' }),
    })
      .then(res => res.json())
      .then(config => console.log(config))
    
    {
      "requestBody": {
        "kind": "presence"
      },
      "responseBody": {
        "id": "123456789",
        "title": "Config title",
        "author": "Author name",
        "authorAvatar": "https://example.com/avatar.png",
        "authorTag": "1234",
        "downloads": 0,
        "description": "Config description",
        "configData": {
          "cycles": [
            {
              "details": "Details line",
              "state": "State line"
            }
          ],
          "imageCycles": [],
          "buttonPairs": []
        },
        "averageColors": [
          "#ffffff"
        ],
        "uploadedAt": 123456789
      }
    }
    
  • /v1/configs/{id}/downloadGET
    Public
    Download config JSON file
    Downloads only the configData of a presence or status config as a JSON file. Query: kind=presence|status.
    https://api.voidpresence.com/v1/configs/{id}/download Copy URL
    JSON responseHas example
    fetch('https://voidpresence.com/api/v1/configs/123456789/download?kind=presence')
      .then(res => res.blob())
      .then(file => console.log(file))
    
    {
      "status": "200 OK",
      "headers": {
        "Content-Type": "application/json",
        "Content-Disposition": "attachment; filename=\"Config title.json\""
      }
    }
    
  • /v1/configs/{id}/copyGET
    Public
    Copy config JSON
    Returns only the configData JSON for a presence or status config, suitable for copying or exporting. Query: kind=presence|status.
    https://api.voidpresence.com/v1/configs/{id}/copy Copy URL
    JSON responseHas example
    fetch('https://voidpresence.com/api/v1/configs/123456789/copy?kind=presence')
      .then(res => res.json())
      .then(json => console.log(json))
    
    {
      "responseBody": {
        "cycles": [],
        "imageCycles": [],
        "buttonPairs": []
      }
    }
    
  • /v1/configs/{id}/deleteDELETE
    Auth required
    Delete presence or status config
    Deletes a presence or status config and unlinks it from its owner. Query: kind=presence|status.
    https://api.voidpresence.com/v1/configs/{id}/delete Copy URL
    JSON responseHas example
    fetch('https://voidpresence.com/api/v1/configs/123456789/delete?kind=presence', {
      method: 'DELETE',
    })
      .then(res => res.json())
      .then(result => console.log(result))
    
    {
      "responseBody": {
        "ok": true
      }
    }
    
  • /v1/github/releasesPOST
    Public
    Get latest GitHub release
    Returns the latest GitHub release info for the selected Void Presence app (desktop app, installer, or auto-updater).
    https://api.voidpresence.com/v1/github/releases Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/github/releases', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ app: 'void-presence' }),
    })
      .then(res => res.json())
      .then(info => console.log(info))
    
    {
      "requestBody": {
        "app": "void-presence"
      },
      "responseBody": {
        "tag": "vX.Y.Z",
        "assetName": "Void.Presence.Setup.X.Y.Z.exe",
        "downloadUrl": "https://github.com/Devollox/void-presence/releases/download/vX.Y.Z/Void.Presence.Setup.X.Y.Z.exe",
        "body": "vX.Y.Z release notes body text here."
      }
    }
    
  • /v1/analytics/appPOST
    Auth required
    Track app analytics
    Tracks global app analytics such as total visitors and installer downloads.
    https://api.voidpresence.com/v1/analytics/app Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/analytics/app', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        type: 'app_download',
        channel: 'installer',
      }),
    })
      .then(res => res.json())
      .then(result => console.log(result))
    
    {
      "requestBody": {
        "type": "app_download",
        "channel": "installer",
        "meta": {
          "platform": "windows",
          "version": "2.5.0"
        }
      },
      "responseBody": {
        "ok": true,
        "type": "app_download",
        "stats": {
          "downloads": {
            "count": 123,
            "lastUpdated": 123456789
          }
        }
      }
    }
    
  • /v1/analytics/configsPOST
    Public
    Track config analytics
    Records analytics events for presence/status configs. Supported types: "status_download", "presence_download".
    https://api.voidpresence.com/v1/analytics/configs Copy URL
    JSON responseHas example
    fetch('https://api.voidpresence.com/v1/analytics/configs', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ type: 'presence_download', id: '123456789' }),
    })
      .then(res => res.json())
      .then(result => console.log(result))
    
    {
      "requestBody": {
        "type": "presence_download",
        "id": "123456789",
        "client": "void-desktop",
        "meta": {
          "platform": "windows",
          "version": "2.5.0"
        }
      },
      "responseBody": {
        "ok": true
      }
    }
    

v0
  • /api/auth/sessionGET
    Auth required
    Get current session
    Returns the current next-auth session including provider details and any extra tokens exposed via callbacks.
    https://voidpresence.com/api/auth/session Copy URL
    JSON responseHas example
    fetch('https://voidpresence.com/api/auth/session')
      .then(res => res.json())
      .then(session => console.log(session))
    
    {
      "user": {
        "name": "User name",
        "email": "user@example.com",
        "image": "https://example.com/avatar.png"
      },
      "expires": "2026-07-01T21:59:00.000Z",
      "provider": "discord"
    }
    
  • /api/auth/signin/{provider}GET
    Public
    Start OAuth sign-in
    Starts OAuth sign-in for the given provider and redirects to the provider authorization page.
    https://voidpresence.com/api/auth/signin/{provider} Copy URL
    JSON response
    window.location.href = 'https://voidpresence.com/api/auth/signin/discord'
    
    {
      "redirect": true,
      "provider": "discord",
      "url": "https://discord.com/oauth2/authorize?..."
    }
    
  • /api/auth/callback/{provider}GET
    Public
    Handle OAuth callback
    Route used by next-auth to handle OAuth callbacks for configured providers.
    https://voidpresence.com/api/auth/callback/{provider} Copy URL
    JSON response
  • /api/auth/fuckoffnextauth/{provider}GET
    Public
    Steam OAuth bridge
    Custom bridge route used by the Steam provider to normalize callback parameters before passing them to next-auth.
    https://voidpresence.com/api/auth/fuckoffnextauth/{provider} Copy URL
    JSON responseHas example
    fetch('https://voidpresence.com/api/auth/fuckoffnextauth/steam?state=state-value&code=authorization-code&redirectUri=https://example.com/callback')
      .then(res => res.json())
      .then(result => console.log(result.normalizedParams))
    
    {
      "ok": true,
      "provider": "steam",
      "normalizedParams": {
        "state": "state-value",
        "code": "authorization-code",
        "redirectUri": "https://example.com/callback"
      }
    }
    
  • /api/auth/users/syncGET
    Auth required
    Get user profile
    Returns the current user profile data without configs, looked up by session user id.
    https://voidpresence.com/api/auth/users/sync Copy URL
    JSON responseHas example
    fetch('https://voidpresence.com/api/auth/users/sync')
      .then(res => res.json())
      .then(user => console.log(user))
    
    {
      "id": "123456789",
      "name": "User Name",
      "avatar": "https://example.com/avatar.png",
      "tag": "1234",
      "provider": "discord"
    }