VIPS API Docs

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:

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

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:

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.

KeywordMeaning (SQL)Example
\NULLEMPTY(col = "" OR col IS NULL)where = email:\NULLEMPTY
\EMPTYcol = ""where = description:\EMPTY
\NULLcol IS NULLwhere = status:\NULL
\NOTNULLEMPTY / \NOTEMPTYNULL(col <> "" OR col IS NOT NULL)where = name:\NOTNULLEMPTY
\NOTEMPTYcol <> ""where = title:\NOTEMPTY
\NOTNULLcol IS NOT NULLwhere = 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:

  1. Open Table Options for the table in VIPS.
  2. Click Info.
  3. Click Display Info.
  4. 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

FeatureTable APIQuery API
Read data
Insert
Bulk Insert
Update
Delete
Custom SQL
Dynamic params