# All APIs at a Glance

> Every API of API Maker on one page - the operations of a table under /api/schema and /api/gen (17 on MongoDB, 14 on SQL tables) with their method and URL, the custom and system APIs, the query params and headers they share, and how to call them from your code.

Source: https://docs.apimaker.dev/v4/docs/apis-all/overview.html

Everything API Maker serves sits behind one base URL and the same token header. This page is the map ; every operation has its own page with examples.

This page opens the **Build** tab : the APIs, then [your code](https://docs.apimaker.dev/v4/docs/pre-defined-terms/global-object-g.html), its [languages](https://docs.apimaker.dev/v4/docs/languages/index.html), [schema and data](https://docs.apimaker.dev/v4/docs/schema/schema.html) and [SSR websites](https://docs.apimaker.dev/v4/docs/ssr/index.html). Running them is in the [Operate](https://docs.apimaker.dev/v4/docs/guides/index.html) tab.

> Diagram : The API families : one base URL, one token, four HTTP families, your code in any language and the code API Maker runs for you
>
> The API families of API Maker on one base URL : schema APIs under /api/schema, generated APIs under /api/gen, custom APIs under /api/custom-api, system APIs under /api/system-api, the code of yours in nine runtimes, and the code API Maker runs on its own : events, schedulers, WebSocket events, process initializers and migrations.

## The URL of a table

> Diagram : Anatomy of a database API URL : /api/schema/admin/mysql8/inventory/customers/get-by-id/42
>
> Anatomy of a database API URL : /api, then the family schema or gen, then the user path of the account, the instance, the database, the table, and the operation with its parameters.

| Segment | Meaning |
|---|---|
| `/api/schema` or `/api/gen` | The family : schema APIs apply the schema of the table, generated APIs are schemaless. |
| `user-path` | The **API path** of the admin or developer account which owns the instance (`admin` for the first admin). It is shown on the profile of the account. |
| `instance` | The name of the instance (the database server) in API Maker. For a tenant of a [multi-tenant](https://docs.apimaker.dev/v4/docs/features/multi-tenant.html) instance : `instance::tenant`. |
| `database` | The database on that server. |
| `table` | The table or collection. |

> **Generated (`/api/gen`) or schema (`/api/schema`) ?**
>
> Both families offer the same operations on the same URL pattern. The **schema APIs** read the [schema](https://docs.apimaker.dev/v4/docs/schema/schema.html) of the table : values are converted to their types, validated, encrypted, defaulted and numbered before they reach the database. The **generated APIs** are schemaless : they pass your data as it is, so a number sent as `"22"` stays a string. Use the schema APIs for the tables your application writes to, and the generated APIs for quick reads and for tables without a schema.

## Instances, databases and tables

`APIs & Logic → Instance API (DB API)` has four panels, left to right : instances, databases, tables, APIs. Pick one in each and the next panel fills.

- **Instances** : a connection to a database server (MongoDB, MySQL with TiDB and Percona, MariaDB, SQL Server, PostgreSQL, Oracle). Its name is part of every URL and can not change later. Its connection string is a key of the [secret](https://docs.apimaker.dev/v4/docs/secrets/secrets.html).
- **Databases** and **tables** : what the connection sees, with their [settings](https://docs.apimaker.dev/v4/docs/settings/databaseSettings.html) and [schemas](https://docs.apimaker.dev/v4/docs/schema/schema.html).
- **APIs** : the operations below, each with its [settings](https://docs.apimaker.dev/v4/docs/settings/apiSettings.html) and **Test API**.

Every button of these panels is on the [table designer](https://docs.apimaker.dev/v4/docs/schema/table-designer.html#panels) page : adding an instance, making, editing and deleting databases and tables, and keeping the schemas in step.

## The operations of a table

17 on a MongoDB collection, 14 on a table of the SQL databases.

The paths below follow `/api/schema/<user-path>/<instance>/<database>/<table>` (and the same under `/api/gen`). `[/:primaryKey]` names another column to use as the key.

| Operation | Method and path | Body | Page |
|---|---|---|---|
| Get all | GET `/` | query params | [Get all](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-get-all-api.html) |
| Get all by stream | GET `/stream` | query params | [Get all by stream](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-get-all-by-stream-api.html) |
| Get by id | GET `/get-by-id/:id[/:primaryKey]` | | [Get by id](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-get-by-id-api.html) |
| Save single or multiple | POST `/save-single-or-multiple` | one object or an array | [Save single or multiple](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-save-single-or-multiple-api.html) |
| Master save | POST `/master-save` | objects with nested related objects | [Master save](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-master-save-api.html) |
| Update by id | PUT `/update-by-id/:id[/:primaryKey]` | the fields to change | [Update by id](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-update-by-id-api.html) |
| Update many | PUT `/update-many` | `{ find, updateData }` | [Update many](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-update-many-api.html) |
| Replace by id (MongoDB) | PUT `/replace-by-id/:id[/:primaryKey]` | the whole document | [Replace by id](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-replace-by-id-api.html) |
| Array operations (MongoDB) | PUT `/array-operations` | `{ find, operations }` | [Array operations](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-array-operations-api.html) |
| Remove by id | DELETE `/:id[/:primaryKey]` | | [Remove by id](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-remove-by-id-api.html) |
| Remove by query | POST `/query/delete` | `{ find }` | [Remove by query](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-remove-by-query-api.html) |
| Query for get data | POST `/query` | `{ find, select, sort, skip, limit, deep, getTotalCount }` | [Query for get data](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-query-for-get-data-api.html) |
| Query for get data by stream | POST `/query-stream` | same as query | [Query for get data by stream](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-query-for-get-data-by-stream-api.html) |
| Aggregate (MongoDB) | POST `/aggregate` | a pipeline array | [Aggregate](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-aggregate-api.html) |
| Count | POST `/count` | `{ find }` | [Count](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-count-api.html) |
| Distinct | GET `/distinct/:field[/:order]` | | [Distinct](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-distinct-api.html) |
| Distinct with query | POST `/distinct/:field[/:order]` | `{ find }` | [Distinct with query](https://docs.apimaker.dev/v4/docs/apis-all/schema-apis/auto-generated-schema-based-distinct-with-query-api.html) |

- **MongoDB** gets all 17. **MySQL, MariaDB, SQL Server, PostgreSQL, Oracle, TiDB and Percona** get 14 : replace by id, array operations and aggregate are MongoDB only.
- The schema operations exist for a table only once it has an active [schema](https://docs.apimaker.dev/v4/docs/schema/schema.html). The generated ones are always there.
- Their id in settings, groups, hooks and WebSocket subscriptions is `SCHEMA_GET_ALL`, `GEN_POST_BULK_INSERT`… : the full list is under [API ids](https://docs.apimaker.dev/v4/docs/apis-all/overview.html#api-ids).

## Shared by every read

| | |
|---|---|
| [Query params](https://docs.apimaker.dev/v4/docs/apis-all/query-params/query-params.html) | `find`, `skip`, `limit`, `sort`, `select`, `deep`, `getTotalCount`, and any column name as a filter. In the body for the query APIs. |
| [Request headers](https://docs.apimaker.dev/v4/docs/apis-all/header/requestHeader.html) | Tokens, `x-am-response-case`, `x-am-content-type-response`, `x-am-response-object-type`, `x-am-cache-control`, `x-am-get-encrypted-data`, `x-am-internationalization`, `x-am-tenant-username`… |
| [Response format](https://docs.apimaker.dev/v4/docs/apis-all/response-format.html) | `{ success, statusCode, data, totalCount, errors, warnings, logs, meta }` |

## Your own APIs

| Family | Method and path | Page |
|---|---|---|
| Custom API | ANY `/api/custom-api/<user-path>/<path>` : the method and path of its settings | [Custom APIs](https://docs.apimaker.dev/v4/docs/apis-all/custom-apis/user-created-custom-api.html) |
| Pre and post hooks | run around every API of the account | [Pre hook](https://docs.apimaker.dev/v4/docs/apis-all/hooks/preHook-api.html) · [Post hook](https://docs.apimaker.dev/v4/docs/apis-all/hooks/postHook-api.html) |
| Events | emitted by an API hit or by code, with listeners | [Events](https://docs.apimaker.dev/v4/docs/apis-all/events/user-created-events-api.html) |
| WebSocket events | pushed to subscribed clients | [WebSocket events](https://docs.apimaker.dev/v4/docs/pages/web-socket-event-page.html) |
| Schedulers | intervals and cron | [Schedulers](https://docs.apimaker.dev/v4/docs/apis-all/schedulers/user-created-schedulers-api.html) |
| Utility classes | shared code, `import * as x from 'utils/X'` | [Utility classes](https://docs.apimaker.dev/v4/docs/utility-class/utility-class.html) |

## System APIs

All under `/api/system-api/<user-path>/…`, all POST, and all available in code as `g.sys.system.*` or `g.sys.cache.*`.

| Group | APIs |
|---|---|
| Security | [`/token`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-token-api.html) · [`/encrypt-data`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-encrypt-data-api.html) · [`/decrypt-data`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-decrypt-data-api.html) · [`/hash-data`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-hash-data-api.html) · [`/get-secret-by-name`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-get-secret-by-name-api.html) |
| Redis and cache | [`/get-redis-key`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-get-redis-key-api.html) · [`/set-redis-key`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-set-redis-key-api.html) · [`/remove-redis-key`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-remove-redis-key-api.html) · [`/reset-redis-cache-db`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-reset-redis-cache-db-api.html) · [`/reset-redis-cache-custom-apis`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-reset-redis-cache-custom-api.html) · [`/reset-redis-cache-system-apis`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-reset-redis-cache-system-api.html) |
| Databases | [`/get-table-meta`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-get-table-meta-api.html) · [`/create-indexes`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-create-indexes-api.html) · [`/drop-indexes`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-drop-indexes-api.html) · [`/get-indexes`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-get-indexes-api.html) · [`/multi-tenant-instance-updated`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-multi-tenant-instance-updated-api.html) · [`/execute-plain-query`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-execute-plain-query-api.html) · `executeQuery` from [code](https://docs.apimaker.dev/v4/examples/sys/system/executeQuery.html) |
| Events | [`/emit-event`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-emit-event-api.html) · [`/emit-event-ws`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-emit-event-ws-api.html) |
| Validation | [`/is-valid-data-for-table`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-is-valid-data-for-table-api.html) · [`/is-valid-data-for-custom-api`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-is-valid-data-for-custom-api.html) · [`/is-valid-connection-string`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-is-valid-connection-string-api.html) |
| Outside | [`/call-external-api`](https://docs.apimaker.dev/v4/docs/apis-all/system-apis/system-generated-call-external-api.html) |

## From your code

Every API above is a method of the [global object `g`](https://docs.apimaker.dev/v4/docs/pre-defined-terms/global-object-g.html) : `g.sys.db.getAll`, `g.sys.db.gen.queryGen`, `g.sys.system.encrypt`, `g.sys.cache.setKey`… with the same headers and query params, and [an example for each one](https://docs.apimaker.dev/v4/examples/index.html).

**TypeScript**

```typescript
import * as T from 'types';
import * as db from 'db-interfaces';

async function main(g: T.IAMGlobal) {
    const products = await g.sys.db.getAll<db.mongodb.shop.IProducts>({
        instance: 'mongodb', database: 'shop', collection: 'products',
        queryParams: { find: { status: 'ACTIVE' }, limit: 10, deep: [{ s_key: 'category' }] },
    });
    return products;
}
module.exports = main;
```

**Python**

```python
from am import DeepItem, G


async def main(g: G):
    products = await g.sys.db.get_all('mongodb', 'shop', 'products', find={'status': 'ACTIVE'}, limit=10, deep=[DeepItem('category')])
    return products
```

**PHP**

```php
<?php
function main(AmG $g)
{
    $products = $g->sys->db->getAll('mongodb', 'shop', 'products', find: ['status' => 'ACTIVE'], limit: 10, deep: [new DeepItem('category')]);
    return $products;
}
```

**C#**

```csharp
file static class Api
{
    public static async Task<object?> Main(G g)
    {
        var products = await g.Sys.Db.GetAll(new GetAll("mongodb", "shop", "products")
        {
            Find = new JsonObject { ["status"] = "ACTIVE" }, Limit = 10, Deep = new[] { new DeepItem("category") },
        });
        return products;
    }
}
```

**Go**

```go
package code

import "apimaker/am"

func Main(g *am.G) (any, error) {
	products, err := g.Sys.Db.GetAll(am.GetAll{
		Instance: "mongodb", Database: "shop", Collection: "products",
		Find: am.M{"status": "ACTIVE"}, Limit: 10, Deep: []am.DeepItem{am.DeepItem{SKey: "category"}},
	})
	return products, err
}
```

**Rust**

```rust
use am::{DeepItem, Errors, G, GetAll, Value, json};

pub fn main(g: &mut G) -> Result<Value, Errors> {
    let products = g.sys.db.get_all(
        GetAll::new("mongodb", "shop", "products").find(json!({ "status": "ACTIVE" })).limit(10).deep(vec![DeepItem::new("category")]),
    )?;
    Ok(json!(products))
}
```

**Java**

```java
import am.DeepItem;
import am.G;
import am.GetAll;
import am.JsonObject;
import java.util.List;
import java.util.Map;

class Api {
    static Object main(G g) {
        List<JsonObject> products = g.sys.db.getAll(new GetAll("mongodb", "shop", "products")
            .find(Map.of("status", "ACTIVE")).limit(10).deep(List.of(new DeepItem("category"))));
        return products;
    }
}
```

**Kotlin**

```kotlin
import am.DeepItem
import am.G
import am.GetAll

fun main(g: G): Any? {
    val products = g.sys.db.getAll(
        GetAll("mongodb", "shop", "products").find(mapOf("status" to "ACTIVE")).limit(10).deep(listOf(DeepItem("category"))),
    )
    return products
}
```

## API ids

The ids used in groups, settings, hooks, events and WebSocket subscriptions.

Schema APIs

- SCHEMA_GET_ALL
- SCHEMA_GET_ALL_STREAM
- SCHEMA_GET_BY_ID
- SCHEMA_POST_BULK_INSERT
- SCHEMA_MASTER_SAVE
- SCHEMA_ARRAY_OPERATIONS
- SCHEMA_UPDATE_MANY
- SCHEMA_PUT_UPDATE_BY_ID
- SCHEMA_PUT_REPLACE_BY_ID
- SCHEMA_DEL_DELETE_BY_ID
- SCHEMA_POST_QUERY
- SCHEMA_POST_QUERY_STREAM
- SCHEMA_POST_QUERY_DELETE
- SCHEMA_POST_AGGREGATE
- SCHEMA_POST_COUNT
- SCHEMA_GET_DISTINCT
- SCHEMA_POST_DISTINCT_QUERY

Generated APIs

- GEN_GET_ALL
- GEN_GET_ALL_STREAM
- GEN_GET_BY_ID
- GEN_POST_BULK_INSERT
- GEN_MASTER_SAVE
- GEN_ARRAY_OPERATIONS
- GEN_UPDATE_MANY
- GEN_PUT_UPDATE_BY_ID
- GEN_PUT_REPLACE_BY_ID
- GEN_DEL_DELETE_BY_ID
- GEN_POST_QUERY
- GEN_POST_QUERY_STREAM
- GEN_POST_QUERY_DELETE
- GEN_POST_AGGREGATE
- GEN_POST_COUNT
- GEN_GET_DISTINCT
- GEN_POST_DISTINCT_QUERY

System APIs

- EXECUTE_PLAIN_QUERY
- ENCRYPT_DATA
- DECRYPT_DATA
- HASH_DATA
- GET_TOKEN
- CALL_EXTERNAL_API
- GET_SECRET
- GET_REDIS_KEY
- SET_REDIS_KEY
- REMOVE_REDIS_KEY
- CUSTOM_USER_CACHING
- RESET_REDIS_CACHE_DB
- RESET_REDIS_CACHE_CUSTOM_APIS
- RESET_REDIS_CACHE_SYSTEM_APIS
- GET_TABLE_META
- CREATE_INDEXES
- DROP_INDEXES
- GET_INDEXES
- EMIT_EVENT
- EMIT_EVENT_WS
- IS_VALID_DATA_FOR_TABLE
- IS_VALID_DATA_FOR_CUSTOM_API
- MULTI_TENANT_INSTANCE_UPDATED
- IS_VALID_CONNECTION_STRING
