VIPS API — Complete Documentation
This document covers **Table APIs** (per-table CRUD & bulk), **Query APIs** (read-only custom queries), full syntax for filters, special WHERE keywords, examples in Dart/Python/PHP, and sample JSON responses.
🔑 Authentication
All endpoints require an API key sent in the request header:
VIPS-API-Key: <your_api_key>
The API key is generated in the VIPS web UI under VIPS → Databases → API.
1. Table API (per table)
Each table has auto-generated APIs. The root URL format used below (replace domain accordingly):
https://d190.vips.uz/{endpoint}/{connection_id}/{database_id}/{table_id}
Common endpoints:
GET
Read:/api/{connection}/{db}/{table}
POST
Insert:/api-in/{connection}/{db}/{table}
(form-data)POST
Update:/api-in/{connection}/{db}/{table}
(form-data withwhere
)GET
Delete:/api-del/{connection}/{db}/{table}
(query params)POST
Bulk Insert:/api-inbulk/{connection}/{db}/{table}
(application/json)
Note: Update uses the same endpoint pattern as Insert (api-in
) — update is performed when a where
form-data key is present.
GET — Read data from table
Endpoint:
GET https://d190.vips.uz/api/{connection_id}/{database_id}/{table_id}
Authentication: include VIPS-API-Key
header.
Filtering & features:
Order By
Use orderby
query parameter. Default ascending, add :desc
for descending.
?orderby=COLUMNNAME ?orderby=COLUMNNAME:desc
Example:
GET https://d190.vips.uz/api/1/1/1?orderby=created_at:desc
Limit / Offset
?limit=COUNT ?limit=OFFSET,COUNT
Examples:
GET ...?limit=1 (first row) GET ...?limit=3,6 (skip 3 rows, return 6)
Comparison Operators
Use standard SQL-like comparison operators in the query string:
?age>18 ?price<=5000 ?id=100
Examples:
GET ...?age>=18 GET ...?price<100
IN operator
Match column to a set of values:
?status=IN(active,inactive,pending)
Example:
GET ...?status=IN(active,pending)
LIKE operator (partial match)
Format: COLUMN=LIKE(value1:ANDvalue2)
or COLUMN=LIKE(value1:ORvalue2)
, where :AND
and :OR
are literal separators inside parentheses.
?name=LIKE(John) ?name=LIKE(John:ANDDoe) ?name=LIKE(John:ORJane)
Examples:
GET ...?fullname=LIKE(John) GET ...?fullname=LIKE(John:ORJohnny)
BETWEEN
?created_at=BETWEEN(2025-01-01,2025-12-31)
Example:
GET ...?amount=BETWEEN(100,500)
Combining multiple filters
Multiple query parameters are combined with AND by default.
GET ...?status=1&age>=18&fullname=LIKE(John)
Example complex GET
GET https://d190.vips.uz/api/1/1/1?status=IN(active,pending)&orderby=created_at:desc&limit=5
This returns the latest 5 rows where status is active
or pending
.
INSERT — Add a new row
Endpoint:
POST https://d190.vips.uz/api-in/{connection_id}/{database_id}/{table_id}
Headers:
VIPS-API-Key: <your_api_key>
Body: form-data (each column as key-value pair). Example using Postman: Body → form-data.
Example (Postman)
POST https://d190.vips.uz/api-in/1/1/1 Headers: VIPS-API-Key: abc123 Body (form-data): name = John Doe email = john@example.com birthdate = 1990-01-01
Notes
- Use form-data (not JSON) for single-row insert via
api-in
. - If the table has server-side defaults, omitted columns will use those defaults.
Bulk Insert — insert multiple rows at once
Endpoint:
POST https://d190.vips.uz/api-inbulk/{connection_id}/{database_id}/{table_id}
Headers:
Content-Type: application/json VIPS-API-Key: <your_api_key>
Request JSON format
{ "columns": ["col1", "col2", "col3"], "values": [ ["val1a", "val2a", "val3a"], ["val1b", "val2b", "val3b"] ] }
Rules:
- The
columns
array defines the column order for each row invalues
. - Each inner array in
values
must match the number and order ofcolumns
. - A single transaction is commonly used; if one row fails the whole insert may fail — split very large uploads.
Dart example
// Headers with API key final headers = { "Content-Type": "application/json", "VIPS-API-Key": "1234" }; // JSON body final body = { "columns": ["clientid", "saleid", "userid", "duedate", "amount", "logdate"], "values": [ [3, 1, 1, "2025-08-10", 500, "2025-09-08"], [4, 2, 2, "2025-08-15", 700, "2025-09-08"] ] }; // then send JSON POST with your http client
Python example
import requests, json url = "https://d190.vips.uz/api-inbulk/1/1/1" headers = { "Content-Type": "application/json", "VIPS-API-Key": "1234" } body = { "columns": ["clientid", "saleid", "userid", "duedate", "amount", "logdate"], "values": [ [3, 1, 1, "2025-08-10", 500, "2025-09-08"], [4, 2, 2, "2025-08-15", 700, "2025-09-08"] ] } resp = requests.post(url, headers=headers, data=json.dumps(body)) print(resp.status_code, resp.text)
PHP example (cURL)
<?php $url = "https://d190.vips.uz/api-inbulk/1/1/1"; $headers = [ "Content-Type: application/json", "VIPS-API-Key: 1234" ]; $body = [ "columns" => ["clientid","saleid","userid","duedate","amount","logdate"], "values" => [ [3,1,1,"2025-08-10",500,"2025-09-08"], [4,2,2,"2025-08-15",700,"2025-09-08"] ] ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); $response = curl_exec($ch); curl_close($ch); echo $response; ?>
UPDATE — Modify existing rows
Endpoint:
POST https://d190.vips.uz/api-in/{connection_id}/{database_id}/{table_id}
Authentication: VIPS-API-Key
header.
Body: use form-data
. Include columns to update as key-value pairs and a special where
key to filter rows.
WHERE clause (update)
where
is a single form-data field whose value uses column:value
pairs. Multiple conditions are separated by commas and are combined with AND in SQL.
where = column:value where = id:111 where = id:111,status:active where = name:\NULLEMPTY,active:1
Examples:
// Update a single row POST https://d190.vips.uz/api-in/1/1/1 Headers: VIPS-API-Key: abc123 Body (form-data): fullname = John Updated email = john.updated@example.com where = id:111 // Update rows where name is NULL or empty and active = 1 where = name:\NULLEMPTY,active:1
Special WHERE Keywords (for Update & Delete)
The API recognizes several reserved values (case-sensitive) to test for NULL/empty and their negations. Use them as the value in a column:value
pair.
Keyword | Meaning (SQL) | Example |
---|---|---|
\NULLEMPTY | (col = "" OR col IS NULL) | where = email:\NULLEMPTY |
\EMPTY | col = "" | where = description:\EMPTY |
\NULL | col IS NULL | where = status:\NULL |
\NOTNULLEMPTY / \NOTEMPTYNULL | (col <> "" OR col IS NOT NULL) | where = name:\NOTNULLEMPTY |
\NOTEMPTY | col <> "" | where = title:\NOTEMPTY |
\NOTNULL | col IS NOT NULL | where = created_at:\NOTNULL |
Multiple conditions
Separate conditions with commas. They are combined with AND:
where = id:111,status:\NULL // SQL: WHERE id = 111 AND status IS NULL
Update example with special keywords
// Update rows where (name is NULL or empty) and active = 1 POST https://d190.vips.uz/api-in/1/1/1 Body (form-data): status = archived where = name:\NULLEMPTY,active:1
DELETE — Remove rows
Endpoint:
GET https://d190.vips.uz/api-del/{connection_id}/{database_id}/{table_id}
Authentication: VIPS-API-Key
header.
Use query parameters to specify which rows to delete. The same WHERE rules (special keywords, multi-condition) apply — conditions can be passed as query parameters or as a single where
parameter depending on usage style.
Basic example
GET https://d190.vips.uz/api-del/1/1/1?id=111
This deletes the row where id = 111
.
Delete with multiple conditions
GET https://d190.vips.uz/api-del/1/1/1?id=111&status=inactive // or using combined where-like syntax: GET https://d190.vips.uz/api-del/1/1/1?where=id:111,status:\NOTNULL
Required columns for Delete (apirequiredcolumns)
Administrators can require additional columns (beyond id
) for delete operations to reduce accidental deletes. To set required columns:
- Open Table Options for the table in VIPS.
- Click Info.
- Click Display Info.
- Add a new text field named
apirequiredcolumns
and enter a comma-separated list of column names (e.g.id,birthdate
).
Now delete requests must include all required columns. If any required column is missing, the API returns an error.
Example requiring birthdate
GET https://d190.vips.uz/api-del/1/1/1?id=111&birthdate=1990-01-01
Error when missing required column
{ "error": "missing required columns: birthdate" }
Delete using special keywords
GET https://d190.vips.uz/api-del/1/1/1?email=\NULLEMPTY // deletes rows where email = "" OR email IS NULL
2. Query API (custom queries) — Read-only
Users can create custom SQL queries in VIPS. When a query is saved and displayed in the table view, VIPS provides a clickable API link that returns the JSON result. Query APIs are read-only (no INSERT / UPDATE / DELETE).
Example Query API endpoint format:
https://d190.vips.uz/r-api/{connection_id}/{database_id}/{query_id}
Concrete example:
https://d190.vips.uz/r-api/3/45/20
WHERE parameter separator and default behaviour
When you pass URL parameters to Query API, each parameter becomes part of the WHERE clause. The default parameter separator is AND.
APILINK?status=1&limit=11&fullname=LIKE(2006)&birthdate=LIKE(2006) // SQL -> WHERE status = 1 AND fullname LIKE '2006' AND birthdate LIKE '2006'
If you prefix a parameter name with a pipe character (|
), that parameter is treated as an OR condition (relative to the rest). Example:
APILINK?status=1&fullname=LIKE(2006)&|birthdate=LIKE(2006) // SQL -> WHERE status = 1 AND fullname LIKE '2006' OR birthdate LIKE '2006'
Note: using |
does not automatically add parentheses — SQL will evaluate according to normal operator precedence. Use parentheses grouping if you need precise precedence (see Parentheses section).
WHERE=[...] param
Some queries support passing a full WHERE set in one parameter. Example:
APILINK?WHERE=[col1=val1,col2=val2,col3=val3] // Produces: WHERE col1 = val1 AND col2 = val2 AND col3 = val3
Parentheses & grouping in API link
Use parentheses in the URL to create grouped conditions:
URL?col1=val1&(col2=val2&col3=val3) // SQL -> WHERE col1 = 'val1' AND (col2 = 'val2' AND col3 = 'val3')
Parent comma notation
If you need to wrap multiple parameters inside parentheses, the syntax supports:
URL?col1=val1&(col2=val2&col3=val3)
Custom (dynamic) parameters
Use named placeholders in your saved query (e.g. :studentid
) and pass values via the URL.
Example query (saved in VIPS): SELECT name, phone FROM student WHERE id = :studentid Call: APILINK?:studentid=111 Resulting SQL: SELECT name, phone FROM student WHERE id = 111
Multiple dynamic params are supported by adding them to the query string:
APILINK?:studentid=111&:status=active
Operators (Query API)
Same operators as Table API are supported for Query API filters: comparison operators (> < = >= <=
), IN()
, LIKE()
with :AND
/:OR
, and BETWEEN()
.
?status=IN(active,pending)&name=LIKE(John:ORJohnny)&created_at=BETWEEN(2025-01-01,2025-09-01)
Limit (Query API)
?limit=1 ?limit=3,6
Examples:
https://d190.vips.uz/r-api/3/45/20?status=1&limit=10
Sample JSON Responses
GET (success)
[ { "id": 111, "name": "John Doe", "email": "john@example.com", "created_at": "2025-09-01T10:00:00" }, { "id": 112, "name": "Jane Smith", "email": "jane@example.com", "created_at": "2025-09-02T11:30:00" } ]
Insert (single row) success
{ "status": "success", "inserted": 1, "id": 123 }
Bulk insert success
{ "status": "success", "inserted": 2 // optionally: "ids": [123, 124] }
Update success
{ "status": "success", "updated": 1 }
Delete success
{ "status": "success", "deleted": 1 }
Error example: missing required columns (Delete)
{ "error": "missing required columns: birthdate" }
Error example: bad request / invalid parameter
{ "error": "invalid parameter: created_at - wrong date format" }
Feature Comparison
Feature | Table API | Query API |
---|---|---|
Read data | ✅ | ✅ |
Insert | ✅ | ❌ |
Bulk Insert | ✅ | ❌ |
Update | ✅ | ❌ |
Delete | ✅ | ❌ |
Custom SQL | ❌ | ✅ |
Dynamic params | ❌ | ✅ |