Add a mutation block to endpoint.json to make the endpoint writable. It's either false (explicitly disabled, same as omitting it) or a config object with a loadStrategy and a basePath.
| Name | Type |
|---|---|
| loadStrategyRequired | LoadStrategy |
Load strategy for the write pipeline. | |
| basePathRequired | string |
Base path for endpoint data. | |
| partitioning? | PartitioningValue |
Partitioning mode. true partitions by write timestamp, false disables partitioning, or a string for field-based/custom partitioning. true | |
| partitioningFormat? | string |
Partition path granularity. One of "year", "year/month", or "year/month/day". "year/month/day" | |
loadStrategy accepts one of three values: full_load, full_load_append, or append. Load strategies below defines each one. basePath is required for every one of them, even those that don't use it (see the note below).
Where the data goes #
basePath, partitioning, and partitioningFormat describe where inside the configured object store this endpoint's data lands and how it is laid out. They do not configure the store itself. The bucket, region, and credentials come from the files-sdk instance on the data source's writeConfig, not from the endpoint. For example, with basePath: "sales/orders" and timestamp partitioning, an append write lands at sales/orders/all.parquet/year=2026/month=08/day=29/<uuid>.parquet in whatever bucket the data source is wired to.
See Writing data for how the storage write strategy is configured and Partitioning for the full path layout.
Load strategies #
Set loadStrategy to one of three values. Each one picks how a write combines with the data already in the table:
-
append— keep the existing data and add the new records. -
full_load— replace the existing data with the new records. -
full_load_append— replace the latest snapshot and keep an appended history alongside it.
These are the config-facing meanings. For the full runtime behavior of each value, see Load strategies. It covers ordering, atomicity, partial writes, retries, and failure modes.
basePath is required by the mutation schema regardless of which write
strategy ends up handling the write. The basePath, partitioning, and
partitioningFormat fields are only meaningful for the storage write
strategy. full_load ignores partitioning, and the Trino adapter's INSERT INTO strategy ignores all three — it writes directly through SQL — but
basePath must still be present for the definition to validate.
Example #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21{
"version": "1.0",
"catalog": "hive",
"schema": "sales",
"tableName": "orders",
"dataSource": "warehouse",
"fields": [
{ "name": "id", "type": "Integer", "options": { "required": true } },
{
"name": "customerEmail",
"type": "String",
"options": { "required": true, "validations": [{ "type": "email" }] }
},
{ "name": "status", "type": "String", "options": { "readOnly": true } }
],
"mutation": {
"loadStrategy": "append",
"basePath": "sales/orders"
}
}
Generating this definition with create-endpoint also writes a mutation-schema.ts file and registers a mutation field in the GraphQL schema, alongside the query field every endpoint gets. See the mutations guide for how that field is authorized and resolved at runtime, or Set Up a Trino Mutation for the end-to-end task.