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:
GETRead:/api/{connection}/{db}/{table}POSTInsert:/api-in/{connection}/{db}/{table}(form-data)POSTUpdate:/api-in/{connection}/{db}/{table}(form-data withwhere)GETDelete:/api-del/{connection}/{db}/{table}(query params)POSTBulk 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
columnsarray defines the column order for each row invalues. - Each inner array in
valuesmust 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
apirequiredcolumnsand 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 | ❌ | ✅ |