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 |
400 | Bad request - missing or invalid parameters, or image exceeds 20 MP |
405 | Method not allowed - use POST |
429 | Rate limit exceeded - wait 5 seconds and retry |
500 | Server error - processing failed |
503 | Server 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