API Documentation

VR Cooperative exposes its tools as API endpoints so you can integrate them into your own workflows, scripts, and applications. All endpoints are free to use with reasonable rate limits.

Image Tools API

Resize images, compress to different formats, and generate full favicon sets from a source image. This is the same processing engine behind the Image Tools page, available as a direct HTTP endpoint.

Endpoint

POST  /ImageToolsApi.ashx

Send a multipart/form-data request with the source image and processing options.

Parameters

Field Type Required Default Description
image file Yes - Source image file. PNG, JPG, BMP, GIF, or TIFF. Max 10 MB.
action string No both resize, favicon, or both
width integer No 1200 Target width in pixels (1-10000). Used when action includes resize.
height integer No auto Target height in pixels (1-10000). Ignored when aspect ratio is maintained.
maintainAspectRatio string No true true or false. When true, height is calculated from width automatically.
format string No png Output format for resize: png, jpg, bmp, or gif
quality integer No 85 JPEG compression quality (1-100). Only applies when format is jpg.

Response

The response format depends on how many files are generated:

Single file (resize only)

Returns the image directly with the appropriate Content-Type header and a Content-Disposition attachment filename.

Multiple files (favicon or both)

Returns a application/zip archive named imagetools-output.zip containing all generated files.

Favicon set contents

When generating favicons, the output includes:

  • favicon.ico - multi-size ICO (16, 32, 48 px)
  • favicon-16x16.png
  • favicon-32x32.png
  • apple-touch-icon.png - 180 px
  • android-chrome-192x192.png
  • android-chrome-512x512.png
  • mstile-150x150.png - 150 px

Limits

Rate limit 1 request per 5 seconds per IP address. Exceeding returns 429 with a Retry-After: 5 header.
File size Maximum 10 MB upload.
Image dimensions Source and output images are capped at 20 megapixels. Larger images return 400.
Concurrency The server processes at most 2 images simultaneously. If all slots are busy, you will receive a 503 response.

Error Responses

Errors are returned as JSON with an error field and an appropriate HTTP status code:

{ "error": "description of what went wrong" }
Status Meaning
400Bad request - missing or invalid parameters, or image exceeds 20 MP
405Method not allowed - use POST
429Rate limit exceeded - wait 5 seconds and retry
500Server error - processing failed
503Server busy - all processing slots occupied, try again shortly

Examples

Resize an image (curl)

curl -X POST https://vrcooperative.com/ImageToolsApi.ashx \
  -F "image=@photo.png" \
  -F "action=resize" \
  -F "width=800" \
  -F "format=jpg" \
  -F "quality=90" \
  -o resized.jpg

Generate favicons (curl)

curl -X POST https://vrcooperative.com/ImageToolsApi.ashx \
  -F "image=@logo.png" \
  -F "action=favicon" \
  -o favicons.zip

Resize + favicons (PowerShell)

$form = @{
    image  = Get-Item ".\logo.png"
    action = "both"
    width  = "1200"
    format = "png"
}

Invoke-RestMethod `
    -Uri "https://vrcooperative.com/ImageToolsApi.ashx" `
    -Method Post `
    -Form $form `
    -OutFile "imagetools-output.zip"

VRAM Budget Calculator API

Calculate the video memory (VRAM) cost of your Unity textures and get an estimated VRChat performance rank for both PC and Quest. No file upload needed - just describe your textures as JSON.

Endpoint

POST  /VramCalculatorApi.ashx

Send a JSON body with Content-Type: application/json.

Request Body

A JSON object with a textures array (max 200 entries):

Field Type Required Default Description
name string No auto Label for this texture in the response.
width integer Yes - Texture width in pixels (1-16384).
height integer Yes - Texture height in pixels (1-16384).
format string Yes - Unity texture format (see supported formats below).
mipmaps boolean No true Whether mipmaps are enabled. Adds ~33% VRAM.

Supported Texture Formats

Desktop (PC)

  • DXT1 / BC1 - 4 bpp
  • DXT5 / BC3 - 8 bpp
  • BC4 - 4 bpp
  • BC5 - 8 bpp
  • BC6H - 8 bpp
  • BC7 - 8 bpp
  • DXT1_CRUNCHED - 4 bpp
  • DXT5_CRUNCHED - 8 bpp

Mobile (Quest)

  • ETC_RGB4 - 4 bpp
  • ETC2_RGB - 4 bpp
  • ETC2_RGBA8 - 8 bpp
  • ASTC_4x4 - 8 bpp
  • ASTC_6x6 - 3.56 bpp
  • ASTC_8x8 - 2 bpp
  • ASTC_10x10 - 1.28 bpp
  • ASTC_12x12 - 0.89 bpp

Uncompressed

  • RGBA32 - 32 bpp
  • RGB24 - 24 bpp
  • RGBA16 - 16 bpp
  • R8 - 8 bpp
  • RHalf - 16 bpp
  • RGBAHalf - 64 bpp
  • RGBAFloat - 128 bpp

Send an unknown format to get the full list of supported format names in the error response.

VRAM Calculator Response

Returns a JSON object with per-texture breakdowns, totals, and estimated VRChat performance ranks for PC and Quest.

{
  "textures": [
    {
      "name": "Body Diffuse",
      "width": 2048,
      "height": 2048,
      "format": "DXT5",
      "mipmaps": true,
      "bitsPerPixel": 8.0,
      "vramBytes": 5592406,
      "vramFormatted": "5.33 MB"
    }
  ],
  "totalVramBytes": 5592406,
  "totalVramFormatted": "5.33 MB",
  "pcRank": "Excellent",
  "questRank": "Good"
}

Performance rank thresholds are approximate community guidelines and may differ from VRChat's current values. Check VRChat's official documentation for the latest thresholds.

Rate limit

1 request per 2 seconds per IP address. Returns 429 with Retry-After: 2 if exceeded.

VRAM Calculator Examples

Calculate avatar texture budget (curl)

curl -X POST https://vrcooperative.com/VramCalculatorApi.ashx \
  -H "Content-Type: application/json" \
  -d '{
    "textures": [
      { "name": "Body Diffuse", "width": 2048, "height": 2048, "format": "DXT5" },
      { "name": "Body Normal",  "width": 2048, "height": 2048, "format": "BC5" },
      { "name": "Hair Diffuse", "width": 1024, "height": 1024, "format": "DXT5" },
      { "name": "Hair Normal",  "width": 1024, "height": 1024, "format": "BC5" },
      { "name": "Eyes",         "width": 512,  "height": 512,  "format": "DXT1" }
    ]
  }'

PowerShell

$body = @{
    textures = @(
        @{ name = "Body"; width = 2048; height = 2048; format = "DXT5" }
        @{ name = "Hair"; width = 1024; height = 1024; format = "DXT5" }
    )
} | ConvertTo-Json

Invoke-RestMethod `
    -Uri "https://vrcooperative.com/VramCalculatorApi.ashx" `
    -Method Post `
    -ContentType "application/json" `
    -Body $body