Snips
A snip is an image plus the LaTeX recognised from it. Upload first, then run recognition as a separate call, so a failed conversion never loses the upload.
Conventions
Accepted formats are PNG, JPG and WebP, up to 10 MB. Ids are integers. List
responses are paginated and include a signed imageUrl inline, so you never
need a second request per row to display results.
The form field is named file
POST /snips reads a multipart field called file. Sending image returns
400 with "No file uploaded", which is the most common mistake against this
endpoint.
/snipsUpload an image. This stores it and returns the record. It does not run recognition.
curl -X POST https://api.texer.org/snips \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "file=@equation.png" \
-F "title=Gaussian integral"{
"id": 412,
"title": "Gaussian integral",
"fileName": "equation.png",
"fileSize": 84213,
"status": "uploaded",
"latex": null,
"imageUrl": "https://assets.texer.org/snips/412.png?X-Amz-Signature=...",
"createdAt": "2026-04-02T09:05:00.000Z"
}/snips/:id/processRun recognition on an uploaded snip and store the resulting LaTeX. Rate limited to 10 per minute, and each successful call consumes one snip from your monthly quota.
curl -X POST https://api.texer.org/snips/412/process \
-H "Authorization: Bearer YOUR_TOKEN"{
"id": 412,
"status": "processed",
"latex": "\\int_{0}^{\\infty} e^{-x^2}\\,dx = \\frac{\\sqrt{\\pi}}{2}"
}/snipsList your snips, newest first. Paginated, with imageUrl signed and included on every row.
curl "https://api.texer.org/snips?page=1&limit=20" \
-H "Authorization: Bearer YOUR_TOKEN"{
"data": [
{
"id": 412,
"title": "Gaussian integral",
"fileName": "equation.png",
"status": "processed",
"latex": "\\int_{0}^{\\infty} e^{-x^2}\\,dx",
"imageUrl": "https://assets.texer.org/snips/412.png?X-Amz-Signature=...",
"createdAt": "2026-04-02T09:05:00.000Z"
}
],
"meta": {
"page": 1, "limit": 20, "total": 1,
"totalPages": 1, "hasNext": false, "hasPrev": false
}
}/snips/:idFetch a single snip.
curl https://api.texer.org/snips/412 \
-H "Authorization: Bearer YOUR_TOKEN"/snips/:id/imageRedirect to a freshly signed URL for the original image. Use this when a URL from an earlier list response has expired.
curl -L https://api.texer.org/snips/412/image \
-H "Authorization: Bearer YOUR_TOKEN" \
--output equation.png/snips/:id/latexOverwrite the stored LaTeX. Use this to save a correction after reviewing what recognition returned.
curl -X PUT https://api.texer.org/snips/412/latex \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"latex": "\\int_0^\\infty e^{-x^2}\\,dx = \\tfrac{\\sqrt\\pi}{2}"}'/snips/:idUpdate metadata such as the title or tags.
curl -X PUT https://api.texer.org/snips/412 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Gaussian integral, corrected"}'/snips/:idDelete a snip and its stored image. This cannot be undone and does not refund quota.
curl -X DELETE https://api.texer.org/snips/412 \
-H "Authorization: Bearer YOUR_TOKEN"